From 2ff92dd203888a4df5d876e9a104dc233445ae49 Mon Sep 17 00:00:00 2001 From: Marvin Roman <marvin@colab.coop> Date: Mon, 29 Jul 2024 13:18:50 -0700 Subject: [PATCH] Promote staging to production (#2235) * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * Add / edit deploy configuration * fix: split the healthcheck and external Node Ping paths (resolve #2042) (#2152) * ci: :construction_worker: changed internal healthcheck path * fix: create maintance mode exception paths that will bypass maintenance mode * ci: :construction_worker: added vite build to container * build: :construction_worker: removed npm build since it is redundant --------- Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * feat: enable searching for engagements (resolves #2079( (#2165) * fix: org url on project page goes to 404 * feat: browse engagements * test: remove seeders from engagement tests * style: remove trailing commas from json file * feat: engagements i've joined page * feat: my projects page only for organizations * test: update organization tests * chore(localization): update translations (#2179) * chore(localization): translate en.json into French, Canada * chore(localization): translate routes.php into French, Canada * chore(localization): translate en.json into French, Canada --------- Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * fix: php values breaking alpine model data (resolves #2180) (#2185) * fix: php values breaking alpine model data * fix: cannot remove other access need * fix: training module progress not recorded * test: fix tests for encoded urls in blade views fix: cannot remove other access need fix: training module progress not recorded * chore(deps): bump ralphjsmit/livewire-urls from 1.3.1 to 1.4.0 (#2186) Bumps [ralphjsmit/livewire-urls](https://github.com/ralphjsmit/livewire-urls) from 1.3.1 to 1.4.0. - [Release notes](https://github.com/ralphjsmit/livewire-urls/releases) - [Changelog](https://github.com/ralphjsmit/livewire-urls/blob/main/CHANGELOG.md) - [Commits](https://github.com/ralphjsmit/livewire-urls/compare/1.3.1...1.4.0) --- updated-dependencies: - dependency-name: ralphjsmit/livewire-urls dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump vite-plugin-static-copy from 1.0.1 to 1.0.2 (#2188) Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 1.0.1 to 1.0.2. - [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases) - [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md) - [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@1.0.1...vite-plugin-static-copy@1.0.2) --- updated-dependencies: - dependency-name: vite-plugin-static-copy dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump stylelint-plugin-logical-css from 1.0.0 to 1.2.0 (#2189) Bumps [stylelint-plugin-logical-css](https://github.com/yuschick/stylelint-plugin-logical-css) from 1.0.0 to 1.2.0. - [Commits](https://github.com/yuschick/stylelint-plugin-logical-css/commits) --- updated-dependencies: - dependency-name: stylelint-plugin-logical-css dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps-dev): bump postcss from 8.4.35 to 8.4.38 (#2191) Bumps [postcss](https://github.com/postcss/postcss) from 8.4.35 to 8.4.38. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.35...8.4.38) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps): bump spatie/laravel-options from 1.1.0 to 1.1.1 (#2187) Bumps [spatie/laravel-options](https://github.com/spatie/laravel-options) from 1.1.0 to 1.1.1. - [Release notes](https://github.com/spatie/laravel-options/releases) - [Changelog](https://github.com/spatie/laravel-options/blob/main/CHANGELOG.md) - [Commits](https://github.com/spatie/laravel-options/compare/1.1.0...1.1.1) --- updated-dependencies: - dependency-name: spatie/laravel-options dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps): bump @vimeo/player from 2.20.1 to 2.22.0 (#2192) Bumps [@vimeo/player](https://github.com/vimeo/player.js) from 2.20.1 to 2.22.0. - [Release notes](https://github.com/vimeo/player.js/releases) - [Commits](https://github.com/vimeo/player.js/compare/v2.20.1...v2.22.0) --- updated-dependencies: - dependency-name: "@vimeo/player" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps-dev): bump prettier from 3.0.3 to 3.2.5 (#2193) Bumps [prettier](https://github.com/prettier/prettier) from 3.0.3 to 3.2.5. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.0.3...3.2.5) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps): bump axlon/laravel-postal-code-validation from 3.5.0 to 3.6.0 (#2190) chore(deps): bump axlon/laravel-postal-code-validation Bumps [axlon/laravel-postal-code-validation](https://github.com/axlon/laravel-postal-code-validation) from 3.5.0 to 3.6.0. - [Release notes](https://github.com/axlon/laravel-postal-code-validation/releases) - [Changelog](https://github.com/axlon/laravel-postal-code-validation/blob/3.x/CHANGELOG.md) - [Commits](https://github.com/axlon/laravel-postal-code-validation/compare/v3.5.0...v3.6.0) --- updated-dependencies: - dependency-name: axlon/laravel-postal-code-validation dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps-dev): bump spatie/laravel-ray from 1.35.1 to 1.36.0 (#2194) Bumps [spatie/laravel-ray](https://github.com/spatie/laravel-ray) from 1.35.1 to 1.36.0. - [Release notes](https://github.com/spatie/laravel-ray/releases) - [Changelog](https://github.com/spatie/laravel-ray/blob/main/CHANGELOG.md) - [Commits](https://github.com/spatie/laravel-ray/compare/1.35.1...1.36.0) --- updated-dependencies: - dependency-name: spatie/laravel-ray dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> * chore(deps): bump filament/spatie-laravel-settings-plugin from 3.2.34 to 3.2.35 (#2195) chore(deps): bump filament/spatie-laravel-settings-plugin Bumps [filament/spatie-laravel-settings-plugin](https://github.com/filamentphp/spatie-laravel-settings-plugin) from 3.2.34 to 3.2.35. - [Commits](https://github.com/filamentphp/spatie-laravel-settings-plugin/compare/v3.2.34...v3.2.35) --- updated-dependencies: - dependency-name: filament/spatie-laravel-settings-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump vite from 5.1.5 to 5.1.7 (#2197) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.5 to 5.1.7. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v5.1.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.1.7/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: improved sign up/getting started workflow (resolves #2142) (#2184) * fix: prompt doesn't dismiss when action followed * feat: add link to rewatch introduction video * refactor: move prompts from getting started to dashboard * feat: new getting started flow for Individuals Work in progress, still missing tests, updates to interpretation files, and etc. * feat: consolidate application form * feat: update interpretation placeholder and seeder * chore(localization): run localization * style: fix trailing comma in json file * test: update tests * test: add test for individual getting started flow fix: prompt doesn't dismiss when action followed feat: add link to rewatch introduction video feat: consolidate application form * chore(localization): update translations (#2202) * fix: remove reference to ac_application and cc_application (resolves #2203) (#2205) * fix: estimate and agreement copy (resolves #2204) (#2206) * fix: estimate and agreement copy * fix: regulated organization contact info not displayed on public page fix: regulated organization contact info not displayed on public page * chore(localization): update translations (#2208) chore(localization): translate en.json into French, Canada * chore(release): release 1.4.0 (#2183) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * Promotion from dev to staging (#2234) * chore(deps-dev): bump pestphp/pest from 2.33.6 to 2.34.8 (#2230) * chore(deps-dev): bump pestphp/pest from 2.33.6 to 2.34.8 Bumps [pestphp/pest](https://github.com/pestphp/pest) from 2.33.6 to 2.34.8. - [Release notes](https://github.com/pestphp/pest/releases) - [Changelog](https://github.com/pestphp/pest/blob/2.x/RELEASE.md) - [Commits](https://github.com/pestphp/pest/compare/v2.33.6...v2.34.8) --- updated-dependencies: - dependency-name: pestphp/pest dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * build: fixed healthcheck for meilisearch * build: :bug: removed IP restrictions for local nginx status healthcheck --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Marvin Roman <marvin@colab.coop> * chore(deps-dev): bump vite from 5.1.7 to 5.3.2 (#2229) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.7 to 5.3.2. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v5.3.2/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump postcss-custom-media from 10.0.2 to 10.0.7 (#2228) Bumps [postcss-custom-media](https://github.com/csstools/postcss-plugins/tree/HEAD/plugins/postcss-custom-media) from 10.0.2 to 10.0.7. - [Changelog](https://github.com/csstools/postcss-plugins/blob/main/plugins/postcss-custom-media/CHANGELOG.md) - [Commits](https://github.com/csstools/postcss-plugins/commits/HEAD/plugins/postcss-custom-media) --- updated-dependencies: - dependency-name: postcss-custom-media dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump braces from 3.0.2 to 3.0.3 (#2227) Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3. - [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md) - [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3) --- updated-dependencies: - dependency-name: braces dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump stylelint from 16.2.0 to 16.6.1 (#2223) Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.2.0 to 16.6.1. - [Release notes](https://github.com/stylelint/stylelint/releases) - [Changelog](https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md) - [Commits](https://github.com/stylelint/stylelint/compare/16.2.0...16.6.1) --- updated-dependencies: - dependency-name: stylelint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump barryvdh/laravel-debugbar from 3.10.4 to 3.13.5 (#2222) Bumps [barryvdh/laravel-debugbar](https://github.com/barryvdh/laravel-debugbar) from 3.10.4 to 3.13.5. - [Release notes](https://github.com/barryvdh/laravel-debugbar/releases) - [Commits](https://github.com/barryvdh/laravel-debugbar/compare/v3.10.4...v3.13.5) --- updated-dependencies: - dependency-name: barryvdh/laravel-debugbar dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump postcss-logical from 7.0.0 to 7.0.1 (#2220) Bumps [postcss-logical](https://github.com/csstools/postcss-plugins/tree/HEAD/plugins/postcss-logical) from 7.0.0 to 7.0.1. - [Changelog](https://github.com/csstools/postcss-plugins/blob/main/plugins/postcss-logical/CHANGELOG.md) - [Commits](https://github.com/csstools/postcss-plugins/commits/HEAD/plugins/postcss-logical) --- updated-dependencies: - dependency-name: postcss-logical dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump husky from 8.0.3 to 9.0.11 (#2219) Bumps [husky](https://github.com/typicode/husky) from 8.0.3 to 9.0.11. - [Release notes](https://github.com/typicode/husky/releases) - [Commits](https://github.com/typicode/husky/compare/v8.0.3...v9.0.11) --- updated-dependencies: - dependency-name: husky dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump spatie/laravel-collection-macros from 7.13.1 to 7.14.1 (#2232) Bumps [spatie/laravel-collection-macros](https://github.com/spatie/laravel-collection-macros) from 7.13.1 to 7.14.1. - [Release notes](https://github.com/spatie/laravel-collection-macros/releases) - [Changelog](https://github.com/spatie/laravel-collection-macros/blob/main/CHANGELOG.md) - [Commits](https://github.com/spatie/laravel-collection-macros/compare/7.13.1...7.14.1) --- updated-dependencies: - dependency-name: spatie/laravel-collection-macros dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump codezero/laravel-unique-translation from 4.2.0 to 4.3.1 (#2211) chore(deps): bump codezero/laravel-unique-translation Bumps [codezero/laravel-unique-translation](https://github.com/codezero-be/laravel-unique-translation) from 4.2.0 to 4.3.1. - [Release notes](https://github.com/codezero-be/laravel-unique-translation/releases) - [Commits](https://github.com/codezero-be/laravel-unique-translation/compare/4.2.0...4.3.1) --- updated-dependencies: - dependency-name: codezero/laravel-unique-translation dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(localization): update translations (#2209) * chore(localization): translate en.json into French, Canada * chore(localization): translate en.json into French, Canada * chore(localization): translate en.json into French, Canada * chore(localization): translate en.json into French, Canada * chore(localization): translate en.json into French, Canada * chore(localization): translate en.json into French, Canada * chore: replaced single quote with apostrophe in translations * chore: replace double quote with typographers quotes * build: :wrench: updated so prettier ignores language files Prettier will remove from language files. * revert: reverted translation of a variable string --------- Co-authored-by: Marvin Roman <marvin@colab.coop> * chore(release): release 1.4.1 (#2231) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: The Accessibility Exchange <120509736+theaccessibilityexchange@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: Justin Obara <obara.justin@gmail.com> Co-authored-by: CoLab Kube Production V1 <devops@colab.coop> Co-authored-by: Justin Obara <jobara@users.noreply.github.com> Co-authored-by: The Accessibility Exchange <120509736+theaccessibilityexchange@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .kube/app/values.yaml | 3 +- .../accessibility-app/etc/nginx/nginx.conf | 9 +- .prettierignore | 1 + .release-please-manifest.json | 2 +- CHANGELOG.md | 58 + app/Enums/Compensation.php | 17 + app/Enums/EngagementSignUpStatus.php | 17 + app/Enums/ProjectInitiator.php | 17 + app/Enums/SeekingForEngagement.php | 19 + app/Filament/Pages/ManageGeneralSettings.php | 16 +- app/Http/Controllers/SettingsController.php | 4 + app/Http/Controllers/UserController.php | 4 +- .../Controllers/UserEngagementsController.php | 107 + .../Controllers/UserProjectsController.php | 83 +- .../PreventRequestsDuringMaintenance.php | 3 +- app/Http/Middleware/RedirectForOnboarding.php | 4 - ...{AllProjects.php => BrowseEngagements.php} | 55 +- app/Models/Engagement.php | 232 +++ app/Models/Individual.php | 4 + app/Models/Organization.php | 28 +- app/Models/Project.php | 3 +- app/Models/RegulatedOrganization.php | 25 +- app/Notifications/AgreementReceived.php | 2 +- app/Notifications/EstimateReturned.php | 2 +- app/Policies/EngagementPolicy.php | 20 + app/Policies/ProjectPolicy.php | 7 + app/Settings/GeneralSettings.php | 4 +- .../Notification/AgreementReceived.php | 4 +- .../Notification/EstimateReturned.php | 4 +- composer.json | 2 +- composer.lock | 1107 +++++------ database/factories/IndividualFactory.php | 3 +- database/factories/UserFactory.php | 3 +- database/seeders/TestDataSeeder.php | 224 ++- database/seeders/data/Interpretations.json | 404 ++-- ..._application_links_in_general_settings.php | 16 + docker-compose.local.yml | 73 +- package-lock.json | 1751 +++++++---------- package.json | 20 +- phpstan.neon.dist | 1 + resources/css/_props.css | 3 + resources/css/_tokens.css | 2 +- resources/css/components/_badge.css | 7 + resources/css/components/_getting-started.css | 22 + resources/css/routes/engagements/_index.css | 11 + resources/css/themes/_dark.css | 3 + resources/css/themes/_simple.css | 3 + resources/lang/en.json | 65 +- resources/lang/en/routes.php | 2 +- resources/lang/fr.json | 237 +-- resources/lang/fr/routes.php | 2 +- .../components/card/engagement.blade.php | 30 +- .../views/components/date-picker.blade.php | 2 +- resources/views/components/expander.blade.php | 4 +- .../views/components/interpretation.blade.php | 2 +- .../views/components/navigation.blade.php | 8 +- .../components/translatable-input.blade.php | 6 +- .../translatable-textarea.blade.php | 6 +- .../components/translation-picker.blade.php | 2 +- resources/views/courses/show.blade.php | 43 +- resources/views/dashboard.blade.php | 56 +- .../views/dashboard/getting-started.blade.php | 73 +- .../views/dashboard/individual.blade.php | 21 +- .../views/dashboard/organization.blade.php | 23 +- .../getting-started-individual.blade.php | 279 +-- .../getting-started-organization.blade.php | 38 +- .../regulated-organization.blade.php | 4 +- resources/views/engagements/joined.blade.php | 42 + .../engagements/joined/contracted.blade.php | 23 + .../joined/participating.blade.php | 23 + .../show-criteria-selection.blade.php | 8 +- resources/views/engagements/show.blade.php | 14 +- resources/views/engagements/sign-up.blade.php | 3 +- ...ion-and-consultation-preferences.blade.php | 2 +- .../admin-estimates-and-agreements.blade.php | 4 +- ...blade.php => browse-engagements.blade.php} | 91 +- .../manage-engagement-connector.blade.php | 4 +- .../views/livewire/module-content.blade.php | 6 +- resources/views/livewire/prompt.blade.php | 2 +- .../views/livewire/theme-switcher.blade.php | 2 +- resources/views/projects/edit/1.blade.php | 2 +- .../views/projects/my-projects.blade.php | 112 +- .../projects/my-projects/contracted.blade.php | 60 - .../my-projects/participating.blade.php | 60 - .../projects/my-projects/running.blade.php | 21 +- .../project-and-engagements.blade.php | 4 +- .../projects/show-context-selection.blade.php | 2 +- resources/views/projects/show.blade.php | 14 +- .../partials/contact-information.blade.php | 11 + .../regulated-organizations/show.blade.php | 12 + .../views/settings/access-needs.blade.php | 6 +- ...ion-and-consultation-preferences.blade.php | 4 +- .../settings/payment-information.blade.php | 2 +- .../views/users/show-introduction.blade.php | 8 +- routes/engagements.php | 24 + routes/projects.php | 29 +- routes/regulated-organizations.php | 4 + tests/Datasets/BrowseEngagementsFormat.php | 37 + tests/Datasets/IndividualIsReady.php | 10 + tests/Feature/DashboardTest.php | 155 +- tests/Feature/EngagementTest.php | 983 ++++++++- tests/Feature/{ => Filament}/SettingsTest.php | 10 +- tests/Feature/IndividualTest.php | 90 +- tests/Feature/Livewire/AllProjectsTest.php | 476 ----- .../Livewire/BrowseEngagementsTest.php | 539 +++++ .../Livewire/EstimatesAndAgreementsTest.php | 10 +- tests/Feature/NotificationsTest.php | 12 +- tests/Feature/OrganizationTest.php | 4 +- tests/Feature/ProjectTest.php | 256 +-- tests/Feature/RegulatedOrganizationTest.php | 9 +- tests/Feature/SuspensionTest.php | 2 +- tests/Feature/UserSettingsTest.php | 38 + tests/Feature/UserTest.php | 9 +- .../View/Components/InterpretationTest.php | 4 +- 114 files changed, 4982 insertions(+), 3573 deletions(-) create mode 100644 app/Enums/Compensation.php create mode 100644 app/Enums/EngagementSignUpStatus.php create mode 100644 app/Enums/ProjectInitiator.php create mode 100644 app/Enums/SeekingForEngagement.php create mode 100644 app/Http/Controllers/UserEngagementsController.php rename app/Livewire/{AllProjects.php => BrowseEngagements.php} (68%) create mode 100644 database/settings/2024_04_11_190038_consolidate_application_links_in_general_settings.php create mode 100644 resources/css/routes/engagements/_index.css create mode 100644 resources/views/engagements/joined.blade.php create mode 100644 resources/views/engagements/joined/contracted.blade.php create mode 100644 resources/views/engagements/joined/participating.blade.php rename resources/views/livewire/{all-projects.blade.php => browse-engagements.blade.php} (76%) delete mode 100644 resources/views/projects/my-projects/contracted.blade.php delete mode 100644 resources/views/projects/my-projects/participating.blade.php create mode 100644 resources/views/regulated-organizations/partials/contact-information.blade.php create mode 100644 tests/Datasets/BrowseEngagementsFormat.php rename tests/Feature/{ => Filament}/SettingsTest.php (69%) delete mode 100644 tests/Feature/Livewire/AllProjectsTest.php create mode 100644 tests/Feature/Livewire/BrowseEngagementsTest.php diff --git a/.kube/app/values.yaml b/.kube/app/values.yaml index 10e9ad018..bda62de27 100644 --- a/.kube/app/values.yaml +++ b/.kube/app/values.yaml @@ -1,5 +1,6 @@ name: "IRIS Accessibility Exchange" -health: / +health: /status/db +nodeHealth: / cronjobs: - name: schedule schedule: "* * * * *" diff --git a/.local-deploy/accessibility-app/etc/nginx/nginx.conf b/.local-deploy/accessibility-app/etc/nginx/nginx.conf index 37c1d3439..c06814bf2 100644 --- a/.local-deploy/accessibility-app/etc/nginx/nginx.conf +++ b/.local-deploy/accessibility-app/etc/nginx/nginx.conf @@ -33,10 +33,11 @@ http { location /nginx_status { stub_status on; - allow 127.0.0.1; - allow 10.0.0.0/8; - allow 172.0.0.0/8; - deny all; + # don't need ip restrictions for local testing + # allow 127.0.0.1; + # allow 10.0.0.0/8; + # allow 172.0.0.0/8; + # deny all; } include /etc/nginx/includes/laravel.conf; diff --git a/.prettierignore b/.prettierignore index 6e2a4350c..4df482286 100644 --- a/.prettierignore +++ b/.prettierignore @@ -2,3 +2,4 @@ resources/views/mail/**/*.blade.php resources/views/vendor/mail/**/*.blade.php resources/views/vendor/notifications/**/*.blade.php +resources/lang/*.json diff --git a/.release-please-manifest.json b/.release-please-manifest.json index ce1dad62b..ce276fa1e 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.3.4" + ".": "1.4.1" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a6789b91..5bfacec24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,63 @@ # Changelog +## [1.4.1](https://github.com/accessibility-exchange/platform/compare/v1.4.0...v1.4.1) (2024-07-23) + + +### Miscellaneous Chores + +* **deps-dev:** bump barryvdh/laravel-debugbar from 3.10.4 to 3.13.5 ([#2222](https://github.com/accessibility-exchange/platform/issues/2222)) ([97b2120](https://github.com/accessibility-exchange/platform/commit/97b212095e39a15be0a085b46c3cdfbbfeaca5cd)) +* **deps-dev:** bump braces from 3.0.2 to 3.0.3 ([#2227](https://github.com/accessibility-exchange/platform/issues/2227)) ([a9b7fef](https://github.com/accessibility-exchange/platform/commit/a9b7fef2831e5f07ac1596c176955987c78d5947)) +* **deps-dev:** bump husky from 8.0.3 to 9.0.11 ([#2219](https://github.com/accessibility-exchange/platform/issues/2219)) ([6002553](https://github.com/accessibility-exchange/platform/commit/600255344c7da363ed9e6abeec185d845e0315b6)) +* **deps-dev:** bump pestphp/pest from 2.33.6 to 2.34.8 ([#2230](https://github.com/accessibility-exchange/platform/issues/2230)) ([b002f1a](https://github.com/accessibility-exchange/platform/commit/b002f1af56580dd9cee026849937b5c4462eee45)) +* **deps-dev:** bump postcss-custom-media from 10.0.2 to 10.0.7 ([#2228](https://github.com/accessibility-exchange/platform/issues/2228)) ([4c87172](https://github.com/accessibility-exchange/platform/commit/4c8717214437450fd278568e04662880afa4f530)) +* **deps-dev:** bump postcss-logical from 7.0.0 to 7.0.1 ([#2220](https://github.com/accessibility-exchange/platform/issues/2220)) ([2a64c75](https://github.com/accessibility-exchange/platform/commit/2a64c7591c49a1bf1e7de3211477c72fce520724)) +* **deps-dev:** bump stylelint from 16.2.0 to 16.6.1 ([#2223](https://github.com/accessibility-exchange/platform/issues/2223)) ([af0a60d](https://github.com/accessibility-exchange/platform/commit/af0a60dba2de4def6455a36dcd748c378b53ee1e)) +* **deps-dev:** bump vite from 5.1.7 to 5.3.2 ([#2229](https://github.com/accessibility-exchange/platform/issues/2229)) ([dd58001](https://github.com/accessibility-exchange/platform/commit/dd580018a58ac923f51d7ffd098dc92c72a95632)) +* **deps:** bump codezero/laravel-unique-translation from 4.2.0 to 4.3.1 ([#2211](https://github.com/accessibility-exchange/platform/issues/2211)) ([0ba4b94](https://github.com/accessibility-exchange/platform/commit/0ba4b94a0701b1316d9aa494f9a911e1a8baff92)) +* **deps:** bump spatie/laravel-collection-macros from 7.13.1 to 7.14.1 ([#2232](https://github.com/accessibility-exchange/platform/issues/2232)) ([421fbea](https://github.com/accessibility-exchange/platform/commit/421fbea80104daff912d3ee6b443bd8e1188960d)) +* **localization:** update translations ([#2209](https://github.com/accessibility-exchange/platform/issues/2209)) ([4bf3c36](https://github.com/accessibility-exchange/platform/commit/4bf3c36eb37db65beaedc30bc784ec4651a774bc)) + +## [1.4.0](https://github.com/accessibility-exchange/platform/compare/v1.3.4...v1.4.0) (2024-04-17) + + +### Features + +* add link to rewatch introduction video ([65dc0dc](https://github.com/accessibility-exchange/platform/commit/65dc0dcb8ae404fd366f9a568ade16026d8d83ac)) +* consolidate application form ([65dc0dc](https://github.com/accessibility-exchange/platform/commit/65dc0dcb8ae404fd366f9a568ade16026d8d83ac)) +* enable searching for engagements (resolves [#2079](https://github.com/accessibility-exchange/platform/issues/2079)( ([#2165](https://github.com/accessibility-exchange/platform/issues/2165)) ([550f3f9](https://github.com/accessibility-exchange/platform/commit/550f3f933f600aa032a9ade2b8876dbe42e80c4c)) +* improved sign up/getting started workflow (resolves [#2142](https://github.com/accessibility-exchange/platform/issues/2142)) ([#2184](https://github.com/accessibility-exchange/platform/issues/2184)) ([65dc0dc](https://github.com/accessibility-exchange/platform/commit/65dc0dcb8ae404fd366f9a568ade16026d8d83ac)) + + +### Bug Fixes + +* cannot remove other access need ([8bbc547](https://github.com/accessibility-exchange/platform/commit/8bbc54757d5559d59460fd684cf9315f5a54aab0)) +* estimate and agreement copy (resolves [#2204](https://github.com/accessibility-exchange/platform/issues/2204)) ([#2206](https://github.com/accessibility-exchange/platform/issues/2206)) ([2f793ba](https://github.com/accessibility-exchange/platform/commit/2f793bacbc77469edb0a14ed024b99a0bcd53073)) +* php values breaking alpine model data (resolves [#2180](https://github.com/accessibility-exchange/platform/issues/2180)) ([#2185](https://github.com/accessibility-exchange/platform/issues/2185)) ([8bbc547](https://github.com/accessibility-exchange/platform/commit/8bbc54757d5559d59460fd684cf9315f5a54aab0)) +* prompt doesn't dismiss when action followed ([65dc0dc](https://github.com/accessibility-exchange/platform/commit/65dc0dcb8ae404fd366f9a568ade16026d8d83ac)) +* regulated organization contact info not displayed on public page ([2f793ba](https://github.com/accessibility-exchange/platform/commit/2f793bacbc77469edb0a14ed024b99a0bcd53073)) +* remove reference to ac_application and cc_application (resolves [#2203](https://github.com/accessibility-exchange/platform/issues/2203)) ([#2205](https://github.com/accessibility-exchange/platform/issues/2205)) ([5560fa9](https://github.com/accessibility-exchange/platform/commit/5560fa9b3ae3c71be85d12d6ce9e7d5dd856450a)) +* split the healthcheck and external Node Ping paths (resolve [#2042](https://github.com/accessibility-exchange/platform/issues/2042)) ([#2152](https://github.com/accessibility-exchange/platform/issues/2152)) ([ba1c04d](https://github.com/accessibility-exchange/platform/commit/ba1c04db8f5550d78f8e1a2d3a807a8c1032f15f)) +* training module progress not recorded ([8bbc547](https://github.com/accessibility-exchange/platform/commit/8bbc54757d5559d59460fd684cf9315f5a54aab0)) + + +### Miscellaneous Chores + +* **deps-dev:** bump postcss from 8.4.35 to 8.4.38 ([#2191](https://github.com/accessibility-exchange/platform/issues/2191)) ([dbff3c2](https://github.com/accessibility-exchange/platform/commit/dbff3c2896a715fae4b14f1891003cbf8d22cc7a)) +* **deps-dev:** bump prettier from 3.0.3 to 3.2.5 ([#2193](https://github.com/accessibility-exchange/platform/issues/2193)) ([e2a4007](https://github.com/accessibility-exchange/platform/commit/e2a400772811ea564efbac10d8f550d316ef8db9)) +* **deps-dev:** bump spatie/laravel-ray from 1.35.1 to 1.36.0 ([#2194](https://github.com/accessibility-exchange/platform/issues/2194)) ([ac8c0c4](https://github.com/accessibility-exchange/platform/commit/ac8c0c483d0d389ba280e80b639010122049f100)) +* **deps-dev:** bump stylelint-plugin-logical-css from 1.0.0 to 1.2.0 ([#2189](https://github.com/accessibility-exchange/platform/issues/2189)) ([f5ba3c0](https://github.com/accessibility-exchange/platform/commit/f5ba3c014f98b6fa13f1d6da0f15f64188fcb387)) +* **deps-dev:** bump vite from 5.1.5 to 5.1.7 ([#2197](https://github.com/accessibility-exchange/platform/issues/2197)) ([c6010e2](https://github.com/accessibility-exchange/platform/commit/c6010e2240ed7899581feb46f1f1d5503d8a5be8)) +* **deps-dev:** bump vite-plugin-static-copy from 1.0.1 to 1.0.2 ([#2188](https://github.com/accessibility-exchange/platform/issues/2188)) ([1ed6f67](https://github.com/accessibility-exchange/platform/commit/1ed6f67f2f229aaf144cbafdf4f437cb089942b8)) +* **deps:** bump @vimeo/player from 2.20.1 to 2.22.0 ([#2192](https://github.com/accessibility-exchange/platform/issues/2192)) ([eaaa6c1](https://github.com/accessibility-exchange/platform/commit/eaaa6c1fa08b4d3a848671552c629a669fb4b440)) +* **deps:** bump axlon/laravel-postal-code-validation from 3.5.0 to 3.6.0 ([#2190](https://github.com/accessibility-exchange/platform/issues/2190)) ([45d4f5b](https://github.com/accessibility-exchange/platform/commit/45d4f5b239797acd21f64a1e5c61df5d195b612a)) +* **deps:** bump filament/spatie-laravel-settings-plugin from 3.2.34 to 3.2.35 ([#2195](https://github.com/accessibility-exchange/platform/issues/2195)) ([381ce30](https://github.com/accessibility-exchange/platform/commit/381ce30ce137ff233d3f3981bf039f5f8478256b)) +* **deps:** bump ralphjsmit/livewire-urls from 1.3.1 to 1.4.0 ([#2186](https://github.com/accessibility-exchange/platform/issues/2186)) ([22778c1](https://github.com/accessibility-exchange/platform/commit/22778c134f74e07b4bbcfef9324b57044b7e495b)) +* **deps:** bump spatie/laravel-options from 1.1.0 to 1.1.1 ([#2187](https://github.com/accessibility-exchange/platform/issues/2187)) ([65417ac](https://github.com/accessibility-exchange/platform/commit/65417accfc033077a61c6804c73af5b181672db6)) +* **localization:** translate en.json into French, Canada ([3970b67](https://github.com/accessibility-exchange/platform/commit/3970b67851710b7c7ab84213ade0d240e503686c)) +* **localization:** update translations ([#2179](https://github.com/accessibility-exchange/platform/issues/2179)) ([94ff3fe](https://github.com/accessibility-exchange/platform/commit/94ff3fed4ced057c662fce95d5e239e108bda6cb)) +* **localization:** update translations ([#2202](https://github.com/accessibility-exchange/platform/issues/2202)) ([b716df0](https://github.com/accessibility-exchange/platform/commit/b716df0617e7f2a9f1074a8df8447efa6f4a510f)) +* **localization:** update translations ([#2208](https://github.com/accessibility-exchange/platform/issues/2208)) ([3970b67](https://github.com/accessibility-exchange/platform/commit/3970b67851710b7c7ab84213ade0d240e503686c)) + ## [1.3.4](https://github.com/accessibility-exchange/platform/compare/v1.3.3...v1.3.4) (2024-03-21) diff --git a/app/Enums/Compensation.php b/app/Enums/Compensation.php new file mode 100644 index 000000000..760897856 --- /dev/null +++ b/app/Enums/Compensation.php @@ -0,0 +1,17 @@ +<?php + +namespace App\Enums; + +enum Compensation: string +{ + case Paid = 'paid'; + case Volunteer = 'volunteer'; + + public static function labels(): array + { + return [ + 'paid' => __('Paid'), + 'volunteer' => __('Volunteer'), + ]; + } +} diff --git a/app/Enums/EngagementSignUpStatus.php b/app/Enums/EngagementSignUpStatus.php new file mode 100644 index 000000000..1a5fadab7 --- /dev/null +++ b/app/Enums/EngagementSignUpStatus.php @@ -0,0 +1,17 @@ +<?php + +namespace App\Enums; + +enum EngagementSignUpStatus: string +{ + case Open = 'open'; + case Closed = 'closed'; + + public static function labels(): array + { + return [ + 'open' => __('Open'), + 'closed' => __('Closed'), + ]; + } +} diff --git a/app/Enums/ProjectInitiator.php b/app/Enums/ProjectInitiator.php new file mode 100644 index 000000000..4554fe988 --- /dev/null +++ b/app/Enums/ProjectInitiator.php @@ -0,0 +1,17 @@ +<?php + +namespace App\Enums; + +enum ProjectInitiator: string +{ + case Organization = 'organization'; + case RegulatedOrganization = 'regulated-organization'; + + public static function labels(): array + { + return [ + 'organization' => __('Community organization'), + 'regulated-organization' => __('Regulated organization'), + ]; + } +} diff --git a/app/Enums/SeekingForEngagement.php b/app/Enums/SeekingForEngagement.php new file mode 100644 index 000000000..c6a31f186 --- /dev/null +++ b/app/Enums/SeekingForEngagement.php @@ -0,0 +1,19 @@ +<?php + +namespace App\Enums; + +enum SeekingForEngagement: string +{ + case Participants = 'participants'; + case Connectors = 'connectors'; + case Organizations = 'organizations'; + + public static function labels(): array + { + return [ + 'participants' => __('Seeking Individual Consultation Participants'), + 'connectors' => __('Seeking Community Connectors'), + 'organizations' => __('Seeking Community Organizations to consult with'), + ]; + } +} diff --git a/app/Filament/Pages/ManageGeneralSettings.php b/app/Filament/Pages/ManageGeneralSettings.php index fe83cfb7c..86f2e5359 100644 --- a/app/Filament/Pages/ManageGeneralSettings.php +++ b/app/Filament/Pages/ManageGeneralSettings.php @@ -104,23 +104,13 @@ public function form(Form $form): Form ->label(get_language_exonym('fr')) ->activeUrl(), ]), - Fieldset::make(__('Accessibility consultant application')) + Fieldset::make(__('Accessibility Consultant and Community Connector application')) ->schema([ - TextInput::make('ac_application.en') + TextInput::make('ac_cc_application.en') ->label(get_language_exonym('en')) ->required() ->activeUrl(), - TextInput::make('ac_application.fr') - ->label(get_language_exonym('fr')) - ->activeUrl(), - ]), - Fieldset::make(__('Community connector application')) - ->schema([ - TextInput::make('cc_application.en') - ->label(get_language_exonym('en')) - ->required() - ->activeUrl(), - TextInput::make('cc_application.fr') + TextInput::make('ac_cc_application.fr') ->label(get_language_exonym('fr')) ->activeUrl(), ]), diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php index 495034ff2..0306662ba 100644 --- a/app/Http/Controllers/SettingsController.php +++ b/app/Http/Controllers/SettingsController.php @@ -114,6 +114,10 @@ public function updateAccessNeeds(UpdateAccessNeedsRequest $request): RedirectRe $individual = Auth::user()->individual; + if (! $data['other']) { + $data['other_access_need'] = null; + } + if (! isset($data['meeting_access_needs']) || (isset($data['meeting_access_needs']) && ! in_array($signLanguageInterpretation, $data['meeting_access_needs']))) { $data['signed_language_for_interpretation'] = null; } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 0baffcb82..68702bb96 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -51,7 +51,7 @@ public function showIntroduction(): View $user = Auth::user(); $skipTo = match ($user->context) { - 'individual' => localized_route('individuals.show-role-selection'), + 'individual' => localized_route('dashboard'), 'organization' => $user->extra_attributes->get('invitation') ? localized_route('dashboard') : localized_route('organizations.show-type-selection'), 'regulated-organization' => $user->extra_attributes->get('invitation') ? localized_route('dashboard') : localized_route('regulated-organizations.show-type-selection'), default => localized_route('dashboard'), @@ -76,7 +76,7 @@ public function updateIntroductionStatus(UpdateUserIntroductionStatusRequest $re $user->save(); $redirectTo = match (Auth::user()->context) { - 'individual' => localized_route('individuals.show-role-selection'), + 'individual' => localized_route('dashboard'), 'organization' => $user->extra_attributes->get('invitation') ? localized_route('dashboard') : localized_route('organizations.show-type-selection'), 'regulated-organization' => $user->extra_attributes->get('invitation') ? localized_route('dashboard') : localized_route('regulated-organizations.show-type-selection'), default => localized_route('dashboard'), diff --git a/app/Http/Controllers/UserEngagementsController.php b/app/Http/Controllers/UserEngagementsController.php new file mode 100644 index 000000000..d2b0fe5f5 --- /dev/null +++ b/app/Http/Controllers/UserEngagementsController.php @@ -0,0 +1,107 @@ +<?php + +namespace App\Http\Controllers; + +use App\Enums\ProjectInvolvement; +use App\Enums\UserContext; +use App\Models\User; +use Illuminate\Contracts\View\View; +use Illuminate\Http\RedirectResponse; +use Illuminate\Http\Response; +use Illuminate\Support\Facades\Auth; + +class UserEngagementsController extends Controller +{ + public function show(): Response|View|RedirectResponse + { + $user = Auth::user(); + + if ($user->context === UserContext::Organization->value && ! $user->organization) { + return redirect(localized_route('organizations.show-type-selection')); + } + + if ($this->isParticipant($user)) { + $section = ProjectInvolvement::Participating->value; + $activeEngagements = $user->{$user->context}->engagements()->active()->get(); + $completeEngagements = $user->{$user->context}->engagements()->complete()->get(); + } elseif ($this->isConnector($user)) { + $section = ProjectInvolvement::Contracted->value; + $activeEngagements = $user->{$user->context}->connectingEngagements()->active()->get(); + $completeEngagements = $user->{$user->context}->connectingEngagements()->complete()->get(); + } else { + abort(404); + } + + return view('engagements.joined', [ + 'section' => $section ?? '', + 'showParticipating' => $this->isParticipant($user), + 'showConnecting' => $this->isConnector($user), + 'activeEngagements' => $activeEngagements ?? [], + 'completeEngagements' => $completeEngagements ?? [], + ]); + } + + public function showContracted(): Response|View|RedirectResponse + { + $user = Auth::user(); + + if ($user->context === UserContext::Organization->value && ! $user->organization) { + return redirect(localized_route('organizations.show-type-selection')); + } + + if ($this->isConnector($user)) { + $activeEngagements = $user->{$user->context}->connectingEngagements()->active()->get(); + $completeEngagements = $user->{$user->context}->connectingEngagements()->complete()->get(); + + return view('engagements.joined', [ + 'title' => __('Engagements I’ve joined as a Community Connector'), + 'section' => 'contracted', + 'showParticipating' => $this->isParticipant($user), + 'showConnecting' => true, + 'activeEngagements' => $activeEngagements, + 'completeEngagements' => $completeEngagements, + ]); + } + + abort(404); + } + + public function showParticipating(): Response|View|RedirectResponse + { + $user = Auth::user(); + + if ($user->context === UserContext::Organization->value && ! $user->organization) { + return redirect(localized_route('organizations.show-type-selection')); + } + + if ($this->isParticipant($user)) { + $activeEngagements = $user->{$user->context}->engagements()->active()->get(); + $completeEngagements = $user->{$user->context}->engagements()->complete()->get(); + + return view('engagements.joined', [ + 'title' => __('Engagements I’ve joined as a Consultation Participant'), + 'section' => 'participating', + 'showParticipating' => true, + 'showConnecting' => $this->isConnector($user), + 'activeEngagements' => $activeEngagements, + 'completeEngagements' => $completeEngagements, + ]); + } + + abort(404); + } + + public function isParticipant(User $user): bool + { + $userContext = $user->{$user->context}; + + return $userContext && ($userContext->isParticipant() || $userContext->engagements()->count()); + } + + public function isConnector(User $user): bool + { + $userContext = $user->{$user->context}; + + return $userContext && ($userContext->isConnector() || $userContext->connectingEngagements()->count()); + } +} diff --git a/app/Http/Controllers/UserProjectsController.php b/app/Http/Controllers/UserProjectsController.php index 27b6020f1..5da1a907d 100644 --- a/app/Http/Controllers/UserProjectsController.php +++ b/app/Http/Controllers/UserProjectsController.php @@ -2,9 +2,7 @@ namespace App\Http\Controllers; -use App\Enums\ProjectInvolvement; use App\Enums\UserContext; -use App\Models\User; use Illuminate\Contracts\View\View; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response; @@ -27,17 +25,7 @@ public function show(): Response|View|RedirectResponse if ($user->regulated_organization) { $projectable = $user->regulated_organization; $projectable->load('projects'); - } - - if ($this->isIndividualOrOrganizationUser($user)) { - if ($this->isParticipant($user)) { - $section = ProjectInvolvement::Participating->value; - } elseif ($this->isContractor($user)) { - $section = ProjectInvolvement::Contracted->value; - } - } - - if ($user->organization) { + } elseif ($user->organization) { $projectable = $user->organization; if (! $projectable->isConsultant() && ! $projectable->isParticipant() && ! $projectable->isConnector()) { $projectable->load('projects'); @@ -47,75 +35,6 @@ public function show(): Response|View|RedirectResponse return view('projects.my-projects', [ 'user' => $user, 'projectable' => $projectable ?? null, - 'section' => $section ?? null, ]); } - - public function showContracted(): Response|View - { - $user = Auth::user(); - - if ($this->isIndividualOrOrganizationUser($user)) { - if ($this->isContractor($user)) { - return view('projects.my-projects', [ - 'user' => $user, - 'projectable' => $user->organization, - 'section' => 'contracted', - ]); - } - } - - abort(404); - } - - public function showParticipating(): Response|View - { - $user = Auth::user(); - - if ($this->isIndividualOrOrganizationUser($user)) { - if ($this->isParticipant($user)) { - return view('projects.my-projects', [ - 'user' => $user, - 'projectable' => $user->organization, - 'section' => 'participating', - ]); - } - } - - abort(404); - } - - public function showRunning(): Response|View - { - $user = Auth::user(); - - if (in_array($user->context, [UserContext::Organization->value, UserContext::RegulatedOrganization->value]) && $user->{$user->context}) { - return view('projects.my-projects', [ - 'user' => $user, - 'projectable' => $user->regulated_organization ?? $user->organization, - 'section' => ProjectInvolvement::Running->value, - ]); - } - - abort(404); - } - - public function isParticipant(User $user): bool - { - $userContext = $user->{$user->context}; - - return $userContext && ($userContext->isParticipant() || $userContext->inProgressParticipatingProjects()->count()); - } - - public function isContractor(User $user): bool - { - $userContext = $user->{$user->context}; - - return $userContext && ($userContext->isConsultant() || $userContext->isConnector() || $userContext->inProgressContractedProjects()->count()); - } - - public function isIndividualOrOrganizationUser(User $user): bool - { - return in_array($user->context, [UserContext::Individual->value, UserContext::Organization->value]); - } } diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php index 74cbd9a9e..36524b42b 100644 --- a/app/Http/Middleware/PreventRequestsDuringMaintenance.php +++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -12,6 +12,7 @@ class PreventRequestsDuringMaintenance extends Middleware * @var array<int, string> */ protected $except = [ - // + '/status/db', + '/status', ]; } diff --git a/app/Http/Middleware/RedirectForOnboarding.php b/app/Http/Middleware/RedirectForOnboarding.php index a4c794ec9..64b7d84d2 100644 --- a/app/Http/Middleware/RedirectForOnboarding.php +++ b/app/Http/Middleware/RedirectForOnboarding.php @@ -14,10 +14,6 @@ public function handle(Request $request, Closure $next): Response|RedirectRespon { $user = Auth::user(); - if ($user->context === 'individual' && empty($user->individual->roles)) { - return redirect(localized_route('individuals.show-role-selection')); - } - if ($user->context === 'regulated-organization' && ! $user->regulatedOrganization && $user->extra_attributes->get('invitation')) { return $next($request); } diff --git a/app/Livewire/AllProjects.php b/app/Livewire/BrowseEngagements.php similarity index 68% rename from app/Livewire/AllProjects.php rename to app/Livewire/BrowseEngagements.php index 83b87c18c..976ed31b5 100644 --- a/app/Livewire/AllProjects.php +++ b/app/Livewire/BrowseEngagements.php @@ -2,20 +2,26 @@ namespace App\Livewire; +use App\Enums\Compensation; +use App\Enums\EngagementFormat; use App\Enums\EngagementRecruitment; +use App\Enums\EngagementSignUpStatus; use App\Enums\IdentityCluster; use App\Enums\MeetingType; +use App\Enums\ProjectInitiator; use App\Enums\ProvinceOrTerritory; +use App\Enums\SeekingForEngagement; +use App\Models\Engagement; use App\Models\Identity; use App\Models\Impact; -use App\Models\Project; use App\Models\Sector; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\DB; use Livewire\Component; use Livewire\WithPagination; use Spatie\LaravelOptions\Options; -class AllProjects extends Component +class BrowseEngagements extends Component { use WithPagination; @@ -23,6 +29,8 @@ class AllProjects extends Component public array $statuses = []; + public array $formats = []; + public array $seekings = []; public array $seekingGroups = []; @@ -46,6 +54,7 @@ class AllProjects extends Component public function selectNone() { $this->statuses = []; + $this->formats = []; $this->seekings = []; $this->seekingGroups = []; $this->initiators = []; @@ -59,15 +68,26 @@ public function selectNone() public function render() { - return view('livewire.all-projects', [ - 'projects' => Project::status('published') + return view('livewire.browse-engagements', [ + 'engagements' => Engagement::with('project.projectable') + ->status('published') ->when($this->searchQuery, function ($query, $searchQuery) { $query->where(DB::raw('lower(name->"$.en")'), 'like', '%'.strtolower($searchQuery).'%') - ->orWhere(DB::raw('lower(name->"$.fr")'), 'like', '%'.strtolower($searchQuery).'%'); + ->orWhere(DB::raw('lower(name->"$.fr")'), 'like', '%'.strtolower($searchQuery).'%') + ->orWhereHas('project', function (Builder $projectQuery) use ($searchQuery) { + $projectQuery + ->whereHas('projectable', function (Builder $projectableQuery) use ($searchQuery) { + $projectableQuery->where(DB::raw('lower(name->"$.en")'), 'like', '%'.strtolower($searchQuery).'%') + ->orWhere(DB::raw('lower(name->"$.fr")'), 'like', '%'.strtolower($searchQuery).'%'); + }); + }); }) ->when($this->statuses, function ($query, $statuses) { $query->statuses($statuses); }) + ->when($this->formats, function ($query, $formats) { + $query->formats($formats); + }) ->when($this->seekings, function ($query, $seekings) { $query->seekings($seekings); }) @@ -97,33 +117,20 @@ public function render() }) ->orderBy('published_at', 'desc') ->paginate(20), - 'statusesData' => [ - ['value' => 'upcoming', 'label' => __('Upcoming')], - ['value' => 'inProgress', 'label' => __('In Progress')], - ['value' => 'completed', 'label' => __('Completed')], - ], - 'seekingsData' => [ - ['value' => 'participants', 'label' => __('Seeking Individual Consultation Participants')], - ['value' => 'connectors', 'label' => __('Seeking Community Connectors')], - ['value' => 'organizations', 'label' => __('Seeking Community Organizations to consult with')], - ], - 'initiatorsData' => [ - ['value' => 'organization', 'label' => __('Community organization')], - ['value' => 'regulatedOrganization', 'label' => __('Regulated organization')], - ], + 'statusesData' => Options::forEnum(EngagementSignUpStatus::class)->toArray(), + 'formatsData' => Options::forEnum(EngagementFormat::class)->toArray(), + 'seekingsData' => Options::forEnum(SeekingForEngagement::class)->toArray(), + 'initiatorsData' => Options::forEnum(ProjectInitiator::class)->toArray(), 'seekingGroupsData' => Options::forModels(Identity::query() ->whereJsonContains('clusters', IdentityCluster::DisabilityAndDeaf))->toArray(), 'meetingTypesData' => Options::forEnum(MeetingType::class)->toArray(), 'locationsData' => Options::forEnum(ProvinceOrTerritory::class)->toArray(), - 'compensationsData' => [ - ['value' => 'paid', 'label' => __('Paid')], - ['value' => 'volunteer', 'label' => __('Volunteer')], - ], + 'compensationsData' => Options::forEnum(Compensation::class)->toArray(), 'sectorsData' => Options::forModels(Sector::class)->toArray(), 'impactedAreasData' => Options::forModels(Impact::class)->toArray(), 'recruitmentMethodsData' => Options::forEnum(EngagementRecruitment::class)->toArray(), ]) - ->layout('layouts.app', ['bodyClass' => 'page', 'headerClass' => 'stack', 'pageWidth' => 'wide']); + ->layout('layouts.app', ['bodyClass' => 'page', 'headerClass' => 'stack full header--engagements', 'pageWidth' => 'wide']); } public function search() diff --git a/app/Models/Engagement.php b/app/Models/Engagement.php index 96993e040..090c31163 100644 --- a/app/Models/Engagement.php +++ b/app/Models/Engagement.php @@ -2,11 +2,17 @@ namespace App\Models; +use App\Enums\Compensation; use App\Enums\EngagementFormat; use App\Enums\EngagementRecruitment; +use App\Enums\EngagementSignUpStatus; use App\Enums\MeetingType; +use App\Enums\ProjectInitiator; +use App\Enums\SeekingForEngagement; use App\Models\Scopes\EngagementProjectableNotSuspendedScope; use App\Traits\HasSchemalessAttributes; +use Carbon\Carbon; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -412,4 +418,230 @@ public function meetings(): HasMany { return $this->hasMany(Meeting::class); } + + public function scopeStatuses($query, $statuses) + { + $method = 'where'; + + foreach (Arr::wrap($statuses) as $status) { + if ($status === EngagementSignUpStatus::Open->value) { + $query->$method('signup_by_date', '>', Carbon::now()); + } elseif ($status === EngagementSignUpStatus::Closed->value) { + $query->$method('signup_by_date', '<', Carbon::now()); + } + $method = 'orWhere'; + } + + return $query; + } + + public function scopeFormats($query, $formats) + { + $method = 'where'; + + foreach ($formats as $format) { + + $query->$method('format', $format); + + $method = 'orWhere'; + } + + return $query; + } + + public function scopeSeekings($query, $seekings) + { + $method = 'where'; + + foreach ($seekings as $seeking) { + if ($seeking === SeekingForEngagement::Participants->value) { + $query->$method('recruitment', 'open-call'); + } elseif ($seeking === SeekingForEngagement::Connectors->value) { + $query->$method(function (Builder $engagementQuery) { + $engagementQuery->withExtraAttributes('seeking_community_connector', true); + }); + } elseif ($seeking === SeekingForEngagement::Organizations->value) { + $query->$method('who', 'organization'); + } + $method = 'orWhere'; + } + + return $query; + } + + public function scopeInitiators($query, $initiators) + { + $method = 'whereHas'; + + foreach ($initiators as $initiator) { + if ($initiator === ProjectInitiator::Organization->value) { + $query->$method('project', function (Builder $projectQuery) { + $projectQuery->where('projectable_type', 'App\Models\Organization'); + }); + } elseif ($initiator === ProjectInitiator::RegulatedOrganization->value) { + $query->$method('project', function (Builder $projectQuery) { + $projectQuery->where('projectable_type', 'App\Models\RegulatedOrganization'); + }); + } + $method = 'orWhereHas'; + } + + return $query; + } + + public function scopeSeekingDisabilityAndDeafGroups($query, $seekingGroups) + { + $method = 'whereHas'; + + foreach ($seekingGroups as $seekingGroup) { + $query->$method('matchingStrategy', function (Builder $matchingStrategyQuery) use ($seekingGroup) { + $matchingStrategyQuery + ->whereHas('identities', function (Builder $criteriaQuery) use ($seekingGroup) { + $criteriaQuery->where('identity_id', $seekingGroup); + }) + ->orWhere('cross_disability_and_deaf', true); + }); + + $method = 'orWhereHas'; + } + + return $query; + } + + public function scopeMeetingTypes($query, $meetingTypes) + { + $method = 'where'; + + foreach ($meetingTypes as $meetingType) { + $query->$method(function (Builder $engagementQuery) use ($meetingType) { + $engagementQuery->whereIn('format', ['interviews', 'workshop', 'focus-group', 'other-sync']) + ->whereJsonContains('meeting_types', $meetingType) + ->orWhereHas('meetings', function (Builder $meetingQuery) use ($meetingType) { + $meetingQuery->whereJsonContains('meeting_types', $meetingType); + }); + }); + + $method = 'orWhere'; + } + + return $query; + } + + public function scopeCompensations($query, $compensations) + { + $method = 'where'; + + foreach ($compensations as $compensation) { + $query->$method('paid', $compensation === Compensation::Paid->value); + + $method = 'orWhere'; + } + + return $query; + } + + public function scopeSectors($query, $sectors) + { + $method = 'whereHas'; + + foreach ($sectors as $sector) { + $query->$method('project', function (Builder $projectQuery) use ($sector) { + $projectQuery->whereHas('projectable', function (Builder $projectableQuery) use ($sector) { + $projectableQuery->whereHas('sectors', function (Builder $sectorQuery) use ($sector) { + $sectorQuery->where('sector_id', $sector); + }); + }); + }); + + $method = 'orWhereHas'; + } + + return $query; + } + + public function scopeAreasOfImpact($query, $impacts) + { + $method = 'whereHas'; + + foreach ($impacts as $impact) { + $query->$method('project', function (Builder $projectQuery) use ($impact) { + $projectQuery->whereHas('impacts', function (Builder $impactQuery) use ($impact) { + $impactQuery->where('impact_id', $impact); + }); + }); + + $method = 'orWhereHas'; + } + + return $query; + } + + public function scopeRecruitmentMethods($query, $recruitmentMethods) + { + $method = 'where'; + + foreach ($recruitmentMethods as $recruitmentMethod) { + $query->$method('recruitment', $recruitmentMethod); + + $method = 'orWhere'; + } + + return $query; + } + + public function scopeLocations($query, $locations) + { + $method = 'whereHas'; + + foreach ($locations as $location) { + $query->$method('matchingStrategy', function (Builder $matchingStrategyQuery) use ($location) { + $matchingStrategyQuery->whereJsonContains('regions', $location) + ->orWhereJsonContains('locations', ['region' => $location]); + }); + + $method = 'orWhereHas'; + } + + return $query; + } + + public function scopeActive($query) + { + $query->whereHas('project', function (Builder $projectQuery) { + $projectQuery->where('end_date', '>', now()); + }) + ->where(function (Builder $engagementQuery) { + $engagementQuery->whereDoesntHave('meetings') + ->orWhereHas('meetings', function (Builder $meetingQuery) { + $meetingQuery->where('date', '>', now()); + }); + }) + ->where(function (Builder $engagementQuery) { + $engagementQuery->whereNull('complete_by_date') + ->orWhere('complete_by_date', '>', now()); + }) + ->where(function (Builder $engagementQuery) { + $engagementQuery->whereNull('window_end_date') + ->orWhere('window_end_date', '>', now()); + }); + + return $query; + } + + public function scopeComplete($query) + { + $query->whereHas('project', function (Builder $projectQuery) { + $projectQuery->where('end_date', '<', now()); + }) + ->orWhere(function (Builder $engagementQuery) { + $engagementQuery->whereHas('meetings') + ->whereDoesntHave('meetings', function (Builder $meetingQuery) { + $meetingQuery->where('date', '>', now()); + }); + }) + ->orWhere('complete_by_date', '<', now()) + ->orWhere('window_end_date', '<', now()); + + return $query; + } } diff --git a/app/Models/Individual.php b/app/Models/Individual.php index da39178e9..b18b47d2f 100644 --- a/app/Models/Individual.php +++ b/app/Models/Individual.php @@ -433,6 +433,10 @@ public function isReady(): bool return false; } + if (empty($this->roles)) { + return false; + } + if ($this->isParticipant() && $this->paymentTypes()->count() === 0 && blank($this->other_payment_type)) { return false; } diff --git a/app/Models/Organization.php b/app/Models/Organization.php index bcc25525a..46ff5a944 100644 --- a/app/Models/Organization.php +++ b/app/Models/Organization.php @@ -208,44 +208,30 @@ public function projects(): MorphMany public function draftProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereNull('published_at') - ->orderBy('start_date'); + return $this->projects()->status('draft'); } public function publishedProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereNotNull('published_at') - ->orderBy('start_date'); + return $this->projects()->status('published'); } public function inProgressProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('start_date', '<=', Carbon::now()) - ->where(function ($query) { - $query->whereDate('end_date', '>=', Carbon::now()) - ->orWhereNull('end_date'); - }) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('inProgress'); } public function completedProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('end_date', '<', Carbon::now()) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('completed'); } public function upcomingProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('start_date', '>', Carbon::now()) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('upcoming'); } - public function participatingEngagements(): HasMany + public function engagements(): HasMany { return $this->hasMany(Engagement::class); } @@ -253,7 +239,7 @@ public function participatingEngagements(): HasMany public function participatingProjects(): HasManyDeep { return $this->hasManyDeepFromRelations( - $this->participatingEngagements(), + $this->engagements(), (new Engagement())->project() ); } diff --git a/app/Models/Project.php b/app/Models/Project.php index 901d74474..d208eb8e5 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -19,6 +19,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notification; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\ValidationException; use Makeable\EloquentStatus\HasStatus; @@ -341,7 +342,7 @@ public function scopeStatuses($query, $statuses) { $method = 'where'; - foreach ($statuses as $status) { + foreach (Arr::wrap($statuses) as $status) { if ($status === 'upcoming') { $query->$method('start_date', '>', Carbon::now()); } elseif ($status === 'inProgress') { diff --git a/app/Models/RegulatedOrganization.php b/app/Models/RegulatedOrganization.php index 0f9072eb5..4b8927bff 100644 --- a/app/Models/RegulatedOrganization.php +++ b/app/Models/RegulatedOrganization.php @@ -8,7 +8,6 @@ use App\Traits\HasDisplayRegion; use App\Traits\HasMultimodalTranslations; use App\Traits\HasMultipageEditingAndPublishing; -use Carbon\Carbon; use Hearth\Traits\HasInvitations; use Hearth\Traits\HasMembers; use Illuminate\Contracts\Translation\HasLocalePreference; @@ -236,16 +235,12 @@ public function projects(): MorphMany public function draftProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereNull('published_at') - ->orderBy('start_date'); + return $this->projects()->status('draft'); } public function publishedProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereNotNull('published_at') - ->orderBy('start_date'); + return $this->projects()->status('published'); } /** @@ -253,13 +248,7 @@ public function publishedProjects(): MorphMany */ public function inProgressProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('start_date', '<=', Carbon::now()) - ->where(function ($query) { - $query->whereDate('end_date', '>=', Carbon::now()) - ->orWhereNull('end_date'); - }) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('inProgress'); } /** @@ -267,9 +256,7 @@ public function inProgressProjects(): MorphMany */ public function completedProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('end_date', '<', Carbon::now()) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('completed'); } /** @@ -277,9 +264,7 @@ public function completedProjects(): MorphMany */ public function upcomingProjects(): MorphMany { - return $this->morphMany(Project::class, 'projectable') - ->whereDate('start_date', '>', Carbon::now()) - ->orderBy('start_date'); + return $this->publishedProjects()->statuses('upcoming'); } /** diff --git a/app/Notifications/AgreementReceived.php b/app/Notifications/AgreementReceived.php index 28ed72ebe..bd36c602e 100644 --- a/app/Notifications/AgreementReceived.php +++ b/app/Notifications/AgreementReceived.php @@ -20,7 +20,7 @@ public function __construct(Project $project) public function toMail(Project $notifiable): MailMessage { return (new MailMessage) - ->subject(__('Your agreement has been received')) + ->subject(__('Your signed agreement has been received')) ->markdown( 'mail.agreement-received', [ diff --git a/app/Notifications/EstimateReturned.php b/app/Notifications/EstimateReturned.php index 64e4aa09d..fb1dd1ad2 100644 --- a/app/Notifications/EstimateReturned.php +++ b/app/Notifications/EstimateReturned.php @@ -20,7 +20,7 @@ public function __construct(Project $project) public function toMail(Project $notifiable): MailMessage { return (new MailMessage) - ->subject(__('Your estimate has been returned')) + ->subject(__('Engagement estimate has been submitted for your approval')) ->markdown( 'mail.estimate-returned', [ diff --git a/app/Policies/EngagementPolicy.php b/app/Policies/EngagementPolicy.php index f20484ce8..adf89f9b0 100644 --- a/app/Policies/EngagementPolicy.php +++ b/app/Policies/EngagementPolicy.php @@ -2,8 +2,10 @@ namespace App\Policies; +use App\Enums\UserContext; use App\Models\Engagement; use App\Models\User; +use App\Traits\UserCanViewOwnedContent; use App\Traits\UserCanViewPublishedContent; use Illuminate\Auth\Access\HandlesAuthorization; use Illuminate\Auth\Access\Response; @@ -11,6 +13,7 @@ class EngagementPolicy { use HandlesAuthorization; + use UserCanViewOwnedContent; use UserCanViewPublishedContent; public function before(User $user, string $ability): ?Response @@ -56,6 +59,23 @@ public function view(User $user, Engagement $engagement): Response : Response::denyAsNotFound(); } + public function viewAny(User $user): bool + { + return $this->canViewPublishedContent($user); + } + + public function viewJoined(User $user): Response + { + return ($user->context === UserContext::Individual->value || $user->context === UserContext::Organization->value) + ? Response::allow() + : Response::denyAsNotFound(); + } + + public function viewOwned(User $user): bool + { + return $this->canViewOwnedContent($user); + } + public function update(User $user, Engagement $engagement): Response { return $user->can('update', $engagement->project) diff --git a/app/Policies/ProjectPolicy.php b/app/Policies/ProjectPolicy.php index 4f48d5485..2d78318c2 100644 --- a/app/Policies/ProjectPolicy.php +++ b/app/Policies/ProjectPolicy.php @@ -34,6 +34,13 @@ public function viewOwned(User $user): bool return $this->canViewOwnedContent($user); } + public function viewRunning(User $user): Response + { + return $user->projectable + ? Response::allow() + : Response::denyAsNotFound(); + } + public function view(User $user, Project $project): Response { // User can't view project by organization or regulated organization which they have blocked. diff --git a/app/Settings/GeneralSettings.php b/app/Settings/GeneralSettings.php index 6f10d37f7..fa0175a57 100644 --- a/app/Settings/GeneralSettings.php +++ b/app/Settings/GeneralSettings.php @@ -28,9 +28,7 @@ class GeneralSettings extends Settings public array $fro_orientation; - public array $ac_application; - - public array $cc_application; + public array $ac_cc_application; public static function group(): string { diff --git a/app/View/Components/Notification/AgreementReceived.php b/app/View/Components/Notification/AgreementReceived.php index 774c33627..a9a6a1f3a 100644 --- a/app/View/Components/Notification/AgreementReceived.php +++ b/app/View/Components/Notification/AgreementReceived.php @@ -14,11 +14,11 @@ class AgreementReceived extends Notification public function __construct(DatabaseNotification $notification) { $this->project = Project::find($notification->data['project_id']); - $this->title = __('Your agreement has been received'); + $this->title = __('Your signed agreement has been received'); $this->body = safe_markdown('Your agreement has been received for **:project**. You can now publish your project page and engagement details.', [ 'project' => $this->project->getTranslation('name', locale()), ]); - $this->interpretation = __('Your agreement has been received', [], 'en'); + $this->interpretation = __('Your signed agreement has been received', [], 'en'); parent::__construct($notification); } diff --git a/app/View/Components/Notification/EstimateReturned.php b/app/View/Components/Notification/EstimateReturned.php index d680935fa..efdc3de0f 100644 --- a/app/View/Components/Notification/EstimateReturned.php +++ b/app/View/Components/Notification/EstimateReturned.php @@ -14,12 +14,12 @@ class EstimateReturned extends Notification public function __construct(DatabaseNotification $notification) { $this->project = Project::find($notification->data['project_id']); - $this->title = __('Your estimate has been returned'); + $this->title = __('Engagement estimate has been submitted for your approval'); $this->body = safe_markdown('Your estimate for **:project**, along with a project agreement for you to sign, has been sent to <:contact>.', [ 'project' => $this->project->getTranslation('name', locale()), 'contact' => $this->project->contact_person_email, ]); - $this->interpretation = __('Your estimate has been returned', [], 'en'); + $this->interpretation = __('Engagement estimate has been submitted for your approval', [], 'en'); parent::__construct($notification); } diff --git a/composer.json b/composer.json index 856017f4a..d22dfb757 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "framework", "laravel" ], - "version": "1.3.4", + "version": "1.4.1", "license": "BSD-3-Clause", "require": { "php": "^8.1", diff --git a/composer.lock b/composer.lock index 4a1ab7121..99e4be2d1 100644 --- a/composer.lock +++ b/composer.lock @@ -4,32 +4,32 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "759a7229cef03abae5075b97caf2585d", + "content-hash": "e931d401e2e1e43e523ff533bc4fd261", "packages": [ { "name": "anourvalar/eloquent-serialize", - "version": "1.2.17", + "version": "1.2.22", "source": { "type": "git", "url": "https://github.com/AnourValar/eloquent-serialize.git", - "reference": "1fcfdd5f41a0d2e7c8cf1d37e7227357bb827aef" + "reference": "6e91093c10940859c4b0549b6a90f18d8db45998" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/1fcfdd5f41a0d2e7c8cf1d37e7227357bb827aef", - "reference": "1fcfdd5f41a0d2e7c8cf1d37e7227357bb827aef", + "url": "https://api.github.com/repos/AnourValar/eloquent-serialize/zipball/6e91093c10940859c4b0549b6a90f18d8db45998", + "reference": "6e91093c10940859c4b0549b6a90f18d8db45998", "shasum": "" }, "require": { - "laravel/framework": "^6.0|^7.0|^8.0|^9.0|^10.0", - "php": "^7.1|^8.0" + "laravel/framework": "^8.0|^9.0|^10.0|^11.0", + "php": "^7.4|^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.26", "laravel/legacy-factories": "^1.1", - "orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0|^6.0|^7.0|^8.0", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^9.5|^10.5", "psalm/plugin-laravel": "^2.8", "squizlabs/php_codesniffer": "^3.7" }, @@ -68,9 +68,9 @@ ], "support": { "issues": "https://github.com/AnourValar/eloquent-serialize/issues", - "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.17" + "source": "https://github.com/AnourValar/eloquent-serialize/tree/1.2.22" }, - "time": "2023-12-06T15:54:01+00:00" + "time": "2024-03-22T12:56:46+00:00" }, { "name": "aws/aws-crt-php", @@ -223,29 +223,28 @@ }, { "name": "axlon/laravel-postal-code-validation", - "version": "v3.5.0", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/axlon/laravel-postal-code-validation.git", - "reference": "e8b0d70f0d2d00ca3f3b79f014d5dc1eaddd4746" + "reference": "acd390f129cfe61583fe765cb2a5e1efbd73eb7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/axlon/laravel-postal-code-validation/zipball/e8b0d70f0d2d00ca3f3b79f014d5dc1eaddd4746", - "reference": "e8b0d70f0d2d00ca3f3b79f014d5dc1eaddd4746", + "url": "https://api.github.com/repos/axlon/laravel-postal-code-validation/zipball/acd390f129cfe61583fe765cb2a5e1efbd73eb7d", + "reference": "acd390f129cfe61583fe765cb2a5e1efbd73eb7d", "shasum": "" }, "require": { - "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", - "illuminate/validation": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0", + "illuminate/contracts": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/support": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", + "illuminate/validation": "^5.5 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0 || ^11.0", "php": "^7.2 || ^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5 || ^7.0.1", - "mockery/mockery": "^1.3", - "phpunit/phpunit": "^8.5 || ^9.0 || ^10.0", - "symfony/var-exporter": "^4.0" + "guzzlehttp/guzzle": "^7.8", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5", + "symfony/var-exporter": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -284,9 +283,9 @@ ], "support": { "issues": "https://github.com/axlon/laravel-postal-code-validation/issues", - "source": "https://github.com/axlon/laravel-postal-code-validation/tree/v3.5.0" + "source": "https://github.com/axlon/laravel-postal-code-validation/tree/v3.6.0" }, - "time": "2024-01-24T21:58:02+00:00" + "time": "2024-03-12T16:24:01+00:00" }, { "name": "bacon/bacon-qr-code", @@ -812,24 +811,24 @@ }, { "name": "codezero/laravel-unique-translation", - "version": "4.2.0", + "version": "4.3.1", "source": { "type": "git", "url": "https://github.com/codezero-be/laravel-unique-translation.git", - "reference": "4c44849a2cff2b4418d1396be75f7b89f4554d03" + "reference": "a2daae936dbc3bf0658c8d13ec6a9f9ff20357b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/codezero-be/laravel-unique-translation/zipball/4c44849a2cff2b4418d1396be75f7b89f4554d03", - "reference": "4c44849a2cff2b4418d1396be75f7b89f4554d03", + "url": "https://api.github.com/repos/codezero-be/laravel-unique-translation/zipball/a2daae936dbc3bf0658c8d13ec6a9f9ff20357b1", + "reference": "a2daae936dbc3bf0658c8d13ec6a9f9ff20357b1", "shasum": "" }, "require": { "php": "^7.2|^8.0" }, "require-dev": { - "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0", - "phpunit/phpunit": "^8.0|^9.0", + "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0", + "phpunit/phpunit": "^8.0|^9.0|^10.0", "spatie/laravel-translatable": "^4.4|^5.0|^6.0" }, "type": "library", @@ -871,7 +870,7 @@ ], "support": { "issues": "https://github.com/codezero-be/laravel-unique-translation/issues", - "source": "https://github.com/codezero-be/laravel-unique-translation/tree/4.2.0" + "source": "https://github.com/codezero-be/laravel-unique-translation/tree/4.3.1" }, "funding": [ { @@ -883,7 +882,7 @@ "type": "ko_fi" } ], - "time": "2023-11-14T22:10:02+00:00" + "time": "2024-04-17T08:28:56+00:00" }, { "name": "commerceguys/addressing", @@ -1411,16 +1410,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.2", + "version": "3.8.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "a19a1d05ca211f41089dffcc387733a6875196cb" + "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/a19a1d05ca211f41089dffcc387733a6875196cb", - "reference": "a19a1d05ca211f41089dffcc387733a6875196cb", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/db922ba9436b7b18a23d1653a0b41ff2369ca41c", + "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c", "shasum": "" }, "require": { @@ -1436,12 +1435,12 @@ "doctrine/coding-standard": "12.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.1", - "phpstan/phpstan": "1.10.57", + "phpstan/phpstan": "1.10.58", "phpstan/phpstan-strict-rules": "^1.5", "phpunit/phpunit": "9.6.16", "psalm/plugin-phpunit": "0.18.4", "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.8.1", + "squizlabs/php_codesniffer": "3.9.0", "symfony/cache": "^5.4|^6.0|^7.0", "symfony/console": "^4.4|^5.4|^6.0|^7.0", "vimeo/psalm": "4.30.0" @@ -1504,7 +1503,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.2" + "source": "https://github.com/doctrine/dbal/tree/3.8.3" }, "funding": [ { @@ -1520,7 +1519,7 @@ "type": "tidelift" } ], - "time": "2024-02-12T18:36:36+00:00" + "time": "2024-03-03T15:55:06+00:00" }, { "name": "doctrine/deprecations", @@ -2018,16 +2017,16 @@ }, { "name": "filament/actions", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/actions.git", - "reference": "db3f17e5a6c550e98f8246bc2ca9c882fe1bb0e2" + "reference": "cd0d41bb40e0a87c5f78bf3ba4ca1330ce16556a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/actions/zipball/db3f17e5a6c550e98f8246bc2ca9c882fe1bb0e2", - "reference": "db3f17e5a6c550e98f8246bc2ca9c882fe1bb0e2", + "url": "https://api.github.com/repos/filamentphp/actions/zipball/cd0d41bb40e0a87c5f78bf3ba4ca1330ce16556a", + "reference": "cd0d41bb40e0a87c5f78bf3ba4ca1330ce16556a", "shasum": "" }, "require": { @@ -2067,20 +2066,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-02-12T17:10:13+00:00" + "time": "2024-02-20T10:36:45+00:00" }, { "name": "filament/filament", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/panels.git", - "reference": "275758cf9a0dea16214a89f8185a992d4b9cafea" + "reference": "960c5a7983bfd3a06fc4813641b60dcd24e3f12e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/panels/zipball/275758cf9a0dea16214a89f8185a992d4b9cafea", - "reference": "275758cf9a0dea16214a89f8185a992d4b9cafea", + "url": "https://api.github.com/repos/filamentphp/panels/zipball/960c5a7983bfd3a06fc4813641b60dcd24e3f12e", + "reference": "960c5a7983bfd3a06fc4813641b60dcd24e3f12e", "shasum": "" }, "require": { @@ -2132,20 +2131,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-02-13T11:56:58+00:00" + "time": "2024-02-20T10:36:51+00:00" }, { "name": "filament/forms", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/forms.git", - "reference": "2c1772bba223fee30b855870059b111bb2e465a9" + "reference": "76f19ce7edb6aa88ed30aa5ebb2c8629aa7abb94" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/forms/zipball/2c1772bba223fee30b855870059b111bb2e465a9", - "reference": "2c1772bba223fee30b855870059b111bb2e465a9", + "url": "https://api.github.com/repos/filamentphp/forms/zipball/76f19ce7edb6aa88ed30aa5ebb2c8629aa7abb94", + "reference": "76f19ce7edb6aa88ed30aa5ebb2c8629aa7abb94", "shasum": "" }, "require": { @@ -2188,11 +2187,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-02-11T20:52:55+00:00" + "time": "2024-02-20T10:36:43+00:00" }, { "name": "filament/infolists", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/infolists.git", @@ -2243,7 +2242,7 @@ }, { "name": "filament/notifications", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/notifications.git", @@ -2295,7 +2294,7 @@ }, { "name": "filament/spatie-laravel-settings-plugin", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/spatie-laravel-settings-plugin.git", @@ -2342,16 +2341,16 @@ }, { "name": "filament/support", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/support.git", - "reference": "c2be482587352c21bd9dc215b2e489c3598a9a06" + "reference": "73e3b2f50a6d77df21a302017ec86499ea9353ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/support/zipball/c2be482587352c21bd9dc215b2e489c3598a9a06", - "reference": "c2be482587352c21bd9dc215b2e489c3598a9a06", + "url": "https://api.github.com/repos/filamentphp/support/zipball/73e3b2f50a6d77df21a302017ec86499ea9353ca", + "reference": "73e3b2f50a6d77df21a302017ec86499ea9353ca", "shasum": "" }, "require": { @@ -2395,20 +2394,20 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-02-13T06:30:24+00:00" + "time": "2024-02-20T10:36:45+00:00" }, { "name": "filament/tables", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/tables.git", - "reference": "684cd0e83203f2ffc43f38451fd5a87df8f0c944" + "reference": "d791d064606f759148c93ed6b809d967ec3d630f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filamentphp/tables/zipball/684cd0e83203f2ffc43f38451fd5a87df8f0c944", - "reference": "684cd0e83203f2ffc43f38451fd5a87df8f0c944", + "url": "https://api.github.com/repos/filamentphp/tables/zipball/d791d064606f759148c93ed6b809d967ec3d630f", + "reference": "d791d064606f759148c93ed6b809d967ec3d630f", "shasum": "" }, "require": { @@ -2448,11 +2447,11 @@ "issues": "https://github.com/filamentphp/filament/issues", "source": "https://github.com/filamentphp/filament" }, - "time": "2024-02-13T11:57:12+00:00" + "time": "2024-02-20T10:36:47+00:00" }, { "name": "filament/widgets", - "version": "v3.2.34", + "version": "v3.2.35", "source": { "type": "git", "url": "https://github.com/filamentphp/widgets.git", @@ -3305,16 +3304,16 @@ }, { "name": "kirschbaum-development/eloquent-power-joins", - "version": "3.5.0", + "version": "3.5.5", "source": { "type": "git", "url": "https://github.com/kirschbaum-development/eloquent-power-joins.git", - "reference": "13feb3692ab6c0475b2c05de131d5f5822fb250a" + "reference": "ed5af4788f0dad3ce35bb883cecac4293496139a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/13feb3692ab6c0475b2c05de131d5f5822fb250a", - "reference": "13feb3692ab6c0475b2c05de131d5f5822fb250a", + "url": "https://api.github.com/repos/kirschbaum-development/eloquent-power-joins/zipball/ed5af4788f0dad3ce35bb883cecac4293496139a", + "reference": "ed5af4788f0dad3ce35bb883cecac4293496139a", "shasum": "" }, "require": { @@ -3361,9 +3360,9 @@ ], "support": { "issues": "https://github.com/kirschbaum-development/eloquent-power-joins/issues", - "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/3.5.0" + "source": "https://github.com/kirschbaum-development/eloquent-power-joins/tree/3.5.5" }, - "time": "2024-02-13T15:40:14+00:00" + "time": "2024-03-27T11:14:14+00:00" }, { "name": "laminas/laminas-diactoros", @@ -3718,16 +3717,16 @@ }, { "name": "laravel/prompts", - "version": "v0.1.16", + "version": "v0.1.24", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781" + "reference": "409b0b4305273472f3754826e68f4edbd0150149" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/ca6872ab6aec3ab61db3a61f83a6caf764ec7781", - "reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781", + "url": "https://api.github.com/repos/laravel/prompts/zipball/409b0b4305273472f3754826e68f4edbd0150149", + "reference": "409b0b4305273472f3754826e68f4edbd0150149", "shasum": "" }, "require": { @@ -3767,11 +3766,12 @@ "license": [ "MIT" ], + "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.16" + "source": "https://github.com/laravel/prompts/tree/v0.1.24" }, - "time": "2024-02-21T19:25:27+00:00" + "time": "2024-06-17T13:58:22+00:00" }, { "name": "laravel/serializable-closure", @@ -4231,16 +4231,16 @@ }, { "name": "league/csv", - "version": "9.14.0", + "version": "9.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5" + "reference": "fa7e2441c0bc9b2360f4314fd6c954f7ff40d435" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/34bf0df7340b60824b9449b5c526fcc3325070d5", - "reference": "34bf0df7340b60824b9449b5c526fcc3325070d5", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/fa7e2441c0bc9b2360f4314fd6c954f7ff40d435", + "reference": "fa7e2441c0bc9b2360f4314fd6c954f7ff40d435", "shasum": "" }, "require": { @@ -4255,12 +4255,12 @@ "ext-xdebug": "*", "friendsofphp/php-cs-fixer": "^v3.22.0", "phpbench/phpbench": "^1.2.15", - "phpstan/phpstan": "^1.10.50", + "phpstan/phpstan": "^1.10.57", "phpstan/phpstan-deprecation-rules": "^1.1.4", "phpstan/phpstan-phpunit": "^1.3.15", "phpstan/phpstan-strict-rules": "^1.5.2", - "phpunit/phpunit": "^10.5.3", - "symfony/var-dumper": "^6.4.0" + "phpunit/phpunit": "^10.5.9", + "symfony/var-dumper": "^6.4.2" }, "suggest": { "ext-dom": "Required to use the XMLConverter and the HTMLConverter classes", @@ -4316,20 +4316,20 @@ "type": "github" } ], - "time": "2023-12-29T07:34:53+00:00" + "time": "2024-02-20T20:00:00+00:00" }, { "name": "league/flysystem", - "version": "3.25.1", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "abbd664eb4381102c559d358420989f835208f18" + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/abbd664eb4381102c559d358420989f835208f18", - "reference": "abbd664eb4381102c559d358420989f835208f18", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", + "reference": "e611adab2b1ae2e3072fa72d62c62f52c2bf1f0c", "shasum": "" }, "require": { @@ -4353,10 +4353,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", + "ext-mongodb": "^1.3", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", + "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", + "mongodb/mongodb": "^1.2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -4394,19 +4397,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.25.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-03-16T12:53:19+00:00" + "time": "2024-05-22T10:09:12+00:00" }, { "name": "league/flysystem-aws-s3-v3", @@ -4475,16 +4468,16 @@ }, { "name": "league/flysystem-local", - "version": "3.25.1", + "version": "3.28.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92" + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/61a6a90d6e999e4ddd9ce5adb356de0939060b92", - "reference": "61a6a90d6e999e4ddd9ce5adb356de0939060b92", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/13f22ea8be526ea58c2ddff9e158ef7c296e4f40", + "reference": "13f22ea8be526ea58c2ddff9e158ef7c296e4f40", "shasum": "" }, "require": { @@ -4518,19 +4511,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.25.1" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.28.0" }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - } - ], - "time": "2024-03-15T19:58:44+00:00" + "time": "2024-05-06T20:05:52+00:00" }, { "name": "league/mime-type-detection", @@ -4590,16 +4573,16 @@ }, { "name": "league/uri", - "version": "7.4.0", + "version": "7.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri.git", - "reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5" + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri/zipball/bf414ba956d902f5d98bf9385fcf63954f09dce5", - "reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5", + "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4", + "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4", "shasum": "" }, "require": { @@ -4668,7 +4651,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri/tree/7.4.0" + "source": "https://github.com/thephpleague/uri/tree/7.4.1" }, "funding": [ { @@ -4676,20 +4659,20 @@ "type": "github" } ], - "time": "2023-12-01T06:24:25+00:00" + "time": "2024-03-23T07:42:40+00:00" }, { "name": "league/uri-interfaces", - "version": "7.4.0", + "version": "7.4.1", "source": { "type": "git", "url": "https://github.com/thephpleague/uri-interfaces.git", - "reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3" + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/bd8c487ec236930f7bbc42b8d374fa882fbba0f3", - "reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3", + "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718", + "reference": "8d43ef5c841032c87e2de015972c06f3865ef718", "shasum": "" }, "require": { @@ -4752,7 +4735,7 @@ "docs": "https://uri.thephpleague.com", "forum": "https://thephpleague.slack.com", "issues": "https://github.com/thephpleague/uri-src/issues", - "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.0" + "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1" }, "funding": [ { @@ -4760,7 +4743,7 @@ "type": "github" } ], - "time": "2023-11-24T15:40:42+00:00" + "time": "2024-03-23T07:42:40+00:00" }, { "name": "livewire/livewire", @@ -4990,16 +4973,16 @@ }, { "name": "monolog/monolog", - "version": "3.5.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448" + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c915e2634718dbc8a4a15c61b0e62e7a44e14448", - "reference": "c915e2634718dbc8a4a15c61b0e62e7a44e14448", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f4393b648b78a5408747de94fca38beb5f7e9ef8", + "reference": "f4393b648b78a5408747de94fca38beb5f7e9ef8", "shasum": "" }, "require": { @@ -5022,7 +5005,7 @@ "phpstan/phpstan": "^1.9", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-strict-rules": "^1.4", - "phpunit/phpunit": "^10.1", + "phpunit/phpunit": "^10.5.17", "predis/predis": "^1.1 || ^2", "ruflin/elastica": "^7", "symfony/mailer": "^5.4 || ^6", @@ -5075,7 +5058,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/3.5.0" + "source": "https://github.com/Seldaek/monolog/tree/3.7.0" }, "funding": [ { @@ -5087,7 +5070,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:32:31+00:00" + "time": "2024-06-28T09:40:51+00:00" }, { "name": "mtdowling/jmespath.php", @@ -5157,16 +5140,16 @@ }, { "name": "nesbot/carbon", - "version": "2.72.3", + "version": "2.72.5", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83" + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/0c6fd108360c562f6e4fd1dedb8233b423e91c83", - "reference": "0c6fd108360c562f6e4fd1dedb8233b423e91c83", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/afd46589c216118ecd48ff2b95d77596af1e57ed", + "reference": "afd46589c216118ecd48ff2b95d77596af1e57ed", "shasum": "" }, "require": { @@ -5200,8 +5183,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-3.x": "3.x-dev", - "dev-master": "2.x-dev" + "dev-master": "3.x-dev", + "dev-2.x": "2.x-dev" }, "laravel": { "providers": [ @@ -5260,7 +5243,7 @@ "type": "tidelift" } ], - "time": "2024-01-25T10:35:09+00:00" + "time": "2024-06-03T19:18:41+00:00" }, { "name": "nette/schema", @@ -5412,21 +5395,21 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -5462,9 +5445,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-17T08:10:35+00:00" }, { "name": "nunomaduro/termwind", @@ -6097,16 +6080,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "1.26.0", + "version": "1.29.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", - "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { @@ -6138,9 +6121,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.26.0" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2024-02-23T16:05:55+00:00" + "time": "2024-05-31T08:52:43+00:00" }, { "name": "pragmarx/google2fa", @@ -6520,20 +6503,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -6557,7 +6540,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -6569,9 +6552,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -6852,31 +6835,31 @@ }, { "name": "ralphjsmit/livewire-urls", - "version": "1.3.1", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/ralphjsmit/livewire-urls.git", - "reference": "41fc65910c58ccf2b19871cf24a6174948986a27" + "reference": "589815ce84fe6596e82b908b8679757781bcf6fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ralphjsmit/livewire-urls/zipball/41fc65910c58ccf2b19871cf24a6174948986a27", - "reference": "41fc65910c58ccf2b19871cf24a6174948986a27", + "url": "https://api.github.com/repos/ralphjsmit/livewire-urls/zipball/589815ce84fe6596e82b908b8679757781bcf6fb", + "reference": "589815ce84fe6596e82b908b8679757781bcf6fb", "shasum": "" }, "require": { - "illuminate/contracts": "^8.83|^9.0|^10.0", + "illuminate/contracts": "^8.83|^9.0|^10.0|^11.0", "livewire/livewire": "^2.10|^3.0", "php": "^8.0", "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.8", - "nesbot/carbon": "^2.66", - "nunomaduro/collision": "^5.0|^6.0|^7.0", - "orchestra/testbench": "^6.0|^7.0|^8.0", - "pestphp/pest": "^1.21", - "pestphp/pest-plugin-laravel": "^1.1", + "nesbot/carbon": "^2.66|^3.0", + "nunomaduro/collision": "^5.0|^6.0|^7.0|^8.0", + "orchestra/testbench": "^6.0|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.21|^2.34", + "pestphp/pest-plugin-laravel": "^1.1|^2.3", "phpunit/phpunit": "^9.5|^10.0", "spatie/laravel-ray": "^1.26" }, @@ -6916,9 +6899,9 @@ ], "support": { "issues": "https://github.com/ralphjsmit/livewire-urls/issues", - "source": "https://github.com/ralphjsmit/livewire-urls/tree/1.3.1" + "source": "https://github.com/ralphjsmit/livewire-urls/tree/1.4.0" }, - "time": "2023-11-29T19:53:22+00:00" + "time": "2024-03-14T09:52:50+00:00" }, { "name": "ramsey/collection", @@ -7011,20 +6994,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -7087,7 +7070,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -7099,7 +7082,7 @@ "type": "tidelift" } ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "ryangjchandler/blade-capture-directive", @@ -7804,31 +7787,31 @@ }, { "name": "spatie/laravel-collection-macros", - "version": "7.13.1", + "version": "7.14.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-collection-macros.git", - "reference": "448d0a9e7a4151938e3cfaf1235d69d899f13ba7" + "reference": "17dca9472ed115e270190ce2a21874673a99280c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-collection-macros/zipball/448d0a9e7a4151938e3cfaf1235d69d899f13ba7", - "reference": "448d0a9e7a4151938e3cfaf1235d69d899f13ba7", + "url": "https://api.github.com/repos/spatie/laravel-collection-macros/zipball/17dca9472ed115e270190ce2a21874673a99280c", + "reference": "17dca9472ed115e270190ce2a21874673a99280c", "shasum": "" }, "require": { - "illuminate/support": "^10.0", + "illuminate/support": "^10.0|^11.0", "php": "^8.2" }, "require-dev": { - "amphp/parallel": "^1.4.3", - "amphp/parallel-functions": "^1.1.0", + "amphp/parallel": "^1.4.3|^2.2", + "amphp/parallel-functions": "^1.1.0|^2.0", "mockery/mockery": "^1.6.2", - "orchestra/testbench": "^8.5.9", + "orchestra/testbench": "^8.5.9|^9.0", "pestphp/pest": "^2.0", - "phpunit/phpunit": "10.2.2", + "phpunit/phpunit": "10.2.2|^10.5", "spatie/laravel-ray": "^1.32.5", - "symfony/stopwatch": "^6.3" + "symfony/stopwatch": "^6.3|^7.0" }, "suggest": { "amphp/parallel-functions": "Required when using the parallel*-macros." @@ -7871,7 +7854,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-collection-macros/tree/7.13.1" + "source": "https://github.com/spatie/laravel-collection-macros/tree/7.14.1" }, "funding": [ { @@ -7879,7 +7862,7 @@ "type": "github" } ], - "time": "2023-10-17T15:12:13+00:00" + "time": "2024-07-02T13:39:03+00:00" }, { "name": "spatie/laravel-cookie-consent", @@ -8335,35 +8318,35 @@ }, { "name": "spatie/laravel-options", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-options.git", - "reference": "5bed29084853dd97355ea055c017c27614900b2c" + "reference": "150e6cf9f9cf2df747946f1702f21512cfdd6646" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-options/zipball/5bed29084853dd97355ea055c017c27614900b2c", - "reference": "5bed29084853dd97355ea055c017c27614900b2c", + "url": "https://api.github.com/repos/spatie/laravel-options/zipball/150e6cf9f9cf2df747946f1702f21512cfdd6646", + "reference": "150e6cf9f9cf2df747946f1702f21512cfdd6646", "shasum": "" }, "require": { - "illuminate/contracts": "^8.81|^9.0|^10.0", + "illuminate/contracts": "^8.81|^9.0|^10.0|^11.0", "php": "^8.1", "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.8", "myclabs/php-enum": "^1.6", - "nunomaduro/collision": "^6.0|^5.0", + "nunomaduro/collision": "^6.0|^5.0|^8.0", "nunomaduro/larastan": "^2.0.1|^1.0.3", - "orchestra/testbench": "^7.0|^v6.24.1|^8.0", - "pestphp/pest": "^v1.21.3", - "pestphp/pest-plugin-laravel": "^1.1", + "orchestra/testbench": "^7.0|^v6.24.1|^8.0|^9.0", + "pestphp/pest": "^v1.21.3|^2.34", + "pestphp/pest-plugin-laravel": "^1.1|^2.3", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5", + "phpunit/phpunit": "^9.5|^10.5", "spatie/enum": "^3.13", "spatie/laravel-model-states": "^2.0", "spatie/laravel-ray": "^1.26" @@ -8401,22 +8384,22 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/laravel-options/tree/1.1.0" + "source": "https://github.com/spatie/laravel-options/tree/1.1.1" }, - "time": "2023-02-09T15:07:29+00:00" + "time": "2024-02-27T14:48:21+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.16.2", + "version": "1.16.4", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15" + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15", - "reference": "e62eeb1fe8a8a0b2e83227a6c279c8c59f7d3a15", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", + "reference": "ddf678e78d7f8b17e5cdd99c0c3413a4a6592e53", "shasum": "" }, "require": { @@ -8455,7 +8438,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.2" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.16.4" }, "funding": [ { @@ -8463,7 +8446,7 @@ "type": "github" } ], - "time": "2024-01-11T08:43:00+00:00" + "time": "2024-03-20T07:29:11+00:00" }, { "name": "spatie/laravel-schemaless-attributes", @@ -8543,39 +8526,39 @@ }, { "name": "spatie/laravel-settings", - "version": "3.2.3", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-settings.git", - "reference": "2cca592b32ddce15b32ef1ef652d346416d2da03" + "reference": "395066797823856638a0a2feb243b396a94e22e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-settings/zipball/2cca592b32ddce15b32ef1ef652d346416d2da03", - "reference": "2cca592b32ddce15b32ef1ef652d346416d2da03", + "url": "https://api.github.com/repos/spatie/laravel-settings/zipball/395066797823856638a0a2feb243b396a94e22e5", + "reference": "395066797823856638a0a2feb243b396a94e22e5", "shasum": "" }, "require": { "ext-json": "*", - "illuminate/database": "^8.73|^9.0|^10.0", + "illuminate/database": "^8.73|^9.0|^10.0|^11.0", "php": "^7.4|^8.0", "phpdocumentor/type-resolver": "^1.5", "spatie/temporary-directory": "^1.3|^2.0" }, "require-dev": { "ext-redis": "*", + "larastan/larastan": "^2.0", "mockery/mockery": "^1.4", - "nunomaduro/larastan": "^2.0", - "orchestra/testbench": "^6.23|^7.0|^8.0", - "pestphp/pest": "^1.21", - "pestphp/pest-plugin-laravel": "^1.2", + "orchestra/testbench": "^6.23|^7.0|^8.0|^9.0", + "pestphp/pest": "^1.21|^2.0", + "pestphp/pest-plugin-laravel": "^1.2|^2.0", "phpstan/extension-installer": "^1.1", "phpstan/phpstan-deprecation-rules": "^1.0", "phpstan/phpstan-phpunit": "^1.0", - "phpunit/phpunit": "^9.5", - "spatie/laravel-data": "^1.0.0|^2.0.0", - "spatie/pest-plugin-snapshots": "^1.1", - "spatie/phpunit-snapshot-assertions": "^4.2", + "phpunit/phpunit": "^9.5|^10.0", + "spatie/laravel-data": "^1.0.0|^2.0.0|^4.0.0", + "spatie/pest-plugin-snapshots": "^1.1|^2.0", + "spatie/phpunit-snapshot-assertions": "^4.2|^5.0", "spatie/ray": "^1.36" }, "suggest": { @@ -8614,7 +8597,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-settings/issues", - "source": "https://github.com/spatie/laravel-settings/tree/3.2.3" + "source": "https://github.com/spatie/laravel-settings/tree/3.3.2" }, "funding": [ { @@ -8626,7 +8609,7 @@ "type": "github" } ], - "time": "2023-12-04T11:38:23+00:00" + "time": "2024-03-22T07:50:04+00:00" }, { "name": "spatie/laravel-signal-aware-command", @@ -9137,16 +9120,16 @@ }, { "name": "symfony/console", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", - "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", + "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", "shasum": "" }, "require": { @@ -9211,7 +9194,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.4" + "source": "https://github.com/symfony/console/tree/v6.4.9" }, "funding": [ { @@ -9227,20 +9210,20 @@ "type": "tidelift" } ], - "time": "2024-02-22T20:27:10+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/css-selector", - "version": "v7.0.3", + "version": "v7.1.1", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be" + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/ec60a4edf94e63b0556b6a0888548bb400a3a3be", - "reference": "ec60a4edf94e63b0556b6a0888548bb400a3a3be", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/1c7cee86c6f812896af54434f8ce29c8d94f9ff4", + "reference": "1c7cee86c6f812896af54434f8ce29c8d94f9ff4", "shasum": "" }, "require": { @@ -9276,7 +9259,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.0.3" + "source": "https://github.com/symfony/css-selector/tree/v7.1.1" }, "funding": [ { @@ -9292,20 +9275,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T15:02:46+00:00" + "time": "2024-05-31T14:57:53+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -9314,7 +9297,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -9343,7 +9326,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -9359,7 +9342,7 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/error-handler", @@ -9437,16 +9420,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", - "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", + "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", "shasum": "" }, "require": { @@ -9497,7 +9480,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.3" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" }, "funding": [ { @@ -9513,20 +9496,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", - "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", "shasum": "" }, "require": { @@ -9536,7 +9519,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -9573,7 +9556,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" }, "funding": [ { @@ -9589,20 +9572,20 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/finder", - "version": "v6.4.0", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", - "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", + "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", "shasum": "" }, "require": { @@ -9637,7 +9620,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.0" + "source": "https://github.com/symfony/finder/tree/v6.4.8" }, "funding": [ { @@ -9653,20 +9636,20 @@ "type": "tidelift" } ], - "time": "2023-10-31T17:30:12+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/html-sanitizer", - "version": "v6.4.3", + "version": "v6.4.4", "source": { "type": "git", "url": "https://github.com/symfony/html-sanitizer.git", - "reference": "116335ab09e10b05405f01d8afd31ccc3832b08b" + "reference": "83e1dc8b49345e078cfa21bd4c563dfa99c5ed63" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/116335ab09e10b05405f01d8afd31ccc3832b08b", - "reference": "116335ab09e10b05405f01d8afd31ccc3832b08b", + "url": "https://api.github.com/repos/symfony/html-sanitizer/zipball/83e1dc8b49345e078cfa21bd4c563dfa99c5ed63", + "reference": "83e1dc8b49345e078cfa21bd4c563dfa99c5ed63", "shasum": "" }, "require": { @@ -9706,7 +9689,7 @@ "sanitizer" ], "support": { - "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.3" + "source": "https://github.com/symfony/html-sanitizer/tree/v6.4.4" }, "funding": [ { @@ -9722,7 +9705,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-02-13T16:25:19+00:00" }, { "name": "symfony/http-foundation", @@ -9916,16 +9899,16 @@ }, { "name": "symfony/mailer", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "791c5d31a8204cf3db0c66faab70282307f4376b" + "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/791c5d31a8204cf3db0c66faab70282307f4376b", - "reference": "791c5d31a8204cf3db0c66faab70282307f4376b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", + "reference": "e2d56f180f5b8c5e7c0fbea872bb1f529b6d6d45", "shasum": "" }, "require": { @@ -9976,7 +9959,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.4" + "source": "https://github.com/symfony/mailer/tree/v6.4.9" }, "funding": [ { @@ -9992,20 +9975,20 @@ "type": "tidelift" } ], - "time": "2024-02-03T21:33:47+00:00" + "time": "2024-06-28T07:59:05+00:00" }, { "name": "symfony/mime", - "version": "v6.4.3", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + "reference": "7d048964877324debdcb4e0549becfa064a20d43" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", - "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", + "reference": "7d048964877324debdcb4e0549becfa064a20d43", "shasum": "" }, "require": { @@ -10019,16 +10002,17 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/mailer": "<5.4", - "symfony/serializer": "<6.3.2" + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", "symfony/property-access": "^5.4|^6.0|^7.0", "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.3.2|^7.0" + "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", "autoload": { @@ -10060,7 +10044,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.3" + "source": "https://github.com/symfony/mime/tree/v6.4.9" }, "funding": [ { @@ -10076,20 +10060,20 @@ "type": "tidelift" } ], - "time": "2024-01-30T08:32:12+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -10139,7 +10123,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -10155,20 +10139,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", - "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -10217,7 +10201,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -10233,20 +10217,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", - "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", "shasum": "" }, "require": { @@ -10301,7 +10285,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" }, "funding": [ { @@ -10317,20 +10301,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", - "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -10382,7 +10366,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -10398,20 +10382,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -10462,7 +10446,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -10478,20 +10462,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + "reference": "10112722600777e02d2745716b70c5db4ca70442" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", - "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", + "reference": "10112722600777e02d2745716b70c5db4ca70442", "shasum": "" }, "require": { @@ -10535,7 +10519,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" }, "funding": [ { @@ -10551,20 +10535,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", - "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -10615,7 +10599,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -10631,25 +10615,24 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", - "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-php80": "^1.14" + "php": ">=7.1" }, "type": "library", "extra": { @@ -10692,7 +10675,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" }, "funding": [ { @@ -10708,20 +10691,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:35:24+00:00" }, { "name": "symfony/polyfill-uuid", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", - "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/2ba1f33797470debcda07fe9dce20a0003df18e9", + "reference": "2ba1f33797470debcda07fe9dce20a0003df18e9", "shasum": "" }, "require": { @@ -10771,7 +10754,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.30.0" }, "funding": [ { @@ -10787,20 +10770,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", "shasum": "" }, "require": { @@ -10832,7 +10815,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v6.4.8" }, "funding": [ { @@ -10848,20 +10831,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/routing", - "version": "v6.4.5", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4" + "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/7fe30068e207d9c31c0138501ab40358eb2d49a4", - "reference": "7fe30068e207d9c31c0138501ab40358eb2d49a4", + "url": "https://api.github.com/repos/symfony/routing/zipball/8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", + "reference": "8a40d0f9b01f0fbb80885d3ce0ad6714fb603a58", "shasum": "" }, "require": { @@ -10915,7 +10898,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.5" + "source": "https://github.com/symfony/routing/tree/v6.4.8" }, "funding": [ { @@ -10931,25 +10914,26 @@ "type": "tidelift" } ], - "time": "2024-02-27T12:33:30+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", - "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { "php": ">=8.1", - "psr/container": "^1.1|^2.0" + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -10957,7 +10941,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -10997,7 +10981,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" }, "funding": [ { @@ -11013,20 +10997,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/string", - "version": "v7.0.4", + "version": "v7.1.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b" + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f5832521b998b0bec40bee688ad5de98d4cf111b", - "reference": "f5832521b998b0bec40bee688ad5de98d4cf111b", + "url": "https://api.github.com/repos/symfony/string/zipball/14221089ac66cf82e3cf3d1c1da65de305587ff8", + "reference": "14221089ac66cf82e3cf3d1c1da65de305587ff8", "shasum": "" }, "require": { @@ -11040,6 +11024,7 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { + "symfony/emoji": "^7.1", "symfony/error-handler": "^6.4|^7.0", "symfony/http-client": "^6.4|^7.0", "symfony/intl": "^6.4|^7.0", @@ -11083,7 +11068,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.0.4" + "source": "https://github.com/symfony/string/tree/v7.1.2" }, "funding": [ { @@ -11099,20 +11084,20 @@ "type": "tidelift" } ], - "time": "2024-02-01T13:17:36+00:00" + "time": "2024-06-28T09:27:18+00:00" }, { "name": "symfony/translation", - "version": "v6.4.4", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e" + "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/bce6a5a78e94566641b2594d17e48b0da3184a8e", - "reference": "bce6a5a78e94566641b2594d17e48b0da3184a8e", + "url": "https://api.github.com/repos/symfony/translation/zipball/a002933b13989fc4bd0b58e04bf7eec5210e438a", + "reference": "a002933b13989fc4bd0b58e04bf7eec5210e438a", "shasum": "" }, "require": { @@ -11178,7 +11163,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.4" + "source": "https://github.com/symfony/translation/tree/v6.4.8" }, "funding": [ { @@ -11194,20 +11179,20 @@ "type": "tidelift" } ], - "time": "2024-02-20T13:16:58+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.4.1", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "06450585bf65e978026bda220cdebca3f867fde7" + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/06450585bf65e978026bda220cdebca3f867fde7", - "reference": "06450585bf65e978026bda220cdebca3f867fde7", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", + "reference": "b9d2189887bb6b2e0367a9fc7136c5239ab9b05a", "shasum": "" }, "require": { @@ -11216,7 +11201,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -11256,7 +11241,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.4.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.5.0" }, "funding": [ { @@ -11272,20 +11257,20 @@ "type": "tidelift" } ], - "time": "2023-12-26T14:02:43+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/uid", - "version": "v6.4.3", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" + "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", - "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "url": "https://api.github.com/repos/symfony/uid/zipball/35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", + "reference": "35904eca37a84bb764c560cbfcac9f0ac2bcdbdf", "shasum": "" }, "require": { @@ -11330,7 +11315,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v6.4.3" + "source": "https://github.com/symfony/uid/tree/v6.4.8" }, "funding": [ { @@ -11346,20 +11331,20 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-05-31T14:49:08+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.4", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1" + "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b439823f04c98b84d4366c79507e9da6230944b1", - "reference": "b439823f04c98b84d4366c79507e9da6230944b1", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c31566e4ca944271cc8d8ac6887cbf31b8c6a172", + "reference": "c31566e4ca944271cc8d8ac6887cbf31b8c6a172", "shasum": "" }, "require": { @@ -11415,7 +11400,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.9" }, "funding": [ { @@ -11431,7 +11416,7 @@ "type": "tidelift" } ], - "time": "2024-02-15T11:23:52+00:00" + "time": "2024-06-27T13:23:14+00:00" }, { "name": "theiconic/name-parser", @@ -12115,36 +12100,36 @@ }, { "name": "barryvdh/laravel-debugbar", - "version": "v3.10.4", + "version": "v3.13.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "09d3dc77d7dc1b063e3728a6029c39ee0fbebf1d" + "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/09d3dc77d7dc1b063e3728a6029c39ee0fbebf1d", - "reference": "09d3dc77d7dc1b063e3728a6029c39ee0fbebf1d", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/92d86be45ee54edff735e46856f64f14b6a8bb07", + "reference": "92d86be45ee54edff735e46856f64f14b6a8bb07", "shasum": "" }, "require": { "illuminate/routing": "^9|^10|^11", "illuminate/session": "^9|^10|^11", "illuminate/support": "^9|^10|^11", - "maximebf/debugbar": "~1.20.1", + "maximebf/debugbar": "~1.22.0", "php": "^8.0", "symfony/finder": "^6|^7" }, "require-dev": { "mockery/mockery": "^1.3.3", "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", - "phpunit/phpunit": "^8.5.30|^9.0", + "phpunit/phpunit": "^9.6|^10.5", "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.10-dev" + "dev-master": "3.13-dev" }, "laravel": { "providers": [ @@ -12183,7 +12168,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.10.4" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.13.5" }, "funding": [ { @@ -12195,7 +12180,7 @@ "type": "github" } ], - "time": "2024-02-14T08:52:12+00:00" + "time": "2024-04-12T11:20:37+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -12345,16 +12330,16 @@ }, { "name": "brianium/paratest", - "version": "v7.4.1", + "version": "v7.4.3", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "b2830e330011d59a799c0002e118f5b4bbdb9604" + "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/b2830e330011d59a799c0002e118f5b4bbdb9604", - "reference": "b2830e330011d59a799c0002e118f5b4bbdb9604", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/64fcfd0e28a6b8078a19dbf9127be2ee645b92ec", + "reference": "64fcfd0e28a6b8078a19dbf9127be2ee645b92ec", "shasum": "" }, "require": { @@ -12362,13 +12347,13 @@ "ext-pcre": "*", "ext-reflection": "*", "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.0.0", + "fidry/cpu-core-counter": "^1.1.0", "jean85/pretty-package-versions": "^2.0.5", "php": "~8.2.0 || ~8.3.0", "phpunit/php-code-coverage": "^10.1.11 || ^11.0.0", "phpunit/php-file-iterator": "^4.1.0 || ^5.0.0", "phpunit/php-timer": "^6.0.0 || ^7.0.0", - "phpunit/phpunit": "^10.5.9 || ^11.0.2", + "phpunit/phpunit": "^10.5.9 || ^11.0.3", "sebastian/environment": "^6.0.1 || ^7.0.0", "symfony/console": "^6.4.3 || ^7.0.3", "symfony/process": "^6.4.3 || ^7.0.3" @@ -12377,11 +12362,11 @@ "doctrine/coding-standard": "^12.0.0", "ext-pcov": "*", "ext-posix": "*", - "phpstan/phpstan": "^1.10.57", + "phpstan/phpstan": "^1.10.58", "phpstan/phpstan-deprecation-rules": "^1.1.4", "phpstan/phpstan-phpunit": "^1.3.15", "phpstan/phpstan-strict-rules": "^1.5.2", - "squizlabs/php_codesniffer": "^3.8.1", + "squizlabs/php_codesniffer": "^3.9.0", "symfony/filesystem": "^6.4.3 || ^7.0.3" }, "bin": [ @@ -12423,7 +12408,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.4.1" + "source": "https://github.com/paratestphp/paratest/tree/v7.4.3" }, "funding": [ { @@ -12435,7 +12420,7 @@ "type": "paypal" } ], - "time": "2024-02-06T13:50:28+00:00" + "time": "2024-02-20T07:24:02+00:00" }, { "name": "calebporzio/sushi", @@ -12882,16 +12867,16 @@ }, { "name": "jean85/pretty-package-versions", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", - "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/f9fdd29ad8e6d024f52678b570e5593759b550b4", + "reference": "f9fdd29ad8e6d024f52678b570e5593759b550b4", "shasum": "" }, "require": { @@ -12899,9 +12884,9 @@ "php": "^7.1|^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.17", + "friendsofphp/php-cs-fixer": "^3.2", "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^0.12.66", + "phpstan/phpstan": "^1.4", "phpunit/phpunit": "^7.5|^8.5|^9.4", "vimeo/psalm": "^4.3" }, @@ -12935,9 +12920,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.6" }, - "time": "2021-10-08T21:21:46+00:00" + "time": "2024-03-08T09:58:59+00:00" }, { "name": "larastan/larastan", @@ -13246,25 +13231,27 @@ }, { "name": "maximebf/debugbar", - "version": "v1.20.1", + "version": "v1.22.3", "source": { "type": "git", "url": "https://github.com/maximebf/php-debugbar.git", - "reference": "06ebf922ccedfa4cc43015825697ee8c1fb80f7e" + "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/06ebf922ccedfa4cc43015825697ee8c1fb80f7e", - "reference": "06ebf922ccedfa4cc43015825697ee8c1fb80f7e", + "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", + "reference": "7aa9a27a0b1158ed5ad4e7175e8d3aee9a818b96", "shasum": "" }, "require": { - "php": "^7.1|^8", + "php": "^7.2|^8", "psr/log": "^1|^2|^3", "symfony/var-dumper": "^4|^5|^6|^7" }, "require-dev": { - "phpunit/phpunit": ">=7.5.20 <10.0", + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", "twig/twig": "^1.38|^2.7|^3.0" }, "suggest": { @@ -13275,7 +13262,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.20-dev" + "dev-master": "1.22-dev" } }, "autoload": { @@ -13306,22 +13293,22 @@ ], "support": { "issues": "https://github.com/maximebf/php-debugbar/issues", - "source": "https://github.com/maximebf/php-debugbar/tree/v1.20.1" + "source": "https://github.com/maximebf/php-debugbar/tree/v1.22.3" }, - "time": "2024-02-13T19:03:14+00:00" + "time": "2024-04-03T19:39:26+00:00" }, { "name": "mockery/mockery", - "version": "1.6.7", + "version": "1.6.11", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06" + "reference": "81a161d0b135df89951abd52296adf97deb0723d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", - "reference": "0cc058854b3195ba21dc6b1f7b1f60f4ef3a9c06", + "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d", + "reference": "81a161d0b135df89951abd52296adf97deb0723d", "shasum": "" }, "require": { @@ -13333,8 +13320,8 @@ "phpunit/phpunit": "<8.0" }, "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.10", - "symplify/easy-coding-standard": "^12.0.8" + "phpunit/phpunit": "^8.5 || ^9.6.17", + "symplify/easy-coding-standard": "^12.1.14" }, "type": "library", "autoload": { @@ -13391,20 +13378,20 @@ "security": "https://github.com/mockery/mockery/security/advisories", "source": "https://github.com/mockery/mockery" }, - "time": "2023-12-10T02:24:34+00:00" + "time": "2024-03-21T18:34:15+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -13412,11 +13399,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -13442,7 +13430,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -13450,7 +13438,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nunomaduro/collision", @@ -13677,36 +13665,36 @@ }, { "name": "pestphp/pest", - "version": "v2.33.6", + "version": "v2.34.8", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "5b0f88c22716452be59202cfe7c5a24fbb2fb7de" + "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/5b0f88c22716452be59202cfe7c5a24fbb2fb7de", - "reference": "5b0f88c22716452be59202cfe7c5a24fbb2fb7de", + "url": "https://api.github.com/repos/pestphp/pest/zipball/e8f122bf47585c06431e0056189ec6bfd6f41f57", + "reference": "e8f122bf47585c06431e0056189ec6bfd6f41f57", "shasum": "" }, "require": { "brianium/paratest": "^7.3.1", - "nunomaduro/collision": "^7.10.0|^8.1.0", - "nunomaduro/termwind": "^1.15.1|^2.0.0", + "nunomaduro/collision": "^7.10.0|^8.1.1", + "nunomaduro/termwind": "^1.15.1|^2.0.1", "pestphp/pest-plugin": "^2.1.1", "pestphp/pest-plugin-arch": "^2.7.0", "php": "^8.1.0", - "phpunit/phpunit": "^10.5.10" + "phpunit/phpunit": "^10.5.17" }, "conflict": { - "phpunit/phpunit": ">10.5.10", + "phpunit/phpunit": ">10.5.17", "sebastian/exporter": "<5.1.0", "webmozart/assert": "<1.11.0" }, "require-dev": { "pestphp/pest-dev-tools": "^2.16.0", - "pestphp/pest-plugin-type-coverage": "^2.8.0", - "symfony/process": "^6.4.0|^7.0.3" + "pestphp/pest-plugin-type-coverage": "^2.8.3", + "symfony/process": "^6.4.0|^7.1.1" }, "bin": [ "bin/pest" @@ -13769,7 +13757,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v2.33.6" + "source": "https://github.com/pestphp/pest/tree/v2.34.8" }, "funding": [ { @@ -13781,7 +13769,7 @@ "type": "github" } ], - "time": "2024-02-12T08:55:32+00:00" + "time": "2024-06-10T22:02:16+00:00" }, { "name": "pestphp/pest-plugin", @@ -14126,20 +14114,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -14180,9 +14169,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -14303,28 +14298,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.4.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" }, "type": "library", "extra": { @@ -14348,15 +14350,15 @@ }, { "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "email": "opensource@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-05-21T05:55:05+00:00" }, { "name": "phpmyadmin/sql-parser", @@ -14448,16 +14450,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.58", + "version": "1.10.66", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2" + "reference": "94779c987e4ebd620025d9e5fdd23323903950bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/a23518379ec4defd9e47cbf81019526861623ec2", - "reference": "a23518379ec4defd9e47cbf81019526861623ec2", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/94779c987e4ebd620025d9e5fdd23323903950bd", + "reference": "94779c987e4ebd620025d9e5fdd23323903950bd", "shasum": "" }, "require": { @@ -14506,20 +14508,20 @@ "type": "tidelift" } ], - "time": "2024-02-12T20:02:57+00:00" + "time": "2024-03-28T16:17:31+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.11", + "version": "10.1.15", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", - "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", "shasum": "" }, "require": { @@ -14576,7 +14578,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" }, "funding": [ { @@ -14584,7 +14586,7 @@ "type": "github" } ], - "time": "2023-12-21T15:38:30+00:00" + "time": "2024-06-29T08:25:15+00:00" }, { "name": "phpunit/php-file-iterator", @@ -14831,16 +14833,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.10", + "version": "10.5.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c" + "reference": "c1f736a473d21957ead7e94fcc029f571895abf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/50b8e314b6d0dd06521dc31d1abffa73f25f850c", - "reference": "50b8e314b6d0dd06521dc31d1abffa73f25f850c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5", + "reference": "c1f736a473d21957ead7e94fcc029f571895abf5", "shasum": "" }, "require": { @@ -14912,7 +14914,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17" }, "funding": [ { @@ -14928,7 +14930,7 @@ "type": "tidelift" } ], - "time": "2024-02-04T09:07:51+00:00" + "time": "2024-04-05T04:39:01+00:00" }, { "name": "pimple/pimple", @@ -15032,21 +15034,21 @@ }, { "name": "rector/rector", - "version": "1.0.0", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "362258a1f6369fc88d02d469a5478d220f78b0e6" + "reference": "c59507a9090b465d65e1aceed91e5b81986e375b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/362258a1f6369fc88d02d469a5478d220f78b0e6", - "reference": "362258a1f6369fc88d02d469a5478d220f78b0e6", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/c59507a9090b465d65e1aceed91e5b81986e375b", + "reference": "c59507a9090b465d65e1aceed91e5b81986e375b", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.10.56" + "phpstan/phpstan": "^1.10.57" }, "conflict": { "rector/rector-doctrine": "*", @@ -15076,7 +15078,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.0.0" + "source": "https://github.com/rectorphp/rector/tree/1.0.3" }, "funding": [ { @@ -15084,20 +15086,20 @@ "type": "github" } ], - "time": "2024-02-06T13:38:07+00:00" + "time": "2024-03-14T15:04:18+00:00" }, { "name": "sebastian/cli-parser", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", - "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", + "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", "shasum": "" }, "require": { @@ -15132,7 +15134,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" }, "funding": [ { @@ -15140,7 +15143,7 @@ "type": "github" } ], - "time": "2023-02-03T06:58:15+00:00" + "time": "2024-03-02T07:12:49+00:00" }, { "name": "sebastian/code-unit", @@ -15390,16 +15393,16 @@ }, { "name": "sebastian/diff", - "version": "5.1.0", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", - "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", + "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", "shasum": "" }, "require": { @@ -15407,7 +15410,7 @@ }, "require-dev": { "phpunit/phpunit": "^10.0", - "symfony/process": "^4.2 || ^5" + "symfony/process": "^6.4" }, "type": "library", "extra": { @@ -15445,7 +15448,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" }, "funding": [ { @@ -15453,20 +15456,20 @@ "type": "github" } ], - "time": "2023-12-22T10:55:06+00:00" + "time": "2024-03-02T07:15:17+00:00" }, { "name": "sebastian/environment", - "version": "6.0.1", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", - "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", + "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", "shasum": "" }, "require": { @@ -15481,7 +15484,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "6.0-dev" + "dev-main": "6.1-dev" } }, "autoload": { @@ -15509,7 +15512,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" }, "funding": [ { @@ -15517,20 +15520,20 @@ "type": "github" } ], - "time": "2023-04-11T05:39:26+00:00" + "time": "2024-03-23T08:47:14+00:00" }, { "name": "sebastian/exporter", - "version": "5.1.1", + "version": "5.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + "reference": "955288482d97c19a372d3f31006ab3f37da47adf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", - "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", + "reference": "955288482d97c19a372d3f31006ab3f37da47adf", "shasum": "" }, "require": { @@ -15587,7 +15590,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" }, "funding": [ { @@ -15595,20 +15598,20 @@ "type": "github" } ], - "time": "2023-09-24T13:22:09+00:00" + "time": "2024-03-02T07:17:12+00:00" }, { "name": "sebastian/global-state", - "version": "6.0.1", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", - "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", + "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", "shasum": "" }, "require": { @@ -15642,14 +15645,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" }, "funding": [ { @@ -15657,7 +15660,7 @@ "type": "github" } ], - "time": "2023-07-19T07:19:23+00:00" + "time": "2024-03-02T07:19:19+00:00" }, { "name": "sebastian/lines-of-code", @@ -16003,16 +16006,16 @@ }, { "name": "spatie/laravel-ray", - "version": "1.35.1", + "version": "1.36.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-ray.git", - "reference": "f504d3787d88c7e5de7a4290658f7ad9b1352f22" + "reference": "f15936b5d308ae391ee67370a5628f0712537c34" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/f504d3787d88c7e5de7a4290658f7ad9b1352f22", - "reference": "f504d3787d88c7e5de7a4290658f7ad9b1352f22", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/f15936b5d308ae391ee67370a5628f0712537c34", + "reference": "f15936b5d308ae391ee67370a5628f0712537c34", "shasum": "" }, "require": { @@ -16074,7 +16077,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-ray/issues", - "source": "https://github.com/spatie/laravel-ray/tree/1.35.1" + "source": "https://github.com/spatie/laravel-ray/tree/1.36.0" }, "funding": [ { @@ -16086,7 +16089,7 @@ "type": "other" } ], - "time": "2024-02-13T14:19:41+00:00" + "time": "2024-03-29T09:10:11+00:00" }, { "name": "spatie/macroable", @@ -16564,16 +16567,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -16602,7 +16605,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -16610,7 +16613,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "zbateson/mail-mime-parser", @@ -16689,16 +16692,16 @@ }, { "name": "zbateson/mb-wrapper", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/zbateson/mb-wrapper.git", - "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334" + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/faf35dddfacfc5d4d5f9210143eafd7a7fe74334", - "reference": "faf35dddfacfc5d4d5f9210143eafd7a7fe74334", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/09a8b77eb94af3823a9a6623dcc94f8d988da67f", + "reference": "09a8b77eb94af3823a9a6623dcc94f8d988da67f", "shasum": "" }, "require": { @@ -16709,7 +16712,7 @@ "require-dev": { "friendsofphp/php-cs-fixer": "*", "phpstan/phpstan": "*", - "phpunit/phpunit": "<=9.0" + "phpunit/phpunit": "<10.0" }, "suggest": { "ext-iconv": "For best support/performance", @@ -16746,7 +16749,7 @@ ], "support": { "issues": "https://github.com/zbateson/mb-wrapper/issues", - "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.0" + "source": "https://github.com/zbateson/mb-wrapper/tree/1.2.1" }, "funding": [ { @@ -16754,7 +16757,7 @@ "type": "github" } ], - "time": "2023-01-11T23:05:44+00:00" + "time": "2024-03-18T04:31:04+00:00" }, { "name": "zbateson/stream-decorators", diff --git a/database/factories/IndividualFactory.php b/database/factories/IndividualFactory.php index fbb2732e7..1194fc41e 100644 --- a/database/factories/IndividualFactory.php +++ b/database/factories/IndividualFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Enums\IndividualRole; use App\Models\Individual; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; @@ -26,7 +27,7 @@ public function definition(): array return User::find($attributes['user_id'])->name; }, 'region' => $this->faker->provinceAbbr(), - 'roles' => ['participant'], + 'roles' => [IndividualRole::ConsultationParticipant->value], 'languages' => ['en', 'fr'], 'first_language' => function (array $attributes) { return User::find($attributes['user_id'])->locale; diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php index 7e205329d..96a9b0551 100644 --- a/database/factories/UserFactory.php +++ b/database/factories/UserFactory.php @@ -2,6 +2,7 @@ namespace Database\Factories; +use App\Enums\UserContext; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; @@ -30,7 +31,7 @@ public function definition(): array 'remember_token' => Str::random(10), 'locale' => config('app.locale'), 'theme' => 'system', - 'context' => 'individual', + 'context' => UserContext::Individual->value, 'preferred_contact_person' => 'me', 'preferred_contact_method' => 'email', 'preferred_notification_method' => 'email', diff --git a/database/seeders/TestDataSeeder.php b/database/seeders/TestDataSeeder.php index 1188bc4e4..64fe9aa6c 100644 --- a/database/seeders/TestDataSeeder.php +++ b/database/seeders/TestDataSeeder.php @@ -2,6 +2,8 @@ namespace Database\Seeders; +use App\Enums\OrganizationRole; +use App\Enums\OrganizationType; use App\Enums\ProvinceOrTerritory; use App\Models\Engagement; use App\Models\Identity; @@ -311,6 +313,7 @@ public function run(): void ->get() ->modelKeys() ); + foreach ($individualUser['constituentLanguages'] ?? [] as $code) { $language = Language::firstOrCreate( ['code' => $code], @@ -431,14 +434,24 @@ public function run(): void } $orgsForTesting = [ - // [ - // 'user' => [ - // 'name' => '', - // ], - // 'organization' => [ - - // ], - // ], + [ + 'user' => [ + 'name' => 'Habib Alesi', + 'email' => 'halesi@accessibilityexchange.ca', + 'context' => 'organization', + ], + 'organization' => [ + 'published_at' => now(), + 'type' => OrganizationType::Representative->value, + 'name' => ['en' => 'HA Example Company'], + 'roles' => [OrganizationRole::ConsultationParticipant->value], + 'service_areas' => ['ON'], + 'contact_person_name' => 'Henrietta Mikkelsen', + 'contact_person_email' => 'hmikkelsen@accessibilityexchange.ca', + 'preferred_contact_method' => 'email', + 'preferred_contact_language' => 'en', + ], + ], ]; foreach ($orgsForTesting as $orgUser) { @@ -448,6 +461,7 @@ public function run(): void } $regions = array_column(ProvinceOrTerritory::cases(), 'value'); + $connectorUser = User::whereBlind('email', 'email_index', 'ayhan@accessibilityexchange.ca')->first(); $projectsForTesting = [ [ @@ -476,6 +490,61 @@ public function run(): void ], 'organization' => 'BlueSky Airlines', 'impact' => 'Information technology', + 'engagements' => [ + [ + 'engagement' => [ + 'name' => ['en' => 'Workshop'], + 'languages' => config('locales.supported'), + 'who' => 'individuals', + 'format' => 'workshop', + 'recruitment' => 'open-call', + 'ideal_participants' => 25, + 'minimum_participants' => 15, + 'paid' => true, + 'description' => ['en' => 'This is what we are doing'], + 'signup_by_date' => now()->addMonth(), + 'published_at' => now(), + ], + 'meetings' => [ + [ + 'title' => 'Workshop 1', + 'date' => now()->addMonths(2), + ], + ], + ], + [ + 'engagement' => [ + 'name' => ['en' => 'Focus Group'], + 'languages' => config('locales.supported'), + 'who' => 'individuals', + 'format' => 'focus-group', + 'recruitment' => 'connector', + 'ideal_participants' => 25, + 'minimum_participants' => 15, + 'paid' => true, + 'description' => ['en' => 'This is what we are doing'], + 'signup_by_date' => now()->addMonth(), + 'published_at' => now(), + 'individual_connector_id' => $connectorUser->individual->id, + ], + 'meetings' => [ + [ + 'title' => 'Focus Group 1', + 'date' => now()->addMonths(2), + ], + ], + ], + [ + 'engagement' => [ + 'name' => ['en' => 'Expert Analysis'], + 'languages' => config('locales.supported'), + 'who' => 'organization', + 'paid' => true, + 'description' => ['en' => 'This is what we are doing'], + 'published_at' => now(), + ], + ], + ], ], [ 'project' => [ @@ -523,83 +592,96 @@ public function run(): void ], 'organization' => 'Canada Post', 'impact' => 'Built environment', - ], - ]; - - foreach ($projectsForTesting as $project) { - $proj = Project::factory()->create(array_merge(['projectable_id' => RegulatedOrganization::where('name->en', $project['organization'])->first()->id], $project['project'])); - $proj->impacts()->attach(Impact::where('name->en', $project['impact'])->first()->id); - } - - $connectorUser = User::whereBlind('email', 'email_index', 'ayhan@accessibilityexchange.ca')->first(); - - $engagementsForTesting = [ - [ - 'engagement' => [ - 'name' => ['en' => 'Workshop'], - 'languages' => config('locales.supported'), - 'who' => 'individuals', - 'format' => 'workshop', - 'recruitment' => 'open-call', - 'ideal_participants' => 25, - 'minimum_participants' => 15, - 'paid' => true, - 'description' => ['en' => 'This is what we are doing'], - 'signup_by_date' => now()->addMonth(), - 'published_at' => now(), - ], - 'meetings' => [ + 'engagements' => [ [ - 'title' => 'Workshop 1', - 'date' => now()->addMonths(2), + 'engagement' => [ + 'name' => ['en' => 'Workshop'], + 'languages' => config('locales.supported'), + 'who' => 'individuals', + 'format' => 'workshop', + 'recruitment' => 'connector', + 'ideal_participants' => 25, + 'minimum_participants' => 15, + 'extra_attributes' => [ + 'seeking_community_connector' => true, + ], + 'paid' => true, + 'description' => ['en' => 'This is what we are doing'], + 'signup_by_date' => now()->subMonth(1), + 'published_at' => now()->subMonths(2), + ], + 'meetings' => [ + [ + 'title' => 'Workshop 1', + 'date' => now()->addMonth(), + ], + ], ], ], ], [ - 'engagement' => [ - 'name' => ['en' => 'Focus Group'], - 'languages' => config('locales.supported'), - 'who' => 'individuals', - 'format' => 'focus-group', - 'recruitment' => 'connector', - 'ideal_participants' => 25, - 'minimum_participants' => 15, - 'paid' => true, - 'description' => ['en' => 'This is what we are doing'], - 'signup_by_date' => now()->addMonth(), - 'published_at' => now(), - 'individual_connector_id' => $connectorUser->individual->id, + 'project' => [ + 'projectable_type' => 'App\Models\Organization', + 'name' => ['en' => 'Accessibility Initiative'], + 'languages' => ['en', 'fr'], + 'goals' => ['en' => 'In this project we are looking at our new accessibility initiative.'], + 'scope' => ['en' => 'Both new and existing customers.'], + 'regions' => $regions, + 'start_date' => now()->subMonths(1), + 'end_date' => now()->addMonths(6), + 'outcome_analysis' => ['internal'], + 'outcomes' => ['en' => 'A final online report will be available on our website. '], + 'public_outcomes' => true, + 'team_size' => ['en' => '10'], + 'team_has_disability_or_deaf_lived_experience' => true, + 'contact_person_name' => 'Jessika Vencel', + 'contact_person_email' => 'jvencel@accessibilityexchange.ca', + 'preferred_contact_method' => 'email', + 'contact_person_response_time' => ['en' => '5 business days'], ], - 'meetings' => [ + 'organization' => 'HA Example Company', + 'impact' => 'Information technology', + 'engagements' => [ [ - 'title' => 'Focus Group 1', - 'date' => now()->addMonths(2), + 'engagement' => [ + 'name' => ['en' => 'Co-Design'], + 'languages' => config('locales.supported'), + 'who' => 'individuals', + 'format' => 'workshop', + 'recruitment' => 'open-call', + 'ideal_participants' => 25, + 'minimum_participants' => 15, + 'paid' => false, + 'description' => ['en' => 'This is what we are doing'], + 'signup_by_date' => now()->addMonth(), + 'published_at' => now()->subMonth(), + ], + 'meetings' => [ + [ + 'title' => 'Workshop 1', + 'date' => now()->addMonth(), + ], + ], ], ], ], - [ - 'engagement' => [ - 'name' => ['en' => 'Expert Analysis'], - 'languages' => config('locales.supported'), - 'who' => 'organization', - 'paid' => true, - 'description' => ['en' => 'This is what we are doing'], - 'published_at' => now(), - ], - ], ]; - $project = Project::find(1); + foreach ($projectsForTesting as $project) { + $orgType = $project['project']['projectable_type'] ?? 'App\Models\RegulatedOrganization'; + $proj = Project::factory()->create(array_merge(['projectable_id' => $orgType::where('name->en', $project['organization'])->first()->id], $project['project'])); + $proj->impacts()->attach(Impact::where('name->en', $project['impact'])->first()->id); - foreach ($engagementsForTesting as $engagement) { - $eng = Engagement::factory() - ->for($project) - ->create($engagement['engagement']); + foreach ($project['engagements'] ?? [] as $engagement) { + $eng = Engagement::factory() + ->for($proj) + ->create($engagement['engagement']); - foreach ($engagement['meetings'] ?? [] as $meeting) { - Meeting::factory() - ->for($eng) - ->create($meeting); + foreach ($engagement['meetings'] ?? [] as $meeting) { + Meeting::factory() + ->for($eng) + ->create($meeting); + } } } } diff --git a/database/seeders/data/Interpretations.json b/database/seeders/data/Interpretations.json index df0d8e4d6..0be1bf71f 100644 --- a/database/seeders/data/Interpretations.json +++ b/database/seeders/data/Interpretations.json @@ -804,6 +804,22 @@ "name": "Getting started", "namespace": "getting_started" }, + { + "name": "Getting started", + "namespace": "getting_started-individual" + }, + { + "name": "Current step", + "namespace": "getting_started" + }, + { + "name": "Next steps", + "namespace": "getting_started" + }, + { + "name": "Completed steps", + "namespace": "getting_started" + }, { "name": "Customize this website’s accessibility", "namespace": "getting_started-customize" @@ -817,42 +833,57 @@ "namespace": "getting_started-invite_to_regulated_org" }, { - "name": "Create a public page", - "namespace": "getting_started-individual", - "video": { - "asl": "https://vimeo.com/884468647/1b8077baf2" - } + "name": "Sign up and attend an orientation session", + "namespace": "getting_started-individual" }, { - "name": "Enter your collaboration preferences", - "namespace": "getting_started-individual", + "name": "Sign up and attend an orientation session", + "namespace": "getting_started-individual-link" + }, + { + "name": "Pick your role", + "namespace": "getting_started-individual" + }, + { + "name": "Pick your role", + "namespace": "getting_started-individual-link" + }, + { + "name": "This will show up once you pick your role.", + "namespace": "getting_started-individual" + }, + { + "name": "Fill in your collaboration preferences", + "namespace": "getting_started-individual" + }, + { + "name": "Fill in your collaboration preferences", + "namespace": "getting_started-individual-link", "video": { "asl": "https://vimeo.com/884468663/f81a471eee" } }, { - "name": "Sign up and attend an orientation session", - "namespace": "getting_started-individual", - "video": { - "asl": "https://vimeo.com/884468690/f0d7ff4d4a" - } + "name": "There are no next steps. After this you’ll be able to sign up for engagements!", + "namespace": "getting_started-individual" }, { - "name": "I’ve gone to orientation, why isn’t this updated?", + "name": "Fill out and return your application", "namespace": "getting_started-individual" }, { "name": "Fill out and return your application", - "namespace": "getting_started-individual", - "video": { - "asl": "https://vimeo.com/884468747/8d64e76e0e" - } + "namespace": "getting_started-individual-link" }, { - "name": "Review and publish your public page", - "namespace": "getting_started-individual", + "name": "Create a public page", + "namespace": "getting_started-individual" + }, + { + "name": "Create a public page", + "namespace": "getting_started-individual-link", "video": { - "asl": "https://vimeo.com/884468760/2bc6aad695" + "asl": "https://vimeo.com/884468647/1b8077baf2" } }, { @@ -1387,7 +1418,7 @@ "namespace": "notification_message" }, { - "name": "Your agreement has been received", + "name": "Your signed agreement has been received", "namespace": "notification_message", "video": { "lsq": "https://vimeo.com/850176147/a4656f355b" @@ -1410,7 +1441,7 @@ } }, { - "name": "Your estimate has been returned", + "name": "Engagement estimate has been submitted for your approval", "namespace": "notification_message", "video": { "lsq": "https://vimeo.com/850176184/57b6fadba7" @@ -1487,6 +1518,126 @@ } ] }, + "engagements.index": { + "interpretations": [ + { + "name": "Browse all engagements", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626211/a7ceddc70f", + "lsq": "https://vimeo.com/871102846/fd296fb804" + } + }, + { + "name": "Filters", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626227/8c7fee6dbc", + "lsq": "https://vimeo.com/871102874/6b924fe830" + } + }, + { + "name": "Sign up", + "namespace": "browse-engagements" + }, + { + "name": "Format", + "namespace": "browse-engagements" + }, + { + "name": "Who they’re seeking", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626260/23d416f641", + "lsq": "https://vimeo.com/871102918/eb8f110783" + } + }, + { + "name": "Initiated by", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626281/5c7d2101f3", + "lsq": "https://vimeo.com/871102941/929a034680" + } + }, + { + "name": "Disability and Deaf groups they are looking for", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626305/23b208bff2", + "lsq": "https://vimeo.com/871102982/28846c83b3" + } + }, + { + "name": "Virtual or in-person", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626324/1f74205218", + "lsq": "https://vimeo.com/871103006/cc26a7c058" + } + }, + { + "name": "Participant location", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626335/9b31693dab", + "lsq": "https://vimeo.com/871103022/cddd58b797" + } + }, + { + "name": "Compensation", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626348/99c659060d", + "lsq": "https://vimeo.com/871103043/c307a7fb28" + } + }, + { + "name": "Sectors", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626362/c2377f9e88", + "lsq": "https://vimeo.com/871103066/9c6680141e" + } + }, + { + "name": "Areas of impact", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626378/f283e2cce0", + "lsq": "https://vimeo.com/871103087/f63587c135" + } + }, + { + "name": "Recruitment method", + "namespace": "browse-engagements", + "video": { + "asl": "https://vimeo.com/846626396/58ed12a5b7", + "lsq": "https://vimeo.com/871103109/1ac3e269f1" + } + } + ] + }, + "engagements.joined": { + "interpretations": [ + { + "name": "Engagements I’ve joined", + "namespace": "engagements-joined" + }, + { + "name": "Joined as a Community Connector", + "namespace": "engagements-joined" + }, + { + "name": "Joined as a Consultation Participant", + "namespace": "engagements-joined" + }, + { + "name": "Completed engagements", + "namespace": "engagements-joined" + } + ] + }, "engagements.add-connector": { "interpretations": [ { @@ -3138,106 +3289,6 @@ } ] }, - "projects.all-projects": { - "interpretations": [ - { - "name": "Browse all projects", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626211/a7ceddc70f", - "lsq": "https://vimeo.com/871102846/fd296fb804" - } - }, - { - "name": "Filters", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626227/8c7fee6dbc", - "lsq": "https://vimeo.com/871102874/6b924fe830" - } - }, - { - "name": "Status", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626240/1407c8043e", - "lsq": "https://vimeo.com/871102891/1345849aa0" - } - }, - { - "name": "Who they’re seeking", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626260/23d416f641", - "lsq": "https://vimeo.com/871102918/eb8f110783" - } - }, - { - "name": "Initiated by", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626281/5c7d2101f3", - "lsq": "https://vimeo.com/871102941/929a034680" - } - }, - { - "name": "Disability and Deaf groups they are looking for", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626305/23b208bff2", - "lsq": "https://vimeo.com/871102982/28846c83b3" - } - }, - { - "name": "Virtual or in-person", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626324/1f74205218", - "lsq": "https://vimeo.com/871103006/cc26a7c058" - } - }, - { - "name": "Participant location", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626335/9b31693dab", - "lsq": "https://vimeo.com/871103022/cddd58b797" - } - }, - { - "name": "Compensation", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626348/99c659060d", - "lsq": "https://vimeo.com/871103043/c307a7fb28" - } - }, - { - "name": "Sectors", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626362/c2377f9e88", - "lsq": "https://vimeo.com/871103066/9c6680141e" - } - }, - { - "name": "Areas of impact", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626378/f283e2cce0", - "lsq": "https://vimeo.com/871103087/f63587c135" - } - }, - { - "name": "Recruitment method", - "namespace": "all_projects", - "video": { - "asl": "https://vimeo.com/846626396/58ed12a5b7", - "lsq": "https://vimeo.com/871103109/1ac3e269f1" - } - } - ] - }, "projects.create": { "interpretations": [ { @@ -3501,103 +3552,22 @@ } ] }, - "projects.my-contracted-projects": { + "projects.my-projects": { "interpretations": [ { - "name": "Projects", - "video": { - "asl": "https://vimeo.com/845066045/3137119624", - "lsq": "https://vimeo.com/850171756/1c18636464" - } - }, - { - "name": "Projects I am contracted for", - "namespace": "projects_contracted-individual", - "video": { - "asl": "https://vimeo.com/861740684/f479f4da6f", - "lsq": "https://vimeo.com/884545098/32229e2a53" - } - }, - { - "name": "Projects I am contracted for", - "namespace": "projects_contracted-organization", - "video": { - "asl": "https://vimeo.com/845066100/625bbcbd99", - "lsq": "https://vimeo.com/887711232/554bf873e6" - } + "name": "Projects my organization has created" }, { - "name": "In progress", - "namespace": "projects_contracted-individual" - }, - { - "name": "Upcoming", - "namespace": "projects_contracted-individual" - }, - { - "name": "Completed", - "namespace": "projects_contracted-individual" - }, - { - "name": "In progress", - "namespace": "projects_contracted-organization" - }, - { - "name": "Upcoming", - "namespace": "projects_contracted-organization" - }, - { - "name": "Completed", - "namespace": "projects_contracted-organization" - }, - { - "name": "Browse all projects", - "video": { - "asl": "https://vimeo.com/845066070/884ba7d2c6", - "lsq": "https://vimeo.com/850171821/39d0e84a22" - } - }, - { - "name": "Projects I am participating in", - "video": { - "asl": "https://vimeo.com/845066057/8b3a3c70d1", - "lsq": "https://vimeo.com/850171798/6e48dc7160" - } + "name": "Draft" }, { - "name": "Projects I am running", - "video": { - "asl": "https://vimeo.com/845066159/f09df68717", - "lsq": "https://vimeo.com/887717474/b190c732ae" - } + "name": "In progress" }, { - "name": "Draft" - } - ] - }, - "projects.my-projects": { - "interpretations": [ - { - "name": "Projects", - "video": { - "asl": "https://vimeo.com/845013591/03625eb673", - "lsq": "https://vimeo.com/861747485/36f98ae704" - } + "name": "Upcoming" }, { - "name": "Browse all projects" - } - ] - }, - "projects.my-running-projects": { - "interpretations": [ - { - "name": "Projects I am running", - "video": { - "asl": "https://vimeo.com/845048016/00df4ffbcd", - "lsq": "https://vimeo.com/850175074/96fee0a5d0" - } + "name": "Completed" } ] }, @@ -4096,6 +4066,9 @@ "asl": "https://vimeo.com/845049912/2baed11817", "lsq": "https://vimeo.com/871137322/b78435aef9" } + }, + { + "name": "About" } ] }, @@ -4107,6 +4080,19 @@ "asl": "https://vimeo.com/845049953/a83136dada", "lsq": "https://vimeo.com/850176016/d00dbf674f" } + }, + { + "name": "Projects" + } + ] + }, + "regulated-organizations.show-contact-information": { + "interpretations": [ + { + "name": "Contact information" + }, + { + "name": "contact person" } ] }, diff --git a/database/settings/2024_04_11_190038_consolidate_application_links_in_general_settings.php b/database/settings/2024_04_11_190038_consolidate_application_links_in_general_settings.php new file mode 100644 index 000000000..becdbb784 --- /dev/null +++ b/database/settings/2024_04_11_190038_consolidate_application_links_in_general_settings.php @@ -0,0 +1,16 @@ +<?php + +use Spatie\LaravelSettings\Migrations\SettingsMigration; + +return new class extends SettingsMigration +{ + public function up(): void + { + $this->migrator->delete('general.ac_application'); + $this->migrator->delete('general.cc_application'); + $this->migrator->add('general.ac_cc_application', [ + 'en' => 'https://share.hsforms.com/1UZjxoUCFRJmcnK8ULsPowwdfpez', + 'fr' => 'https://share.hsforms.com/1M0wCcgQwSQ27eBra_asFxwdfpez', + ]); + } +}; diff --git a/docker-compose.local.yml b/docker-compose.local.yml index 4ecd2f20a..7bb499830 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -1,6 +1,5 @@ -version: '3' +version: "3" services: - platform.proxy: build: context: ./.local-deploy/accessibility-proxy/ @@ -14,7 +13,7 @@ services: networks: - network.platform.proxy ports: - - '${APP_PORT:-80}:80' + - "${APP_PORT:-80}:80" - 443:443 platform.test: @@ -22,7 +21,7 @@ services: context: ./ dockerfile: ./.kube/app/Dockerfile args: - CIPHERSWEET_KEY: '${CIPHERSWEET_KEY}' + CIPHERSWEET_KEY: "${CIPHERSWEET_KEY}" container_name: platform.test # extra_hosts: # - 'host.docker.internal:host-gateway' @@ -31,18 +30,18 @@ services: USER_ID: $WWWUSER # change to your numerical user id so that you can work on files in real time and have write privileges entrypoint: /tmp/entrypoint.sh # override entrypoint file volumes: - - './app:/app/app' - - './config:/app/config' - - './database:/app/database' - - './routes:/app/routes' - - './tests:/app/tests' - - './public:/app/public' - - './resources:/app/resources' - - 'volume.platform.test:/opt/data' - - './.local-deploy/accessibility-app/entrypoint.sh:/tmp/entrypoint.sh' # create different entrypoint file - - './.local-deploy/accessibility-app/etc/nginx/includes:/etc/nginx/includes' # add include for http & https blocks - - './.local-deploy/accessibility-app/etc/nginx/nginx.conf:/etc/nginx/nginx.conf' # replace primary nginx config - - './.local-deploy/accessibility-app/php.ini-development:/usr/local/etc/php/php.ini-development' # Deploy development php settings + - "./app:/app/app" + - "./config:/app/config" + - "./database:/app/database" + - "./routes:/app/routes" + - "./tests:/app/tests" + - "./public:/app/public" + - "./resources:/app/resources" + - "volume.platform.test:/opt/data" + - "./.local-deploy/accessibility-app/entrypoint.sh:/tmp/entrypoint.sh" # create different entrypoint file + - "./.local-deploy/accessibility-app/etc/nginx/includes:/etc/nginx/includes" # add include for http & https blocks + - "./.local-deploy/accessibility-app/etc/nginx/nginx.conf:/etc/nginx/nginx.conf" # replace primary nginx config + - "./.local-deploy/accessibility-app/php.ini-development:/usr/local/etc/php/php.ini-development" # Deploy development php settings networks: - network.platform.mail - network.platform.mysql @@ -58,7 +57,7 @@ services: platform.selenium: condition: service_started healthcheck: - test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:8080/nginx_status"] + test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:8080/nginx_status"] retries: 3 timeout: 5s @@ -66,13 +65,13 @@ services: container_name: platform.mysql image: docker.io/bitnami/mysql:8.0 ports: - - '${FORWARD_DB_PORT:-3306}:3306' + - "${FORWARD_DB_PORT:-3306}:3306" environment: - MYSQL_DATABASE: '${DB_DATABASE}' - MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' + MYSQL_DATABASE: "${DB_DATABASE}" + MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}" volumes: - - 'volume.platform.mysql:/bitnami/mysql/data' - - '.local-deploy/accessibility-db/opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf' + - "volume.platform.mysql:/bitnami/mysql/data" + - ".local-deploy/accessibility-db/opt/bitnami/mysql/conf/my_custom.cnf:/opt/bitnami/mysql/conf/my_custom.cnf" networks: - network.platform.mysql healthcheck: @@ -82,15 +81,15 @@ services: platform.redis: container_name: platform.redis - image: 'bitnami/redis' + image: "bitnami/redis" ports: - - '${FORWARD_REDIS_PORT:-}:6379' + - "${FORWARD_REDIS_PORT:-}:6379" environment: - REDIS_HOST: '${REDIS_HOST}' - REDIS_PASSWORD: '${REDIS_PASSWORD}' - REDIS_PORT: '${REDIS_PORT}' + REDIS_HOST: "${REDIS_HOST}" + REDIS_PASSWORD: "${REDIS_PASSWORD}" + REDIS_PORT: "${REDIS_PORT}" volumes: - - 'volume.platform.redis:/data' + - "volume.platform.redis:/data" networks: - network.platform.redis healthcheck: @@ -100,32 +99,32 @@ services: platform.meilisearch: container_name: platform.meilisearch - image: 'getmeili/meilisearch:latest' + image: "getmeili/meilisearch:latest" ports: - - '${FORWARD_MEILISEARCH_PORT:-7700}:7700' + - "${FORWARD_MEILISEARCH_PORT:-7700}:7700" volumes: - - 'volume.platform.meilisearch:/data.ms' + - "volume.platform.meilisearch:/data.ms" networks: - network.platform.mail healthcheck: - test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"] + test: ["CMD", "wget", "--no-verbose", "--spider", "http://0.0.0.0:7700/health"] retries: 3 timeout: 5s platform.mailpit: container_name: platform.mailpit - image: 'axllent/mailpit:latest' + image: "axllent/mailpit:latest" ports: - - '${FORWARD_MAILHOG_PORT:-1025}:1025' - - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025' + - "${FORWARD_MAILHOG_PORT:-1025}:1025" + - "${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025" networks: - network.platform.mail platform.selenium: container_name: platform.selenium - image: 'selenium/standalone-chrome' + image: "selenium/standalone-chrome" volumes: - - '/dev/shm:/dev/shm' + - "/dev/shm:/dev/shm" networks: - network.platform.mail diff --git a/package-lock.json b/package-lock.json index fcfd44fb4..17619f12c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,7 @@ "name": "@accessibility-exchange/platform", "hasInstallScript": true, "dependencies": { - "@vimeo/player": "^2.20.1", + "@vimeo/player": "^2.22.0", "axios": "^1.6.0", "infusion": "^4.6.0", "luxon": "^3.4.3", @@ -24,27 +24,27 @@ "eslint-config-fluid": "^2.1.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsonc": "^2.13.0", - "husky": "^8.0.3", + "husky": "^9.0.11", "laravel-vite-plugin": "^1.0.2", "lint-staged": "^15.2.0", "modern-css-reset": "^1.4.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.35", - "postcss-custom-media": "^10.0.2", + "postcss": "^8.4.38", + "postcss-custom-media": "^10.0.7", "postcss-import": "^16.0.0", "postcss-import-ext-glob": "^2.1.1", - "postcss-logical": "^7.0.0", - "prettier": "^3.0.3", - "stylelint": "^16.2.0", + "postcss-logical": "^7.0.1", + "prettier": "^3.2.5", + "stylelint": "^16.6.1", "stylelint-config-standard": "^36.0.0", "stylelint-order": "^6.0.4", - "stylelint-plugin-logical-css": "^1.0.0", + "stylelint-plugin-logical-css": "^1.2.0", "tailwindcss": "^3.4.1", "tippy.js": "^6.3.7", - "vite": "^5.1.5", + "vite": "^5.3.2", "vite-plugin-full-reload": "^1.1.0", "vite-plugin-manifest-sri": "^0.2.0", - "vite-plugin-static-copy": "^1.0.1" + "vite-plugin-static-copy": "^1.0.2" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -569,9 +569,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.7.tgz", - "integrity": "sha512-9J4aMRJ7A2WRjaRLvsMeWrL69FmEuijtiW1XlK/sG+V0UJiHVYUyvj9mY4WAXfU/hGIiGOgL8e0jJcRyaZTjDQ==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.12.tgz", + "integrity": "sha512-iNCCOnaoycAfcIot3v/orjkTol+j8+Z5xgpqxUpZSdqeaxCADQZtldHhlvzDipmi7OoWdcJUO6DRZcnkMSBEIg==", "dev": true, "funding": [ { @@ -587,14 +587,14 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.5.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.7.0", + "@csstools/css-tokenizer": "^2.3.2" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.5.0.tgz", - "integrity": "sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.0.tgz", + "integrity": "sha512-qvBMcOU/uWFCH/VO0MYe0AMs0BGMWAt6FTryMbFIKYtZtVnqTZtT8ktv5o718llkaGZWomJezJZjq3vJDHeJNQ==", "dev": true, "funding": [ { @@ -610,13 +610,13 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-tokenizer": "^2.3.2" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.3.tgz", + "integrity": "sha512-fTaF0vRcXVJ4cmwg8nHofydDjitKMDBzC8cCu+O/Lg13C4PdkC15GVjGpbmWauOOnhomVSTg5I5LpLJFJE2Hfw==", "dev": true, "funding": [ { @@ -633,9 +633,9 @@ } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.7.tgz", - "integrity": "sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.12.tgz", + "integrity": "sha512-t1/CdyVJzOQUiGUcIBXRzTAkWTFPxiPnoKwowKW2z9Uj78c2bBWI/X94BeVfUwVq1xtCjD7dnO8kS6WONgp8Jw==", "dev": true, "funding": [ { @@ -651,8 +651,18 @@ "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.5.0", - "@csstools/css-tokenizer": "^2.2.3" + "@csstools/css-parser-algorithms": "^2.7.0", + "@csstools/css-tokenizer": "^2.3.2" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/@es-joy/jsdoccomment": { @@ -670,9 +680,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -686,9 +696,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -702,9 +712,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -718,9 +728,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -734,9 +744,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -750,9 +760,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -766,9 +776,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -782,9 +792,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -798,9 +808,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -814,9 +824,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -830,9 +840,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -846,9 +856,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -862,9 +872,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -878,9 +888,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -894,9 +904,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -910,9 +920,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -926,9 +936,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -942,9 +952,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -958,9 +968,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -974,9 +984,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -990,9 +1000,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -1006,9 +1016,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -1022,9 +1032,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -1126,102 +1136,6 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -1308,16 +1222,6 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -1329,9 +1233,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], @@ -1342,9 +1246,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], @@ -1355,9 +1259,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], @@ -1368,9 +1272,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -1381,9 +1285,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], @@ -1394,9 +1311,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], @@ -1407,9 +1324,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], @@ -1419,10 +1336,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], @@ -1432,10 +1362,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], @@ -1446,9 +1389,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], @@ -1459,9 +1402,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], @@ -1472,9 +1415,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], @@ -1485,9 +1428,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -1626,9 +1569,9 @@ "dev": true }, "node_modules/@vimeo/player": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/@vimeo/player/-/player-2.20.1.tgz", - "integrity": "sha512-eoKkqsMY33RQn8lFtlUbb3uo+xDL3V8PTN01SdrJ1E9PI+5pLyqNGh/GO/2EyX9Vr6antLm0/v36ABF2rcwXIQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@vimeo/player/-/player-2.22.0.tgz", + "integrity": "sha512-IIJlmZDBOkpYuRWRU4ptqIMNQwNhzI7pdYkeizh9DfuRzxOWzuxopOlX84hKeSzpI3KS9cD9MSAaEZ8j4Jg0kg==", "dependencies": { "native-promise-only": "0.8.1", "weakmap-polyfill": "2.0.4" @@ -1787,8 +1730,9 @@ }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -1993,11 +1937,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2436,9 +2381,9 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", "dev": true, "engines": { "node": ">=12 || >=16" @@ -2585,12 +2530,6 @@ "node": ">=8" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/editorconfig": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", @@ -2711,9 +2650,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2723,29 +2662,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { @@ -3140,9 +3079,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3193,9 +3133,9 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/fluid-resolve": { @@ -3222,34 +3162,6 @@ } } }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3614,24 +3526,24 @@ } }, "node_modules/husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", "dev": true, "bin": { - "husky": "lib/bin.js" + "husky": "bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/typicode" } }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -3844,8 +3756,9 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -3980,24 +3893,6 @@ "dev": true, "license": "ISC" }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", @@ -4193,9 +4088,9 @@ } }, "node_modules/known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", + "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", "dev": true }, "node_modules/laravel-vite-plugin": { @@ -4833,15 +4728,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/modern-css-reset": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/modern-css-reset/-/modern-css-reset-1.4.0.tgz", @@ -5308,31 +5194,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } - }, "node_modules/path-type": { "version": "4.0.0", "dev": true, @@ -5348,9 +5209,10 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "dev": true, - "license": "ISC" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -5393,9 +5255,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -5414,16 +5276,16 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-custom-media": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.2.tgz", - "integrity": "sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.7.tgz", + "integrity": "sha512-o2k5nnvRZhF36pr1fGFM7a1EMTcNdKNO70Tp1g2lfpYgiwIctR7ic4acBCDHBMYRcQ8mFlaBB1QsEywqrSIaFQ==", "dev": true, "funding": [ { @@ -5436,10 +5298,10 @@ } ], "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.5", - "@csstools/css-parser-algorithms": "^2.3.2", - "@csstools/css-tokenizer": "^2.2.1", - "@csstools/media-query-list-parser": "^2.1.5" + "@csstools/cascade-layer-name-parser": "^1.0.12", + "@csstools/css-parser-algorithms": "^2.7.0", + "@csstools/css-tokenizer": "^2.3.2", + "@csstools/media-query-list-parser": "^2.1.12" }, "engines": { "node": "^14 || ^16 || >=18" @@ -5528,9 +5390,9 @@ } }, "node_modules/postcss-logical": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.0.tgz", - "integrity": "sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.1.tgz", + "integrity": "sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==", "dev": true, "funding": [ { @@ -5652,9 +5514,9 @@ } }, "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -5880,9 +5742,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -5895,19 +5757,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, @@ -6028,9 +5893,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6122,30 +5987,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, @@ -6205,19 +6046,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "dev": true, @@ -6251,48 +6079,59 @@ } }, "node_modules/stylelint": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz", - "integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.6.1.tgz", + "integrity": "sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], "dependencies": { - "@csstools/css-parser-algorithms": "^2.5.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.7", - "@csstools/selector-specificity": "^3.0.1", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11", + "@csstools/selector-specificity": "^3.1.1", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.1", + "css-functions-list": "^3.2.2", "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^9.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.0", + "ignore": "^5.3.1", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", + "known-css-properties": "^0.31.0", "mathml-tag-names": "^2.1.3", - "meow": "^13.1.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.7", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.33", + "picocolors": "^1.0.1", + "postcss": "^8.4.38", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.0.15", + "postcss-selector-parser": "^6.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", + "table": "^6.8.2", "write-file-atomic": "^5.0.1" }, "bin": { @@ -6300,10 +6139,6 @@ }, "engines": { "node": ">=18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" } }, "node_modules/stylelint-config-recommended": { @@ -6347,9 +6182,9 @@ } }, "node_modules/stylelint-plugin-logical-css": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stylelint-plugin-logical-css/-/stylelint-plugin-logical-css-1.0.0.tgz", - "integrity": "sha512-8cv0M59brhqR6V5yCzo/LNZZ2ePyaEaNeqLOPXxSyZVhOfyPamrLTvKvAX4F7o9W1uMbysHBlThcF7voMNLsZQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stylelint-plugin-logical-css/-/stylelint-plugin-logical-css-1.2.0.tgz", + "integrity": "sha512-WSyG6LhUyrw+Qqu1qDbAtnkG1eqdI1eQG80MWhFGM0hj8veiJD8Z8Trgmo8dUaxBOQosAF7z081PXFqZhKymNg==", "dev": true, "engines": { "node": ">=18.12.0" @@ -6359,9 +6194,9 @@ } }, "node_modules/stylelint/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.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", + "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", "dev": true, "funding": [ { @@ -6397,21 +6232,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stylelint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/stylelint/node_modules/brace-expansion/node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, "node_modules/stylelint/node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -6439,57 +6259,34 @@ } }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", + "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", "dev": true, "dependencies": { - "flat-cache": "^4.0.0" + "flat-cache": "^5.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=18" } }, "node_modules/stylelint/node_modules/flat-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.0.tgz", - "integrity": "sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/stylelint/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", "dev": true, "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "flatted": "^3.3.1", + "keyv": "^4.5.4" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, "node_modules/stylelint/node_modules/meow": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.1.0.tgz", - "integrity": "sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, "engines": { "node": ">=18" @@ -6498,25 +6295,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylelint/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/stylelint/node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.6" } }, "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -6526,24 +6321,6 @@ "node": ">=4" } }, - "node_modules/stylelint/node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/stylelint/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -6663,9 +6440,9 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "dependencies": { "ajv": "^8.0.1", @@ -6679,15 +6456,15 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -6866,8 +6643,9 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -7103,14 +6881,14 @@ } }, "node_modules/vite": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", - "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -7174,9 +6952,9 @@ "dev": true }, "node_modules/vite-plugin-static-copy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.1.tgz", - "integrity": "sha512-3eGL4mdZoPJMDBT68pv/XKIHR4MgVolStIxxv1gIBP4R8TpHn9C9EnaU0hesqlseJ4ycLGUxckFTu/jpuJXQlA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.2.tgz", + "integrity": "sha512-AfmEF+a/mfjsUsrgjbCkhzUCeIUF4EKQXXt3Ie1cour9MBpy6f6GphbdW2td28oYfOrwCyRzFCksgLkpk58q6Q==", "dev": true, "dependencies": { "chokidar": "^3.5.3", @@ -7261,24 +7039,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "dev": true, @@ -7770,32 +7530,38 @@ } }, "@csstools/cascade-layer-name-parser": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.7.tgz", - "integrity": "sha512-9J4aMRJ7A2WRjaRLvsMeWrL69FmEuijtiW1XlK/sG+V0UJiHVYUyvj9mY4WAXfU/hGIiGOgL8e0jJcRyaZTjDQ==", + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.12.tgz", + "integrity": "sha512-iNCCOnaoycAfcIot3v/orjkTol+j8+Z5xgpqxUpZSdqeaxCADQZtldHhlvzDipmi7OoWdcJUO6DRZcnkMSBEIg==", "dev": true, "requires": {} }, "@csstools/css-parser-algorithms": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.5.0.tgz", - "integrity": "sha512-abypo6m9re3clXA00eu5syw+oaPHbJTPapu9C4pzNsJ4hdZDzushT50Zhu+iIYXgEe1CxnRMn7ngsbV+MLrlpQ==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.0.tgz", + "integrity": "sha512-qvBMcOU/uWFCH/VO0MYe0AMs0BGMWAt6FTryMbFIKYtZtVnqTZtT8ktv5o718llkaGZWomJezJZjq3vJDHeJNQ==", "dev": true, "requires": {} }, "@csstools/css-tokenizer": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz", - "integrity": "sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.3.tgz", + "integrity": "sha512-fTaF0vRcXVJ4cmwg8nHofydDjitKMDBzC8cCu+O/Lg13C4PdkC15GVjGpbmWauOOnhomVSTg5I5LpLJFJE2Hfw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.7.tgz", - "integrity": "sha512-lHPKJDkPUECsyAvD60joYfDmp8UERYxHGkFfyLJFTVK/ERJe0sVlIFLXU5XFxdjNDTerp5L4KeaKG+Z5S94qxQ==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.12.tgz", + "integrity": "sha512-t1/CdyVJzOQUiGUcIBXRzTAkWTFPxiPnoKwowKW2z9Uj78c2bBWI/X94BeVfUwVq1xtCjD7dnO8kS6WONgp8Jw==", "dev": true, "requires": {} }, + "@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, "@es-joy/jsdoccomment": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.32.0.tgz", @@ -7808,163 +7574,163 @@ } }, "@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "dev": true, "optional": true }, @@ -8029,71 +7795,6 @@ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, "@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -8159,13 +7860,6 @@ "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", "dev": true }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, "@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -8173,93 +7867,114 @@ "dev": true }, "@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "dev": true, "optional": true }, @@ -8373,9 +8088,9 @@ "dev": true }, "@vimeo/player": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/@vimeo/player/-/player-2.20.1.tgz", - "integrity": "sha512-eoKkqsMY33RQn8lFtlUbb3uo+xDL3V8PTN01SdrJ1E9PI+5pLyqNGh/GO/2EyX9Vr6antLm0/v36ABF2rcwXIQ==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/@vimeo/player/-/player-2.22.0.tgz", + "integrity": "sha512-IIJlmZDBOkpYuRWRU4ptqIMNQwNhzI7pdYkeizh9DfuRzxOWzuxopOlX84hKeSzpI3KS9cD9MSAaEZ8j4Jg0kg==", "requires": { "native-promise-only": "0.8.1", "weakmap-polyfill": "2.0.4" @@ -8491,6 +8206,8 @@ }, "astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "asynckit": { @@ -8635,10 +8352,12 @@ } }, "braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browserslist": { @@ -8919,9 +8638,9 @@ } }, "css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz", + "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==", "dev": true }, "css-tree": { @@ -9014,12 +8733,6 @@ "is-obj": "^2.0.0" } }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "editorconfig": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz", @@ -9111,34 +8824,34 @@ } }, "esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "escalade": { @@ -9418,7 +9131,9 @@ } }, "fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -9455,9 +9170,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "fluid-resolve": { @@ -9470,24 +9185,6 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, - "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "dependencies": { - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - } - } - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -9717,15 +9414,15 @@ "dev": true }, "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "version": "9.0.11", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz", + "integrity": "sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==", "dev": true }, "ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "import-fresh": { @@ -9854,6 +9551,8 @@ }, "is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { @@ -9929,16 +9628,6 @@ "version": "2.0.0", "dev": true }, - "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, "jiti": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", @@ -10085,9 +9774,9 @@ "dev": true }, "known-css-properties": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", - "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", + "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", "dev": true }, "laravel-vite-plugin": { @@ -10532,12 +10221,6 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true - }, "modern-css-reset": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/modern-css-reset/-/modern-css-reset-1.4.0.tgz", @@ -10841,24 +10524,6 @@ "version": "1.0.7", "dev": true }, - "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", - "dev": true, - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", - "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", - "dev": true - } - } - }, "path-type": { "version": "4.0.0", "dev": true @@ -10870,7 +10535,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -10894,26 +10561,26 @@ "dev": true }, "postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "requires": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" } }, "postcss-custom-media": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.2.tgz", - "integrity": "sha512-zcEFNRmDm2fZvTPdI1pIW3W//UruMcLosmMiCdpQnrCsTRzWlKQPYMa1ud9auL0BmrryKK1+JjIGn19K0UjO/w==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.7.tgz", + "integrity": "sha512-o2k5nnvRZhF36pr1fGFM7a1EMTcNdKNO70Tp1g2lfpYgiwIctR7ic4acBCDHBMYRcQ8mFlaBB1QsEywqrSIaFQ==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^1.0.5", - "@csstools/css-parser-algorithms": "^2.3.2", - "@csstools/css-tokenizer": "^2.2.1", - "@csstools/media-query-list-parser": "^2.1.5" + "@csstools/cascade-layer-name-parser": "^1.0.12", + "@csstools/css-parser-algorithms": "^2.7.0", + "@csstools/css-tokenizer": "^2.3.2", + "@csstools/media-query-list-parser": "^2.1.12" } }, "postcss-import": { @@ -10958,9 +10625,9 @@ } }, "postcss-logical": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.0.tgz", - "integrity": "sha512-zYf3vHkoW82f5UZTEXChTJvH49Yl9X37axTZsJGxrCG2kOUwtaAoz9E7tqYg0lsIoJLybaL8fk/2mOi81zVIUw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-7.0.1.tgz", + "integrity": "sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -11026,9 +10693,9 @@ "dev": true }, "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true }, "proto-list": { @@ -11174,24 +10841,27 @@ } }, "rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", - "dev": true, - "requires": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "@types/estree": "1.0.5", "fsevents": "~2.3.2" } @@ -11265,9 +10935,9 @@ } }, "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true }, "spdx-correct": { @@ -11334,25 +11004,6 @@ } } }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - } - } - }, "string.prototype.padend": { "version": "3.1.3", "dev": true, @@ -11385,15 +11036,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, "strip-bom": { "version": "3.0.0", "dev": true @@ -11411,55 +11053,56 @@ "dev": true }, "stylelint": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz", - "integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.6.1.tgz", + "integrity": "sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==", "dev": true, "requires": { - "@csstools/css-parser-algorithms": "^2.5.0", - "@csstools/css-tokenizer": "^2.2.3", - "@csstools/media-query-list-parser": "^2.1.7", - "@csstools/selector-specificity": "^3.0.1", + "@csstools/css-parser-algorithms": "^2.6.3", + "@csstools/css-tokenizer": "^2.3.1", + "@csstools/media-query-list-parser": "^2.1.11", + "@csstools/selector-specificity": "^3.1.1", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.1", + "css-functions-list": "^3.2.2", "css-tree": "^2.3.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^8.0.0", + "file-entry-cache": "^9.0.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", - "ignore": "^5.3.0", + "ignore": "^5.3.1", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.29.0", + "known-css-properties": "^0.31.0", "mathml-tag-names": "^2.1.3", - "meow": "^13.1.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.7", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.33", + "picocolors": "^1.0.1", + "postcss": "^8.4.38", "postcss-resolve-nested-selector": "^0.1.1", "postcss-safe-parser": "^7.0.0", - "postcss-selector-parser": "^6.0.15", + "postcss-selector-parser": "^6.1.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "strip-ansi": "^7.1.0", "supports-hyperlinks": "^3.0.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", + "table": "^6.8.2", "write-file-atomic": "^5.0.1" }, "dependencies": { "@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.1.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz", + "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", "dev": true, "requires": {} }, @@ -11473,23 +11116,6 @@ "version": "2.0.0", "dev": true }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - } - } - }, "cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -11503,72 +11129,50 @@ } }, "file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", + "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", "dev": true, "requires": { - "flat-cache": "^4.0.0" + "flat-cache": "^5.0.0" } }, "flat-cache": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.0.tgz", - "integrity": "sha512-EryKbCE/wxpxKniQlyas6PY1I9vwtF3uCBweX+N8KYTCn3Y12RTGtQAJ/bd5pl7kxUAc8v/R3Ake/N17OZiFqA==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.4", - "rimraf": "^5.0.5" - } - }, - "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", "dev": true, "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "flatted": "^3.3.1", + "keyv": "^4.5.4" } }, "meow": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.1.0.tgz", - "integrity": "sha512-o5R/R3Tzxq0PJ3v3qcQJtSvSE9nKOLSAaDuuoMzDVuGTwHdccMWcYomh9Xolng2tjT6O/Y83d+0coVGof6tqmA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" } }, "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, - "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "requires": { - "glob": "^10.3.7" - } - }, "strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -11607,9 +11211,9 @@ } }, "stylelint-plugin-logical-css": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stylelint-plugin-logical-css/-/stylelint-plugin-logical-css-1.0.0.tgz", - "integrity": "sha512-8cv0M59brhqR6V5yCzo/LNZZ2ePyaEaNeqLOPXxSyZVhOfyPamrLTvKvAX4F7o9W1uMbysHBlThcF7voMNLsZQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stylelint-plugin-logical-css/-/stylelint-plugin-logical-css-1.2.0.tgz", + "integrity": "sha512-WSyG6LhUyrw+Qqu1qDbAtnkG1eqdI1eQG80MWhFGM0hj8veiJD8Z8Trgmo8dUaxBOQosAF7z081PXFqZhKymNg==", "dev": true, "requires": {} }, @@ -11687,9 +11291,9 @@ } }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -11700,15 +11304,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "is-fullwidth-code-point": { @@ -11849,6 +11453,8 @@ }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -12002,15 +11608,15 @@ } }, "vite": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.5.tgz", - "integrity": "sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "requires": { - "esbuild": "^0.19.3", + "esbuild": "^0.21.3", "fsevents": "~2.3.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "postcss": "^8.4.38", + "rollup": "^4.13.0" } }, "vite-plugin-full-reload": { @@ -12030,9 +11636,9 @@ "dev": true }, "vite-plugin-static-copy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.1.tgz", - "integrity": "sha512-3eGL4mdZoPJMDBT68pv/XKIHR4MgVolStIxxv1gIBP4R8TpHn9C9EnaU0hesqlseJ4ycLGUxckFTu/jpuJXQlA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.2.tgz", + "integrity": "sha512-AfmEF+a/mfjsUsrgjbCkhzUCeIUF4EKQXXt3Ie1cour9MBpy6f6GphbdW2td28oYfOrwCyRzFCksgLkpk58q6Q==", "dev": true, "requires": { "chokidar": "^3.5.3", @@ -12090,17 +11696,6 @@ "strip-ansi": "^6.0.0" } }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, "wrappy": { "version": "1.0.2", "dev": true diff --git a/package.json b/package.json index a627a4bba..a47819d1e 100644 --- a/package.json +++ b/package.json @@ -40,30 +40,30 @@ "eslint-config-fluid": "^2.1.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsonc": "^2.13.0", - "husky": "^8.0.3", + "husky": "^9.0.11", "laravel-vite-plugin": "^1.0.2", "lint-staged": "^15.2.0", "modern-css-reset": "^1.4.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.35", - "postcss-custom-media": "^10.0.2", + "postcss": "^8.4.38", + "postcss-custom-media": "^10.0.7", "postcss-import": "^16.0.0", "postcss-import-ext-glob": "^2.1.1", - "postcss-logical": "^7.0.0", - "prettier": "^3.0.3", - "stylelint": "^16.2.0", + "postcss-logical": "^7.0.1", + "prettier": "^3.2.5", + "stylelint": "^16.6.1", "stylelint-config-standard": "^36.0.0", "stylelint-order": "^6.0.4", - "stylelint-plugin-logical-css": "^1.0.0", + "stylelint-plugin-logical-css": "^1.2.0", "tailwindcss": "^3.4.1", "tippy.js": "^6.3.7", - "vite": "^5.1.5", + "vite": "^5.3.2", "vite-plugin-full-reload": "^1.1.0", "vite-plugin-manifest-sri": "^0.2.0", - "vite-plugin-static-copy": "^1.0.1" + "vite-plugin-static-copy": "^1.0.2" }, "dependencies": { - "@vimeo/player": "^2.20.1", + "@vimeo/player": "^2.22.0", "axios": "^1.6.0", "infusion": "^4.6.0", "luxon": "^3.4.3", diff --git a/phpstan.neon.dist b/phpstan.neon.dist index c78084cab..6dc12565d 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -19,6 +19,7 @@ parameters: ignoreErrors: - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Builder::withExtraAttributes\(\)#' - '#Call to private method whereDate\(\) of parent class Illuminate\\Database\\Eloquent\\Relations\\HasMany<Illuminate\\Database\\Eloquent\\Model>#' + - '#Call to an undefined method Illuminate\\Database\\Eloquent\\Relations\\MorphMany::statuses\(\)#' checkMissingIterableValueType: false scanFiles: diff --git a/resources/css/_props.css b/resources/css/_props.css index bc6b2d89d..f4cdb7171 100644 --- a/resources/css/_props.css +++ b/resources/css/_props.css @@ -27,6 +27,9 @@ --connectors-background: var(--theme-connectors-background, var(--color-yellow-3)); --connectors-color: var(--theme-connectors-color, var(--color-black)); --connectors-border: var(--theme-connectors-border, transparent); + --engagements-background: var(--theme-engagements-background, var(--color-green-2)); + --engagements-color: var(--theme-engagements-color, var(--color-black)); + --engagements-border: var(--theme-engagements-border, transparent); --regulated-organizations-background: var(--theme-regulated-organizations-background, var(--color-turquoise-2)); --regulated-organizations-color: var(--theme-regulated-organizations-color, var(--color-black)); --regulated-organizations-border: var(--theme-regulated-organizations-border, transparent); diff --git a/resources/css/_tokens.css b/resources/css/_tokens.css index 740cbedc5..c6e0721d4 100644 --- a/resources/css/_tokens.css +++ b/resources/css/_tokens.css @@ -1,4 +1,4 @@ -/* VARIABLES GENERATED WITH TAILWIND CONFIG ON 2024-02-14. +/* VARIABLES GENERATED WITH TAILWIND CONFIG ON 4/11/2024. Tokens location: ./tailwind.config.js */ :root { --space-0: 0; diff --git a/resources/css/components/_badge.css b/resources/css/components/_badge.css index 7d8e76797..e75addb8f 100644 --- a/resources/css/components/_badge.css +++ b/resources/css/components/_badge.css @@ -45,6 +45,13 @@ color: var(--badge-color-alt); } +.badge--green { + --badge-background: var(--bg, var(--color-green-2)); + --badge-border: var(--fg, var(--badge-background)); + + color: var(--badge-color-alt); +} + .badge--lavender { --badge-background: var(--bg, var(--color-lavender-2)); --badge-border: var(--fg, var(--badge-background)); diff --git a/resources/css/components/_getting-started.css b/resources/css/components/_getting-started.css index 2f2b89c41..87103d806 100644 --- a/resources/css/components/_getting-started.css +++ b/resources/css/components/_getting-started.css @@ -12,3 +12,25 @@ main .getting-started.box { [data-theme="dark"] .getting-started .icon--green { color: var(--color-green-2); } + +.getting-started .current-task__action { + font-size: var(--text-xl); + font-size: var(--text-fluid-lg); + font-weight: var(--font-normal); +} + +.getting-started__task-list { + color: var(--fg, var(--color-graphite-8)); +} + +[data-theme="dark"] .getting-started__task-list { + color: var(--color-grey-1); +} + +.getting-started__task-list li:not(:first-of-type) > :first-child::before { + border-block-start: var(--border) solid currentcolor; + content: ""; + display: block; + margin-block-end: calc(var(--space, 1em) - 0.5em); + width: 100%; +} diff --git a/resources/css/routes/engagements/_index.css b/resources/css/routes/engagements/_index.css new file mode 100644 index 000000000..7c977e959 --- /dev/null +++ b/resources/css/routes/engagements/_index.css @@ -0,0 +1,11 @@ +.header--engagements { + @apply border-b border-t-0 border-x-0 border-solid; + + --link-color: var(--engagements-color); + --link-color-visited: var(--engagements-color); + --h1-color: var(--engagements-color); + + background-color: var(--engagements-background); + border-color: var(--engagements-border); + color: var(--engagements-color); +} diff --git a/resources/css/themes/_dark.css b/resources/css/themes/_dark.css index 0cecff23b..76bf1cc17 100644 --- a/resources/css/themes/_dark.css +++ b/resources/css/themes/_dark.css @@ -25,6 +25,9 @@ --theme-connectors-background: var(--color-graphite-8); --theme-connectors-color: var(--color-yellow-3); --theme-connectors-border: var(--theme-participants-color); + --theme-engagements-background: var(--color-graphite-8); + --theme-engagements-color: var(--color-green-2); + --theme-engagements-border: var(--theme-participants-color); --theme-regulated-organizations-background: var(--color-graphite-8); --theme-regulated-organizations-color: var(--color-turquoise-2); --theme-regulated-organizations-border: var(--theme-participants-color); diff --git a/resources/css/themes/_simple.css b/resources/css/themes/_simple.css index b32a17eb0..67d7c572c 100644 --- a/resources/css/themes/_simple.css +++ b/resources/css/themes/_simple.css @@ -34,6 +34,9 @@ --theme-connectors-background: var(--bg); --theme-connectors-color: var(--fg); --theme-connectors-border: var(--fg); + --theme-engagements-background: var(--bg); + --theme-engagements-color: var(--fg); + --theme-engagements-border: var(--fg); --theme-regulated-organizations-background: var(--bg); --theme-regulated-organizations-color: var(--fg); --theme-regulated-organizations-border: var(--fg); diff --git a/resources/lang/en.json b/resources/lang/en.json index 27127401b..1c580ceed 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -41,10 +41,12 @@ ":blockable could not be unblocked because it was not on your block list.": ":blockable could not be unblocked because it was not on your block list.", ":blockable is already on your block list.": ":blockable is already on your block list.", ":count access needs listed": ":count access needs listed", + ":count engagements match your applied filters.": ":count engagements match your applied filters.", ":count more unread": ":count more unread", ":count projects match your applied filters.": ":count projects match your applied filters.", ":count results for “:searchQuery": ":count results for “:searchQuery", ":count results for “:searchQuery”.": ":count results for “:searchQuery”.", + ":format by :projectable": ":format by :projectable", ":label (:locale)": ":label (:locale)", ":locality, :region": ":locality, :region", ":model is already translatable into :language.": ":model is already translatable into :language.", @@ -82,7 +84,7 @@ "Accessibility and inclusion links": "Accessibility and inclusion links", "accessibility and inclusion link title": "accessibility and inclusion link title", "Accessibility Consultant": "Accessibility Consultant", - "Accessibility consultant application": "Accessibility consultant application", + "Accessibility Consultant and Community Connector application": "Accessibility Consultant and Community Connector application", "Accessibility Consultant notification setting": "Accessibility Consultant notification setting", "Accessibility Consultants": "Accessibility Consultants", "Accessibility Consultants could help you design consultations that are inclusive and accessible.": "Accessibility Consultants could help you design consultations that are inclusive and accessible.", @@ -149,6 +151,7 @@ "Agreement pending": "Agreement pending", "Agreement received": "Agreement received", "Agreements": "Agreements", + "Agreement signed and received": "Agreement signed and received", "Agreement status": "Agreement status", "Alberta": "Alberta", "All": "All", @@ -178,8 +181,7 @@ "An organization with this name already exists on our website. Please contact your colleagues to get an invitation. If this isn’t your organization, please use a different name.": "An organization with this name already exists on our website. Please contact your colleagues to get an invitation. If this isn’t your organization, please use a different name.", "Any group": "Any group", "Any of the following could be Consultation Participants:": "Any of the following could be Consultation Participants:", - "Application for Accessibility Consultant": "Application for Accessibility Consultant", - "Application for Community Connector": "Application for Community Connector", + "Application for Accessibility Consultant and Community Connector": "Application for Accessibility Consultant and Community Connector", "Approval status": "Approval status", "Approve": "Approve", "Approved": "Approved", @@ -253,6 +255,7 @@ "Be a Community Connector": "Be a Community Connector", "Be a Consultation Participant": "Be a Consultation Participant", "Be an Accessibility Consultant": "Be an Accessibility Consultant", + "Before you do anything else, you must attend an orientation session to learn about this website and your options.": "Before you do anything else, you must attend an orientation session to learn about this website and your options.", "Be invited by a Community Connector (someone with lived experience of disability or is Deaf that organizations hire to help recruit)": "Be invited by a Community Connector (someone with lived experience of disability or is Deaf that organizations hire to help recruit)", "Be matched based on what your lived experiences are": "Be matched based on what your lived experiences are", "Between which times during the day will the interviews take place?": "Between which times during the day will the interviews take place?", @@ -274,7 +277,7 @@ "Bring my service or therapy animal": "Bring my service or therapy animal", "Bring my support person": "Bring my support person", "British Columbia": "British Columbia", - "Browse all projects": "Browse all projects", + "Browse all engagements": "Browse all engagements", "Browse all resources": "Browse all resources", "Browse Community Connectors": "Browse Community Connectors", "Browse community organizations": "Browse community organizations", @@ -333,6 +336,7 @@ "Civil society organizations": "Civil society organizations", "Clear filters": "Clear filters", "Click the link above to sign up for an orientation session. (This will lead you to an external site, and when you’re done it will bring you back automatically.)": "Click the link above to sign up for an orientation session. (This will lead you to an external site, and when you’re done it will bring you back automatically.)", + "Closed": "Closed", "Cluster": "Cluster", "Cognitive disabilities": "Cognitive disabilities", "Collaboration Preferences": "Collaboration Preferences", @@ -348,7 +352,6 @@ "Communities you can connect to": "Communities you can connect to", "Communities your organization :represents_or_serves_and_supports": "Communities your organization :represents_or_serves_and_supports", "Community Connector": "Community Connector", - "Community connector application": "Community connector application", "Community Connector notification setting": "Community Connector notification setting", "Community Connectors": "Community Connectors", "Community Connectors could help you connect with groups that may be hard to reach otherwise.": "Community Connectors could help you connect with groups that may be hard to reach otherwise.", @@ -365,7 +368,9 @@ "Completed": "Completed", "completed": "completed", "Completed documents are due by:": "Completed documents are due by:", + "Completed engagements": "Completed engagements", "Completed materials are due by": "Completed materials are due by", + "Completed steps": "Completed steps", "Confirm": "Confirm", "Confirm and sign up": "Confirm and sign up", "Confirm by typing your current password": "Confirm by typing your current password", @@ -455,6 +460,7 @@ "Cross disability (includes people with disabilities, Deaf people, and supporters)": "Cross disability (includes people with disabilities, Deaf people, and supporters)", "Current password": "Current password", "current password": "current password", + "Current step": "Current step", "Customize": "Customize", "Customize this website’s accessibility": "Customize this website’s accessibility", "Dark theme": "Dark theme", @@ -564,6 +570,7 @@ "engagement description": "engagement description", "engagement description (English)": "engagement description (English)", "engagement description (French)": "engagement description (French)", + "Engagement estimate has been submitted for your approval": "Engagement estimate has been submitted for your approval", "engagement format": "engagement format", "Engagement materials": "Engagement materials", "Engagement meetings": "Engagement meetings", @@ -572,6 +579,9 @@ "engagement name (French)": "engagement name (French)", "Engagements": "Engagements", "Engagements by organizations that I have saved on my notification list": "Engagements by organizations that I have saved on my notification list", + "Engagements I’ve joined": "Engagements I’ve joined", + "Engagements I’ve joined as a Community Connector": "Engagements I’ve joined as a Community Connector", + "Engagements I’ve joined as a Consultation Participant": "Engagements I’ve joined as a Consultation Participant", "Engagements that are looking for people that my organization represents or supports": "Engagements that are looking for people that my organization represents or supports", "Engagements that are looking for someone with my lived experience": "Engagements that are looking for someone with my lived experience", "Engagement translations": "Engagement translations", @@ -579,6 +589,7 @@ "English author name": "English author name", "Enter your collaboration preferences": "Enter your collaboration preferences", "Episodic and invisible disabilities": "Episodic and invisible disabilities", + "Estimate and agreement have been sent": "Estimate and agreement have been sent", "Estimate approved": "Estimate approved", "Estimate requested": "Estimate requested", "Estimate returned": "Estimate returned", @@ -609,6 +620,7 @@ "Federally regulated organizations": "Federally regulated organizations", "Federally Regulated private sector": "Federally Regulated private sector", "Feel free to self-identify your experiences of disability, if you feel it is relevant to your work.": "Feel free to self-identify your experiences of disability, if you feel it is relevant to your work.", + "Fill in your collaboration preferences": "Fill in your collaboration preferences", "Fill out and return your application": "Fill out and return your application", "Filters": "Filters", "Find a Community Connector": "Find a Community Connector", @@ -705,6 +717,7 @@ "Have trouble meeting the access needs of your participants?": "Have trouble meeting the access needs of your participants?", "Help organizations and businesses design their consultations, and potentially help facilitate these consultations.": "Help organizations and businesses design their consultations, and potentially help facilitate these consultations.", "Help regulated organizations design and implement their consultations": "Help regulated organizations design and implement their consultations", + "Here are all the steps you have to do before you start signing up for engagements.": "Here are all the steps you have to do before you start signing up for engagements.", "Hire a Community Connector (who can be an individual or a Community Organization) to recruit people manually from within their networks. This option is best if you are looking for a specific or hard-to-reach group.": "Hire a Community Connector (who can be an individual or a Community Organization) to recruit people manually from within their networks. This option is best if you are looking for a specific or hard-to-reach group.", "Hours": "Hours", "House of Commons, Senate, Library of Parliament, Parliamentary Protective Service": "House of Commons, Senate, Library of Parliament, Parliamentary Protective Service", @@ -759,7 +772,6 @@ "Includes size, limb, and facial differences": "Includes size, limb, and facial differences", "Includes traumatic brain injury, memory difficulties, dementia": "Includes traumatic brain injury, memory difficulties, dementia", "Including government departments, agencies and Crown Corporations": "Including government departments, agencies and Crown Corporations", - "Incomplete": "Incomplete", "Indigenous": "Indigenous", "indigenous connections": "indigenous connections", "indigenous constituencies": "indigenous constituencies", @@ -779,7 +791,6 @@ "In person": "In person", "in person access needs": "in person access needs", "In progress": "In progress", - "In Progress": "In Progress", "Interests": "Interests", "Internal team": "Internal team", "intersectional": "intersectional", @@ -797,9 +808,6 @@ "Invite new member": "Invite new member", "Invite others to your organization": "Invite others to your organization", "Invite someone to become a member of your organization. If they do not have an account on this website yet, they will be invited to create one first.": "Invite someone to become a member of your organization. If they do not have an account on this website yet, they will be invited to create one first.", - "Involved in as a Community Connector": "Involved in as a Community Connector", - "Involved in as a Consultation Participant": "Involved in as a Consultation Participant", - "Involved in as an Accessibility Consultant": "Involved in as an Accessibility Consultant", "I require Video Relay Service (VRS) for phone calls": "I require Video Relay Service (VRS) for phone calls", "Is there a group with a specific experience of identity you are interested in engaging?": "Is there a group with a specific experience of identity you are interested in engaging?", "Is there a specific disability or Deaf group you are interested in engaging?": "Is there a specific disability or Deaf group you are interested in engaging?", @@ -809,6 +817,8 @@ "I work for a private business, the federal government, or a public sector organization regulated under the Accessible Canada Act.": "I work for a private business, the federal government, or a public sector organization regulated under the Accessible Canada Act.", "I would like to speak to someone to discuss additional access needs or concerns": "I would like to speak to someone to discuss additional access needs or concerns", "I’ve gone to orientation, why isn’t this updated?": "I’ve gone to orientation, why isn’t this updated?", + "Joined as a Community Connector": "Joined as a Community Connector", + "Joined as a Consultation Participant": "Joined as a Consultation Participant", "Join our accessibility community": "Join our accessibility community", "Keeping my information up to date": "Keeping my information up to date", "Language": "Language", @@ -883,9 +893,7 @@ "Manage project": "Manage project", "Manage this project": "Manage this project", "Manitoba": "Manitoba", - "Mark agreement as received": "Mark agreement as received", "Mark as read": "Mark as read", - "Mark estimate as returned": "Mark estimate as returned", "Mark the estimate as \"returned\" by visiting the link below and searching for :projectable.": "Mark the estimate as \"returned\" by visiting the link below and searching for :projectable.", "match you to their projects or engagements": "match you to their projects or engagements", "Materials": "Materials", @@ -960,6 +968,7 @@ "New project": "New project", "New reports uploaded": "New reports uploaded", "Next": "Next", + "Next steps": "Next steps", "No": "No", "No, don’t share my access needs": "No, don’t share my access needs", "No, give me a group with intersectional experiences and\/or identities": "No, give me a group with intersectional experiences and\/or identities", @@ -980,7 +989,6 @@ "Non-binary people": "Non-binary people", "None found.": "None found.", "None listed": "None listed", - "None selected": "None selected", "No outcomes or reports available.": "No outcomes or reports available.", "No projects found.": "No projects found.", "No resources found.": "No resources found.", @@ -1032,13 +1040,13 @@ "Once you have hired a Community Organization, please select the organization below.": "Once you have hired a Community Organization, please select the organization below.", "Once you publish your engagement details, anyone on this website will be able to access it.": "Once you publish your engagement details, anyone on this website will be able to access it.", "Once your account has been approved, you can review and publish your organization’s page. You must have completed all the previous steps.": "Once your account has been approved, you can review and publish your organization’s page. You must have completed all the previous steps.", - "Once your account has been approved, you can review and publish your page. You must have completed all the previous steps.": "Once your account has been approved, you can review and publish your page. You must have completed all the previous steps.", "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information about your organization so businesses and government can learn more about what you do and who you represent or serve.": "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information about your organization so businesses and government can learn more about what you do and who you represent or serve.", "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information to facilitate a smoother collaboration with organizations, such as access needs, communication preferences, and consultation preferences.": "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information to facilitate a smoother collaboration with organizations, such as access needs, communication preferences, and consultation preferences.", "Once you’ve reviewed the project details, please:": "Once you’ve reviewed the project details, please:", "Only people with specific disabilities and\/or Deaf people": "Only people with specific disabilities and\/or Deaf people", "Only reachable within cross-disability and Deaf or intersectional groups": "Only reachable within cross-disability and Deaf or intersectional groups", "Ontario": "Ontario", + "Open": "Open", "Open call": "Open call", "Opens in new tab": "Opens in new tab", "open to other formats": "open to other formats", @@ -1138,12 +1146,14 @@ "Phone number to join": "Phone number to join", "phone number to join the meeting": "phone number to join the meeting", "Physical and mobility disabilities": "Physical and mobility disabilities", + "Pick your role": "Pick your role", "Plain language": "Plain language", "Plan and share your project with others on this website.": "Plan and share your project with others on this website.", "Play": "Play", "Please:": "Please:", "Please be specific about where you would like the participants to go to participate in this engagement.": "Please be specific about where you would like the participants to go to participate in this engagement.", "Please check all that apply.": "Please check all that apply.", + "Please check your email for a confirmation of your session date. Please email <:email> if you did not get the email, or if you need to reschedule or cancel. If you’ve gone to your orientation session, it may take 2-3 business days to be updated here on the website.": "Please check your email for a confirmation of your session date. Please email <:email> if you did not get the email, or if you need to reschedule or cancel. If you’ve gone to your orientation session, it may take 2-3 business days to be updated here on the website.", "Please choose a new password for The Accessibility Exchange": "Please choose a new password for The Accessibility Exchange", "Please choose the language or languages you would like to use on this website.": "Please choose the language or languages you would like to use on this website.", "Please click the button below to verify your email address.": "Please click the button below to verify your email address.", @@ -1168,8 +1178,7 @@ "Please enter a valid website link under “Accessibility and Inclusion links”.": "Please enter a valid website link under “Accessibility and Inclusion links”.", "Please enter the email address of the individual you have hired as a Community Connector.": "Please enter the email address of the individual you have hired as a Community Connector.", "Please enter your own name and email, rather than you organization’s. You will be able to create your organization in a later step.": "Please enter your own name and email, rather than you organization’s. You will be able to create your organization in a later step.", - "Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.": "Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.", - "Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.": "Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.", + "Please fill out and return your application. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.": "Please fill out and return your application. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.", "Please identify the type of Regulated Organization yours is:": "Please identify the type of Regulated Organization yours is:", "Please include any links that describes the accessibility and inclusion initiatives your regulated entity has. This can include reports, case studies, and more.": "Please include any links that describes the accessibility and inclusion initiatives your regulated entity has. This can include reports, case studies, and more.", "Please indicate how you would like to be notified of a new person or people being added to your engagements.": "Please indicate how you would like to be notified of a new person or people being added to your engagements.", @@ -1201,6 +1210,7 @@ "Please list any training related to accessibility or inclusion that your team members have received.": "Please list any training related to accessibility or inclusion that your team members have received.", "Please note that all organizations have been asked to provide gender neutral and accessible washrooms by default.": "Please note that all organizations have been asked to provide gender neutral and accessible washrooms by default.", "Please note that selecting some of these options may open up new follow-up questions below them. ": "Please note that selecting some of these options may open up new follow-up questions below them. ", + "Please pick whether you’d like to be a Participant, a Consultant, or a Connector.": "Please pick whether you’d like to be a Participant, a Consultant, or a Connector.", "Please provide personal information that will help us find consultations for you to participate in.": "Please provide personal information that will help us find consultations for you to participate in.", "Please provide the details for a member of your team whom potential participants may contact to ask questions.": "Please provide the details for a member of your team whom potential participants may contact to ask questions.", "Please reach out to us and we can try to help.": "Please reach out to us and we can try to help.", @@ -1291,12 +1301,8 @@ "Project scope (English)": "Project scope (English)", "Project scope (French)": "Project scope (French)", "Project scope must be provided in either English or French.": "Project scope must be provided in either English or French.", - "Projects I am contracted for": "Projects I am contracted for", - "Projects I am participating in": "Projects I am participating in", - "Projects I am running": "Projects I am running", - "Projects involved in as a Community Connector": "Projects involved in as a Community Connector", - "Projects involved in as a Consultation Participant": "Projects involved in as a Consultation Participant", "Projects I’m running": "Projects I’m running", + "Projects my organization has created": "Projects my organization has created", "projects notification setting": "projects notification setting", "Project start date": "Project start date", "Projects that are looking for people that my organization represents or supports": "Projects that are looking for people that my organization represents or supports", @@ -1347,8 +1353,8 @@ "Registration": "Registration", "regulated-organization.types.' . $type)], 'en": "regulated-organization.types.' . $type)], 'en", "Regulated Organization": "Regulated Organization", - "regulated organization": "regulated organization", "Regulated organization": "Regulated organization", + "regulated organization": "regulated organization", "Regulated organization name": "Regulated organization name", "Regulated Organization page": "Regulated Organization page", "Regulated organizations": "Regulated organizations", @@ -1402,7 +1408,6 @@ "return to engagement": "return to engagement", "Review and publish engagement details": "Review and publish engagement details", "Review and publish your organization’s public page": "Review and publish your organization’s public page", - "Review and publish your public page": "Review and publish your public page", "review and updates notification settings": "review and updates notification settings", "Review engagement details": "Review engagement details", "Review project": "Review project", @@ -1411,7 +1416,6 @@ "role": "role", "Roles": "Roles", "roles": "roles", - "Roles:": "Roles:", "Roles and permissions": "Roles and permissions", "Run by": "Run by", "Running": "Running", @@ -1479,6 +1483,7 @@ "Sign out": "Sign out", "Sign up": "Sign up", "Sign up and attend an orientation session": "Sign up and attend an orientation session", + "Sign up closed on :date": "Sign up closed on :date", "Sign up deadline": "Sign up deadline", "sign up deadline": "sign up deadline", "Sign up for an open engagement": "Sign up for an open engagement", @@ -1486,6 +1491,7 @@ "Sign up for this engagement": "Sign up for this engagement", "Sign up online": "Sign up online", "Sign up on the phone": "Sign up on the phone", + "Sign up open until :date": "Sign up open until :date", "Since a website link under “Accessibility and Inclusion links” has been entered, you must also enter a website title.": "Since a website link under “Accessibility and Inclusion links” has been entered, you must also enter a website title.", "Since a website title under “Accessibility and Inclusion links” has been entered, you must also enter a website link.": "Since a website title under “Accessibility and Inclusion links” has been entered, you must also enter a website link.", "Since this is a follow-up to a previous project, you must specify the previous project.": "Since this is a follow-up to a previous project, you must specify the previous project.", @@ -1614,6 +1620,7 @@ "The other payment type must be specified.": "The other payment type must be specified.", "The person with the email address you provided is not a consultation participant.": "The person with the email address you provided is not a consultation participant.", "The provided password does not match your current password.": "The provided password does not match your current password.", + "There are no next steps. After this you’ll be able to sign up for engagements!": "There are no next steps. After this you’ll be able to sign up for engagements!", "There is already a :type with the name registered on this platform.": "There is already a :type with the name registered on this platform.", "There is already a :type with the name “:name” registered on this platform. If this is the organization you work for, please contact your colleagues to get an invitation to the organization. If this isn’t the organization you work for, please use a different name.": "There is already a :type with the name “:name” registered on this platform. If this is the organization you work for, please contact your colleagues to get an invitation to the organization. If this isn’t the organization you work for, please use a different name.", "There is no disability type filled in under \"something else\". Please fill this in.": "There is no disability type filled in under \"something else\". Please fill this in.", @@ -1651,7 +1658,6 @@ "This estimate includes the following engagements:": "This estimate includes the following engagements:", "This estimate was sent to :contact on :date.": "This estimate was sent to :contact on :date.", "This includes disability and Deaf representative organizations, support organizations, and other civil society organizations (not only disability focused).": "This includes disability and Deaf representative organizations, support organizations, and other civil society organizations (not only disability focused).", - "This includes projects by Regulated Organizations and Community Organizations.": "This includes projects by Regulated Organizations and Community Organizations.", "This individual has already been invited to your engagement.": "This individual has already been invited to your engagement.", "This information is a part of your public profile that you can publish and share with other members of the website, including governments and businesses. This provides an overview to others about who you are.": "This information is a part of your public profile that you can publish and share with other members of the website, including governments and businesses. This provides an overview to others about who you are.", "This information is used to tell regulated organizations if you have any special interests. This entire page is optional.": "This information is used to tell regulated organizations if you have any special interests. This entire page is optional.", @@ -1680,7 +1686,8 @@ "This will help people know what to expect when working with you.": "This will help people know what to expect when working with you.", "This will help you get paid in the way that you want.": "This will help you get paid in the way that you want.", "This will only be shared with participants who have accepted the invitation.": "This will only be shared with participants who have accepted the invitation.", - "This will show Community Connectors on the [browse projects](:url) page that you are looking, and that they are welcome to reach out.": "This will show Community Connectors on the [browse projects](:url) page that you are looking, and that they are welcome to reach out.", + "This will show Community Connectors on the [browse engagements](:url) page that you are looking, and that they are welcome to reach out.": "This will show Community Connectors on the [browse engagements](:url) page that you are looking, and that they are welcome to reach out.", + "This will show up once you pick your role.": "This will show up once you pick your role.", "Through contacting me or my support person": "Through contacting me or my support person", "Throughout this page, you can choose whether you would like notifications to be sent through the website or by contacting the project team contact for that specific project directly. You can edit this in each individual project page.": "Throughout this page, you can choose whether you would like notifications to be sent through the website or by contacting the project team contact for that specific project directly. You can edit this in each individual project page.", "Throughout this page, you can chose whether you would like notifications to be sent through the website or by contacting :contact_person directly.": "Throughout this page, you can chose whether you would like notifications to be sent through the website or by contacting :contact_person directly.", @@ -1765,6 +1772,7 @@ "Voice recording": "Voice recording", "Volunteer": "Volunteer", "VRS": "VRS", + "Watch introduction video again": "Watch introduction video again", "Ways to attend": "Ways to attend", "ways to attend": "ways to attend", "Ways to participate": "Ways to participate", @@ -2008,6 +2016,7 @@ "You must indicate the :values.": "You must indicate the :values.", "You must indicate who you want to engage.": "You must indicate who you want to engage.", "You must pick at least one of these roles.": "You must pick at least one of these roles.", + "You must return this and have it approved.": "You must return this and have it approved.", "You must select a language.": "You must select a language.", "You must select a role for your organization.": "You must select a role for your organization.", "You must select at least one age group you can connect to.": "You must select at least one age group you can connect to.", @@ -2061,7 +2070,6 @@ "Your account on the Accessibility Exchange has been suspended.": "Your account on the Accessibility Exchange has been suspended.", "Your account on the Accessibility Exchange is no longer suspended.": "Your account on the Accessibility Exchange is no longer suspended.", "Your account suspension has been lifted": "Your account suspension has been lifted", - "Your agreement has been received": "Your agreement has been received", "Your agreement has been received for **:project**. You can now publish your project page and engagement details.": "Your agreement has been received for **:project**. You can now publish your project page and engagement details.", "Your agreement has been received for :project. You can now publish your project page and engagement details. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.": "Your agreement has been received for :project. You can now publish your project page and engagement details. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.", "Your areas of interest have been updated.": "Your areas of interest have been updated.", @@ -2075,7 +2083,6 @@ "Your engagement has been updated.": "Your engagement has been updated.", "Your engagement translations have been updated.": "Your engagement translations have been updated.", "Your estimate for **:project**, along with a project agreement for you to sign, has been sent to <:contact>.": "Your estimate for **:project**, along with a project agreement for you to sign, has been sent to <:contact>.", - "Your estimate has been returned": "Your estimate has been returned", "Your estimate has been returned for :project, along with a project agreement for you to sign. Sign in to your account at https:\/\/accessibilityexchange.ca for further details.": "Your estimate has been returned for :project, along with a project agreement for you to sign. Sign in to your account at https:\/\/accessibilityexchange.ca for further details.", "Your federally regulated organization has been deleted.": "Your federally regulated organization has been deleted.", "Your federally regulated organization has been updated.": "Your federally regulated organization has been updated.", @@ -2118,6 +2125,7 @@ "your public profile will be removed from the platform": "your public profile will be removed from the platform", "Your regulated organization, :name, will be deleted and cannot be recovered. If you still want to delete your regulated organization, please enter your current password to proceed.": "Your regulated organization, :name, will be deleted and cannot be recovered. If you still want to delete your regulated organization, please enter your current password to proceed.", "Your roles have been saved.": "Your roles have been saved.", + "Your signed agreement has been received": "Your signed agreement has been received", "your support person, :name": "your support person, :name", "Your support person’s name is required if they are your preferred contact person.": "Your support person’s name is required if they are your preferred contact person.", "Your website accessibility preferences have been updated.": "Your website accessibility preferences have been updated.", @@ -2146,6 +2154,7 @@ "Yukon Territory": "Yukon Territory", "[:projectable](:projectable_url) has approved an estimate for their project [:project](:project_url).": "[:projectable](:projectable_url) has approved an estimate for their project [:project](:project_url).", "[:projectable](:projectable_url) has requested an estimate for their project [:project](:project_url).": "[:projectable](:projectable_url) has requested an estimate for their project [:project](:project_url).", + "{1} :count engagement matches your applied filters.": "{1} :count engagement matches your applied filters.", "{1} :count project matches your applied filters.": "{1} :count project matches your applied filters.", "{1} :count result for “:searchQuery”.": "{1} :count result for “:searchQuery”.", "“About your organization”": "“About your organization”", diff --git a/resources/lang/en/routes.php b/resources/lang/en/routes.php index 41285915c..eeb4745f4 100644 --- a/resources/lang/en/routes.php +++ b/resources/lang/en/routes.php @@ -35,6 +35,7 @@ 'dashboard/notifications' => 'dashboard/notifications', 'dashboard/notifications/all' => 'dashboard/notifications/all', 'dashboard/trainings' => 'dashboard/trainings', + 'engagements' => 'engagements', 'engagements/{engagement}' => 'engagements/{engagement}', 'engagements/{engagement}/access-needs-permissions' => 'engagements/{engagement}/access-needs-permissions', 'engagements/{engagement}/confirm-access-needs' => 'engagements/{engagement}/confirm-access-needs', @@ -114,7 +115,6 @@ 'people-and-organizations' => 'people-and-organizations', 'people-and-organizations/consultants' => 'people-and-organizations/consultants', 'projects' => 'projects', - 'projects/all' => 'projects/all', 'projects/context/select' => 'projects/context/select', 'projects/contracted' => 'projects/contracted', 'projects/create' => 'projects/create', diff --git a/resources/lang/fr.json b/resources/lang/fr.json index 6da614a6a..0c6133318 100644 --- a/resources/lang/fr.json +++ b/resources/lang/fr.json @@ -3,11 +3,11 @@ "(required)": "(requis)", "**A community organization** who represents or supports the disability or Deaf community": "**Une organisation communautaire** qui représente ou soutient la communauté des personnes en situation de handicap ou des personnes sourdes", "**CAUTION!** This website is under active development. The database is reset nightly, and data you enter will not be preserved.": "**ATTENTION!** Ce site Internet est en cours de développement. La base de données est réinitialisée chaque nuit, et les données que vous saisissez ne seront pas conservées.", - "**If you select no,** our support line will contact you and arrange for a different way to have your access needs met.": "**Si vous choisissez \"non\", notre service à la clientèle vous contactera afin de trouver un moyen alternatif pour satisfaire vos besoins en matière d’accessibilité.", + "**If you select no,** our support line will contact you and arrange for a different way to have your access needs met.": "**Si vous choisissez ”non”, notre service à la clientèle vous contactera afin de trouver un moyen alternatif pour satisfaire vos besoins en matière d’accessibilité.", "**Individuals** with lived experience of being disabled or Deaf": "**Individus** ayant une expérience vécue du handicap ou de la sourditude", "**Please respond by :signup_by_date.**": "**Veuillez répondre avant le :signup_by_date.**", "**Saskatchewan observes Central Standard Time all year.": "**La Saskatchewan observe l’heure normale du centre toute l’année.", - "*Yukon and parts of British Columbia observe Mountain Standard Time all year.": "*Le Yukon et certaines parties de la Colombie-Britannique observent l\"heure normale des Rocheuses toute l’année.", + "*Yukon and parts of British Columbia observe Mountain Standard Time all year.": "*Le Yukon et certaines parties de la Colombie-Britannique observent l”heure normale des Rocheuses toute l’année.", "1 new person accepted their invitation for :engagement": "1 nouvelle personne a accepté l’invitation pour :engagement", "1 new person accepted their invitation for an engagement": "1 personne a accepté l’invitation à participer à une consultation", "1 new person accepted your invitation for :engagement": "1 nouvelle personne a accepté votre invitation pour :engagement", @@ -41,16 +41,18 @@ ":blockable could not be unblocked because it was not on your block list.": ":blockable n’a pas pu être débloqué car il ne figurait pas dans votre liste.", ":blockable is already on your block list.": ":blockable est déjà dans votre liste.", ":count access needs listed": ":count besoins en matière d’accessibilité listés", + ":count engagements match your applied filters.": ":count consultations correspondant aux filtres que vous avez appliqués.", ":count more unread": ":count autres non-lus", ":count projects match your applied filters.": ":count projets répondent aux critères sélectionnés.", ":count results for “:searchQuery": ":count résultats trouvés pour « :searchQuery", ":count results for “:searchQuery”.": ":count résultats trouvés pour « :searchQuery ».", + ":format by :projectable": ":format par :projectable", ":label (:locale)": ":label (:locale)", ":locality, :region": ":locality, :region", ":model is already translatable into :language.": ":model est déjà traduit en :language.", ":model was not translatable into :language.": ":model n’était pas traduisible en :language.", ":name participants navigation": ":name participants navigation", - ":name requires access needs facilitation": ":name requires access needs facilitation", + ":name requires access needs facilitation": ":name nécessite du soutien en lien avec l’accessibilité", ":notificationable could not be removed because it was not on your notification list.": ":notificationable n’a pas pu être supprimé car il ne figurait pas dans votre liste de notification.", ":notificationable is already on your notification list.": ":notificationable est déjà dans votre liste de notifications.", ":projectable has approved an estimate for their project **:project**.": ":projectable a approuvé un devis pour son projet **:project**.", @@ -82,8 +84,8 @@ "Accessibility and inclusion links": "Liens sur les mesures d’accessibilité et d’inclusion", "accessibility and inclusion link title": "titre du lien sur les mesures d’accessibilité et d’inclusion", "Accessibility Consultant": "Personne consultante en matière d’accessibilité", - "Accessibility consultant application": "Devenir personne consultante en matière d’accessibilité", - "Accessibility Consultant notification setting": "Accessibility Consultant notification setting", + "Accessibility Consultant and Community Connector application": "Demande à titre de personne consultante en matière d’accessibilité et de personne facilitatrice communautaire", + "Accessibility Consultant notification setting": "Réglages des notifications à titre de personne consultante en matière d’accessibilité", "Accessibility Consultants": "Personnes consultantes en matière d’accessibilité", "Accessibility Consultants could help you design consultations that are inclusive and accessible.": "Les personnes consultantes en matière d’accessibilité peuvent vous aider à concevoir des consultations qui soient inclusives et accessibles.", "Accessibility Consultants — Individual": "Personne consultante en matière d’accessibilité - Individu", @@ -98,8 +100,8 @@ "Access needs for when you are attending a meeting in-person.": "Besoins en matière d’accessibilité lorsque vous assistez à une réunion en personne.", "access resource in": "access resource in", "Access resources and trainings": "Accéder aux ressources et aux formations", - "Access support needed for": "Access support needed for", - "Access supports": "Access supports", + "Access support needed for": "Besoins en lien avec l’accessibilité pour", + "Access supports": "Mesures de soutien à l’accessibilité", "access their page": "accéder à leur page", "access their projects or engagements": "accéder à leurs projets ou consultations", "Access your dashboard": "Accéder à votre tableau de bord", @@ -127,8 +129,8 @@ "Additional information to join": "Information supplémentaire à joindre", "additional information to join": "information complémentaire à joindre", "Additional needs or concerns": "Besoins ou préoccupations supplémentaires", - "additional phone information": "additional phone information", - "additional video information": "additional video information", + "additional phone information": "information additionnelle liée au téléphone", + "additional video information": "information additionnelle liée à la vidéo", "Add language": "Ajouter une langue", "Add link": "Ajouter un lien", "Add meeting": "Ajouter une réunion", @@ -149,6 +151,7 @@ "Agreement pending": "Entente en attente", "Agreement received": "Entente reçue", "Agreements": "Ententes", + "Agreement signed and received": "Entente signée et reçue", "Agreement status": "Statut de l’entente", "Alberta": "Alberta", "All": "Tous", @@ -159,7 +162,7 @@ "All rights reserved.": "Tous droits réservés.", "Already on your block list": "Déjà sur votre liste de blocage", "Already on your notification list.": "Déjà sur votre liste de notifications.", - "alternative meeting software": "alternative meeting software", + "alternative meeting software": "logiciel alternatif de réunion", "Alternative text for images": "Texte de remplacement pour les images", "Although it is not compulsory, we highly recommend that you include English and French translations of your content.": "Bien que cela ne soit pas obligatoire, nous vous recommandons vivement d’inclure des traductions en anglais et en français de votre contenu.", "A meeting title must be provided in either English or French.": "Le titre de la réunion doit être fourni en anglais ou en français.", @@ -178,8 +181,7 @@ "An organization with this name already exists on our website. Please contact your colleagues to get an invitation. If this isn’t your organization, please use a different name.": "Une organisation avec ce nom existe déjà sur notre site Internet. Veuillez contacter vos collègues pour obtenir une invitation. S’il ne s’agit pas de votre organisation, veuillez utiliser un autre nom.", "Any group": "Tous les groupes", "Any of the following could be Consultation Participants:": "Chacune des catégories de personnes suivantes peut participer aux consultations : ", - "Application for Accessibility Consultant": "Formulaire de vérification de l’expérience pour le rôle de personne consultante en matière d’accessibilité", - "Application for Community Connector": "Formulaire de vérification de l’expérience pour le rôle de personne facilitatrice communautaire", + "Application for Accessibility Consultant and Community Connector": "Formulaire de participation à titre de personne consultante en matière d’accessibilité et\/ou de personne facilitratrice communautaire", "Approval status": "Statut d’approbation", "Approve": "Approuver", "Approved": "Approuvé", @@ -193,7 +195,7 @@ "area of accessibility planning and design": "domaine de la planification et de la conception en matière d’accessibilité", "Area of impact": "Domaine d’impact", "Areas of accessibility": "Domaines d’accessibilité", - "Areas of accessibility planning": "Areas of accessibility planning", + "Areas of accessibility planning": "Domaines de planification de l’accessibilité", "Areas of accessibility you are interested in": "Domaines relatifs à l’accessibilité qui vous intéressent", "Areas of impact": "Domaine(s) d’impact", "areas of impact": "domaine(s) d’impact", @@ -232,7 +234,7 @@ "A user with this email already exists.": "Un utilisateur avec cette adresse électronique existe déjà.", "Author: :author": "Auteur : :author", "Author name": "Nom de l’auteur", - "author organization": "author organization", + "author organization": "organisation de l’auteur", "availability": "disponibilité", "availability for Friday": "disponibilité le vendredi", "availability for Monday": "disponibilité le lundi", @@ -253,7 +255,8 @@ "Be a Community Connector": "Être une personne facilitatrice communautaire", "Be a Consultation Participant": "Être une personne participante à une consultation", "Be an Accessibility Consultant": "Être une personne consultante en matière d’accessibilté", - "Be invited by a Community Connector (someone with lived experience of disability or is Deaf that organizations hire to help recruit)": "Be invited by a Community Connector (someone with lived experience of disability or is Deaf that organizations hire to help recruit)", + "Before you do anything else, you must attend an orientation session to learn about this website and your options.": "Avant toute chose, vous devez assister à une séance d’information et d’orientation afin de vous familiariser avec ce site internet et les options qui s’offrent à vous.", + "Be invited by a Community Connector (someone with lived experience of disability or is Deaf that organizations hire to help recruit)": "Recevoir une invitaiton de la part d’une personne facilitratrice communautaire (une personne ayant une expérience vécue du handicap ou qui est sourde, que les organisations engagent pour les aider à recruter)", "Be matched based on what your lived experiences are": "Soyez apparié sur la base de vos expériences vécues", "Between which times during the day will the interviews take place?": "Entre quels moments de la journée les entrevues auront-elles lieu ?", "bio": "bio", @@ -274,7 +277,7 @@ "Bring my service or therapy animal": "Venir avec mon animal d’assistance ou de thérapie", "Bring my support person": "Venir avec une personne accompagnatrice", "British Columbia": "Colombie-Britannique", - "Browse all projects": "Parcourir tous les projets", + "Browse all engagements": "Parcourir toutes les consultations", "Browse all resources": "Parcourir toutes les ressources", "Browse Community Connectors": "Parcourir toutes les personnes facilitatrices communautaires", "Browse community organizations": "Parcourir les organisations communautaires", @@ -316,7 +319,7 @@ "Change the colour of the text and background.": "Changer la couleur du texte et de l’arrière-plan.", "Cheque": "Chèque", "Children (under 15)": "Enfants (moins de 15 ans)", - "Choices for: :question": "Choices for: :question", + "Choices for: :question": "Choix pour :question", "Choose a community organization…": "Choisissez une organisation communautaire…", "Choose a language…": "Choisissez une langue…", "Choose a month…": "Choisissez un mois…", @@ -333,6 +336,7 @@ "Civil society organizations": "Organisation de la société civile", "Clear filters": "Réinitialiser les filtres", "Click the link above to sign up for an orientation session. (This will lead you to an external site, and when you’re done it will bring you back automatically.)": "Cliquez sur le lien ci-dessus pour vous inscrire à une session d’information et d’orientation. (Ce lien vous mènera à un site externe, et lorsque vous aurez terminé, il vous ramènera automatiquement à la page actuelle)", + "Closed": "Fermée(s)", "Cluster": "Cluster", "Cognitive disabilities": "Déficiences cognitives", "Collaboration Preferences": "Préférences en matière de collaboration", @@ -348,14 +352,13 @@ "Communities you can connect to": "Communautés auprès desquelles vous pouvez agir comme intermédiaire", "Communities your organization :represents_or_serves_and_supports": "Communautés que votre organisation :represents_or_serves_and_supports", "Community Connector": "Personne facilitatrice communautaire", - "Community connector application": "Community connector application", - "Community Connector notification setting": "Community Connector notification setting", + "Community Connector notification setting": "Réglages des notifications à titre de personne facilitatrice communautaire", "Community Connectors": "Personnes facilitatrices communautaires", "Community Connectors could help you connect with groups that may be hard to reach otherwise.": "Les personnes facilitatrices communautaires peuvent vous aider à entrer en contact avec des groupes qui seraient autrement difficiles à rejoindre.", "Community Connectors — Individual": "Personne facilitatrice communautaire - Individu", "Community organization": "Organisation communautaire", "Community Organization": "Organisation communautaire", - "Community organization orientation": "Community organization orientation", + "Community organization orientation": "Information et orientation pour les organisations communautaires", "Community Organization page": "Page de l’organisation communautaire", "Community organizations": "Organisations communautaires", "Community Organizations": "Organisations communautaires", @@ -365,7 +368,9 @@ "Completed": "Terminé", "completed": "complété", "Completed documents are due by:": "Les documents dûment complétés doivent être remis au plus tard le : ", + "Completed engagements": "Consultations complétées", "Completed materials are due by": "Les documents dûment complétés doivent être remis au plus tard le", + "Completed steps": "Étapes complétées", "Confirm": "Confirmer", "Confirm and sign up": "Confirmer et s’inscrire", "Confirm by typing your current password": "Confirmez en saisissant votre mot de passe actuel", @@ -377,7 +382,7 @@ "Confirm your password": "Confirmer votre mot de passe", "Congratulations!": "Félicitations !", "Congratulations! You have passed the quiz.": "Félicitations ! Vous avez réussi le jeu-questionnaire.", - "Congratulations! You have passed the quiz with :score%.": "Félicitations ! Vous avez réussi le quiz avec un score de :score%.", + "Congratulations! You have passed the quiz with :score%.": "Félicitations ! Vous avez réussi le jeu-questionnaire avec un score de :score%.", "Congratulations! You have successfully published your :model page.": "Félicitations ! Vous avez publié votre page :model avec succès.", "Congratulations, :name!": "Félicitations, :name!", "Connecting the disability and Deaf communities and their supporters with ": "Une plateforme mettant en relation les communautés de personnes en situation de handicap et de personnes sourdes et leurs alliés avec ", @@ -402,7 +407,7 @@ "Contact :person from :projectable by:": "Contactez :person de :projectable au : ", "Contact information": "Informations de contact", "Contact Information": "Informations de contact", - "Contacting you with notifications": "Vous contacter grâce à des notifications", + "Contacting you with notifications": "Notifications que vous désirez recevoir", "contact person": "personne contact", "Contact person": "Personne contact", "Contact person requires Video Relay Service (VRS) for phone calls": "La personne de référence a besoin du service de relais vidéo (VRS) pour les appels téléphoniques", @@ -416,7 +421,7 @@ "Content types": "Types de contenus", "context": "contexte", "Continue": "Continuer", - "Contracted": "Contracted", + "Contracted": "Sous-contrat", "Contracts": "Contrats", "Contrast adjustment": "Ajustement du contraste", "Cookies are pieces of information saved about you. This helps us remember your access settings, like your language or colour contrast mode.": "Les cookies sont des fichiers d’information vous concernant qui sont stockés sur votre appareil. Ils nous aident à nous souvenir de vos paramètres de navigation, tels que votre langue ou le mode de contraste des couleurs.", @@ -425,10 +430,10 @@ "Copy link to share": "Copier le lien pour partager", "Correct answer": "Bonne réponse", "Correct answer!": "Bonne réponse !", - "Could not be blocked because it was not on your block list.": "Could not be blocked because it was not on your block list.", - "Could not be removed because it was not on your notification list.": "Could not be removed because it was not on your notification list.", + "Could not be blocked because it was not on your block list.": "N’a pas pu être bloqué car n’était pas sur votre liste de blocage.", + "Could not be removed because it was not on your notification list.": "Impossible de supprimer car ne figurait pas dans votre liste de notifications.", "Course": "Cours", - "Course Quiz": "Course Quiz", + "Course Quiz": "Jeu-questionnaire du cours", "Create": "Créer", "Create account": "Créer un compte", "Create Account": "Créer un compte", @@ -455,6 +460,7 @@ "Cross disability (includes people with disabilities, Deaf people, and supporters)": "Polyhandicap (comprend les personnes en situation de handicap, les personnes sourdes et les personnes qui les soutiennent)", "Current password": "Mot de passe actuel", "current password": "mot de pass actuel", + "Current step": "Étape en cours", "Customize": "Personnaliser", "Customize this website’s accessibility": "Personnalisez les paramètres d’accessibilité de ce site Internet", "Dark theme": "Thème sombre", @@ -468,10 +474,10 @@ "Dates": "Dates", "Days of the week interviews will be happening": "Jours de la semaine où les entrevues auront lieu", "Deaf": "Sourde\/Sourd", - "DeafBlind": "DeafBlind", + "DeafBlind": "Sourd-aveugle", "Decline": "Refuser", "Deepen understanding": "Approfondissement de la compréhension", - "Deepen understanding about the systemic barriers (laws, policies, practices, and culture) underlying the experiences that consultation participants report": "Deepen understanding about the systemic barriers (laws, policies, practices, and culture) underlying the experiences that consultation participants report", + "Deepen understanding about the systemic barriers (laws, policies, practices, and culture) underlying the experiences that consultation participants report": "Approfondir la compréhension des barrières systémiques (lois, politiques, pratiques et culture) qui sous-tendent les expériences rapportées par les personnes participant à la consultation", "definition": "définition", "Delete account": "Supprimer le compte", "Delete my page": "Supprimer ma page", @@ -492,7 +498,7 @@ "Disability and\/or Deaf identity": "Handicap et\/ou identité sourde", "disability and deaf connections": "disability and deaf connections", "disability and deaf constituencies": "disability and deaf constituencies", - "Disability and Deaf groups they are looking for": "Groupes de personnes en situation de handicap ou de personnes sourdes qu’ils cherchent", + "Disability and Deaf groups they are looking for": "Groupes de personnes en situation de handicap ou de personnes sourdes recherchés", "Disability and Deaf representative organizations": "Organisations représentant les personnes en situation de handicap et les personnes sourdes", "Disability and Deaf support organizations": "Organisation soutenant les personnes en situation de handicap et les personnes sourdes", "Disability is not in the person. It results when a person’s long-term physical, mental health, developmental, or sensory characteristics differ from society’s norms. When buildings, services, and workplaces are designed for the norm, they often present barriers to a person’s full and equal participation in society. That’s what we mean by disability. ": "Le handicap n’est pas inhérent à la personne. Il se manifeste lorsque les caractéristiques physiques, de santé mentale, de développement ou sensorielles d’une personne diffèrent des normes de la société. Lorsque les bâtiments, les services et les lieux de travail sont conçus pour la norme, ils présentent souvent des obstacles à la participation pleine et égale d’une personne à la société. C’est ce que nous entendons par handicap. ", @@ -502,7 +508,7 @@ "disability type": "type de handicap", "Disconnected rooms for down-time": "Salles isolées pour les temps morts", "Dismiss": "Ignorer", - "document access needs": "document access needs", + "document access needs": "besoins liés à l’accessibilité des documents", "document languages": "langues du document", "Documents will be sent to participants by:": "Les documents seront envoyés aux personnes participantes par :", "Does :name have lived experience of the people they can connect to?": ":name a-t-il\/a-t-elle une expérience vécue de la réalité des personnes auprès desquelles il\/elle peut servir d’intermédiaire ?", @@ -519,7 +525,7 @@ "Do you have staff who have lived experience of the primary constituencies you specifically :represent_or_serve_and_support?": "Avez-vous du personnel qui a une expérience vécue des principales populations que vous représentez ?", "Draft": "Brouillon", "Draft mode": "Mode brouillon", - "Due by": "Du le", + "Due by": "Dû le", "due date": "date limite", "E-transfer": "Transfert électronique", "E.g. Microsoft Teams, Webex, Zoom.": "Par exemple, Microsoft Teams, Webex, Zoom.", @@ -564,6 +570,7 @@ "engagement description": "description de la consultation", "engagement description (English)": "description de la consultation (anglais)", "engagement description (French)": "description de la consultation (français)", + "Engagement estimate has been submitted for your approval": "Le devis pour la consultation a été transmis pour votre approbation", "engagement format": "format de la consultation", "Engagement materials": "Documents de consultation", "Engagement meetings": "Réunions de la consultation", @@ -572,13 +579,17 @@ "engagement name (French)": "nom de la consultation (français)", "Engagements": "Consultations", "Engagements by organizations that I have saved on my notification list": "Consultations menées par les organisations que j’ai enregistrés dans ma liste de notifications", + "Engagements I’ve joined": "Consultations auxquelles je participe", + "Engagements I’ve joined as a Community Connector": "Consultations auxquelles je participe à titre de personne facilitratrice communautaire", + "Engagements I’ve joined as a Consultation Participant": "Consultations auxquelles je participe comme personne participant à des consultations", "Engagements that are looking for people that my organization represents or supports": "Consultations qui recherchent des personnes que mon organisation représente ou soutient", "Engagements that are looking for someone with my lived experience": "Consultations qui sont à la recherche de personnes avec mon expérience vécue", "Engagement translations": "Traductions de la consultation", "Engage with disability and Deaf communities and hold meaningful consultations": "Collaborez avec les communautés des personnes en situation de handicap et des personnes sourdes et tenez des consultations substantielles", "English author name": "Nom de l’auteur en anglais", - "Enter your collaboration preferences": "Entrez vos préférences de collaboration", + "Enter your collaboration preferences": "Indiquez vos préférences en matière de collaboration", "Episodic and invisible disabilities": "Incapacités épisodiques et invisibles", + "Estimate and agreement have been sent": "Devis et entente envoyés", "Estimate approved": "Devis approuvé", "Estimate requested": "Devis demandé", "Estimate returned": "Devis retourné", @@ -609,10 +620,11 @@ "Federally regulated organizations": "Organisations sous réglementation fédérale", "Federally Regulated private sector": "Secteur privé sous réglementation fédérale", "Feel free to self-identify your experiences of disability, if you feel it is relevant to your work.": "N’hésitez pas à faire part de vos expériences en matière de handicap, si vous pensez que cela est pertinent pour votre travail.", + "Fill in your collaboration preferences": "Indiquez vos préférences en matière de collaboration", "Fill out and return your application": "Remplissez et soumettez votre formulaire de vérification de l’expérience pour le(s) rôle(s) que vous avez choisi", "Filters": "Filtres", "Find a Community Connector": "Trouver une personne facilitatrice communautaire", - "Find a community connector to help you recruit participants.": "Trouver une personne facilitatrice communautaire pouvant aider à trouver des personnes participantes.", + "Find a community connector to help you recruit participants.": "Trouvez une personne facilitatrice communautaire pouvant aider à trouver des personnes participantes.", "Find Consultation Participants": "Trouver des personnes participantes", "Finding out about new projects": "Découvrir les nouveaux projets", "Find learning materials, best practices, and variety of tools to help you throughout the consultation process.": "Supports d’apprentissage, meilleures pratiques et une variété d’outils pour vous aider tout au long du processus de consultation.", @@ -635,11 +647,11 @@ "For example: he\/him, she\/her, they\/them.": "Par exemple : il\/lui, elle, eux, iels.", "For example: The engagement group could be a focus group for Deaf customers. There could be three times the focus group meets to discuss different topics.": "Par exemple : une consultation peut consister en un groupe de discussion pour les personnes sourdes. Le groupe de discussion pourrait se réunir à trois reprises pour discuter de différents sujets.", "For Federally Regulated Organizations": "Organisations sous réglementation fédérale", - "For in-person meetings": "Pour les réunions en personne", + "For in-person meetings": "Pour les rencontres en personne", "For Individuals": "Individus", "Format": "Format", "Format:": "Format :", - "For meeting in real time": "Pour se rencontrer en personne", + "For meeting in real time": "Pour les rencontres en direct", "For the best results, please use Google Chrome, Safari, or Microsoft Edge.": "Pour de meilleurs résultats, veuillez utiliser Google Chrome, Safari ou Microsoft Edge.", "For this website": "Pour le site", "for using The Accessibility Exchange": "du Connecteur pour l’accessibilité", @@ -705,6 +717,7 @@ "Have trouble meeting the access needs of your participants?": "Vous avez du mal à répondre aux besoins en matière d’accessibilité des personnes participantes ?", "Help organizations and businesses design their consultations, and potentially help facilitate these consultations.": "Aidez les organisations et les entreprises à concevoir leurs consultations et éventuellement à les animer.", "Help regulated organizations design and implement their consultations": "Aide les organisations sous réglementation fédérale à concevoir et à mettre en œuvre leurs consultations", + "Here are all the steps you have to do before you start signing up for engagements.": "Voici toutes les étapes que vous devez suivre avant de pouvoir prendre part à des consultations.", "Hire a Community Connector (who can be an individual or a Community Organization) to recruit people manually from within their networks. This option is best if you are looking for a specific or hard-to-reach group.": "Engagez une personne facilitatrice communautaire (qui peut être un individu ou une organisation communautaire) pour recruter des personnes de façon ciblée au sein de son réseau. Cette option est la meilleure si vous recherchez un groupe spécifique ou difficile à atteindre.", "Hours": "Heures", "House of Commons, Senate, Library of Parliament, Parliamentary Protective Service": "Chambre des communes, Sénat, Bibliothèque du Parlement, Service de protection du Parlement", @@ -721,7 +734,7 @@ "How this works for": "Comment cela fonctionne pour", "How this works for Community Organizations": "Comment cela fonctionne pour les organisations communautaires", "How this works for Federally Regulated Organizations": "Comment cela fonctionne pour les organisations sous réglementation fédérale", - "How this works for federally regulated organizations": "How this works for federally regulated organizations", + "How this works for federally regulated organizations": "Comment cela fonctionne pour les organisations sous réglementation fédérale", "How this works for individuals": "Comment cela fonctionne pour les individus", "How this works for Individuals with Disabilities and Deaf Individuals": "Comment cela fonctionne pour les personnes en situation de handicap et les personnes sourdes", "How this works for Regulated Organizations": "Comment cela fonctionne pour les organisations réglementées", @@ -745,26 +758,25 @@ "If you are looking for a specific :attribute, you must select at least one.": "If you are looking for a specific :attribute, you must select at least one.", "If you are seeking a Community Connector for this engagement, there are a few ways to find one:": "Si vous recherchez une personne facilitatrice communautaire pour cette consultation, plusieurs moyens s’offrent à vous :", "If you delete your account:": "Si vous supprimez votre compte :", - "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.", + "If you did not create an account, no further action is required.": "Si vous n’avez pas demandé la création d’un compte, aucune autre action n’est requise.", "If you did not expect to receive an invitation to this :invitationable_type, you may discard this email.": "Si vous ne vous attendiez pas à recevoir une invitation pour ce\/cette :invitationable_type, vous pouvez ignorer ce courriel.", "If you have an additional access need you must describe it.": "Si vous avez des besoins additionnels en matière d’accessibilité, veuillez les décrire.", "If you have forgotten your password, please enter the email address that you used to sign up for The Accessibility Exchange. We will email you a link that will let you choose a new password.": "Si vous avez oublié votre mot de passe, veuillez entrer l’adresse courriel que vous avez utilisée pour vous inscrire au Connecteur pour l’accessibilité. Nous vous enverrons par courriel un lien qui vous permettra de choisir un nouveau mot de passe.", " if you need this in another language.": " si vous avez besoin de soutien dans une autre langue.", "If your organization is offering services as a **Community Connector**, regulated organizations may ask you to assist them in connecting to your primary constituencies. If your organization is offering services as a **Consultation Participant**, regulated organizations may ask you to represent this group’s point of view in consultations.": "Si votre organisation offre des services en tant que **Community Connector**, les organisations réglementées peuvent vous demander de les aider à établir des liens avec les populations les intéressant le plus. Si votre organisation offre des services en tant que **Consultation Participant**, les organisations réglementées peuvent vous demander de représenter le point de vue de ce ou ces groupes lors des consultations.", - "If you select no, our support line will contact you and arrange for a way to have your access needs met.": "Si vous choisissez \"non\", notre service à la clientèle vous contactera afin de trouver un moyen alternatif pour satisfaire vos besoins en matière d’accessibilité.", + "If you select no, our support line will contact you and arrange for a way to have your access needs met.": "Si vous choisissez ”non”, notre service à la clientèle vous contactera afin de trouver un moyen alternatif pour satisfaire vos besoins en matière d’accessibilité.", "Immigrants": "Personnes immigrantes", "Includes individuals with no spoken or signed language who communicate using gestures, pictures, letter boards, communication devices or assistance from a person who knows them well": "Comprend les personnes non-verbales ou ne communiquant pas avec une langue signée mais communiquant en utilisant des gestes, des images, des tableaux de lettres, des dispositifs de communication ou l’aide d’une personne qui les connaît bien", "Includes individuals with sight loss, blind individuals, and partially sighted individuals": "Comprend les personnes ayant perdu la vue, les personnes aveugles et les personnes malvoyantes", "Includes intellectual disability": "Comprend la déficience intellectuelle", "Includes size, limb, and facial differences": "Comprend les différences de taille, les différences de membres et les différences faciales", "Includes traumatic brain injury, memory difficulties, dementia": "Comprend les lésions cérébrales résultant d’un traumatisme, les troubles de la mémoire et la démence", - "Including government departments, agencies and Crown Corporations": "Comprend les ministères, les agences et les sociétés d'État", - "Incomplete": "Vous n’avez pas encore complété cette étape.", + "Including government departments, agencies and Crown Corporations": "Comprend les ministères, les agences et les sociétés d’État", "Indigenous": "Autochtone", "indigenous connections": "indigenous connections", - "indigenous constituencies": "indigenous constituencies", - "Indigenous group": "Indigenous group", - "Indigenous identity": "Indigenous identity", + "indigenous constituencies": "populations autochtones", + "Indigenous group": "Groupe autochtone", + "Indigenous identity": "Identité autochtone", "Individual": "Individu", "individual": "individu", "Individual orientation": "Individual orientation", @@ -774,15 +786,14 @@ "Information such as your matching information, your communication preferences, and your consultation preferences might be out of date if it has not been updated for over a year.": "Certaines informations telles que vos informations pour le jumelage, vos préférences en matière de communication et de consultation pourraient être obsolètes si elle n’ont pas été mises à jour depuis plus d’un an.", "Information technology": "Technologies de l’information", "Information that we ask Consultation Participants, Accessibility Consultants, and Community Connectors to share.": "Informations que nous demandons aux personnes participant aux consultations, aux personnes consultantes en matière d’accessibilité et aux personnes facilitatrices communautaires de partager.", - "Initiated by": "Lancé par", + "Initiated by": "Lancée par", "In order to create a successful exchange, we ask Consultation Participants to provide this information so that The Accessibility Exchange can match Consultation Participants with an engagement that is looking for someone with your experiences.": "Afin de créer un échange réussi, nous demandons aux personnes participant à des consultations de fournir ces informations afin que le Connecteur pour l’accessibilité puisse mettre en relation les participants à des consultations avec une consultation à la recherche d’une personne ayant votre expérience.", "In person": "En personne", - "in person access needs": "in person access needs", + "in person access needs": "besoins d’accessibilité en personne", "In progress": "En cours", - "In Progress": "En cours", "Interests": "Intérêts", "Internal team": "Équipe interne", - "intersectional": "intersectional", + "intersectional": "intersectionnel", "Intersectional - This engagement is looking for people who have all sorts of different identities and lived experiences, such as race, gender, age, sexual orientation, and more.": "Intersectionnel - Cette consultation s’adresse à toute personne, peu importe leurs axes d’identités intersectionnels (telles que la race, le sexe, l’âge, l’orientation sexuelle) et leurs expériences vécues.", "Intersectional outreach": "Approche intersectionnelle", "Intervenor": "Intervenant", @@ -794,12 +805,9 @@ "Inuit": "Inuit", "invitation": "invitation", "Invite": "Envoyer des invitations", - "Invite new member": "Inviter un nouveau membre", + "Invite new member": "Inviter une personne", "Invite others to your organization": "Invitez d’autres personnes à rejoindre votre organisation", "Invite someone to become a member of your organization. If they do not have an account on this website yet, they will be invited to create one first.": "Invitez une personne à devenir membre de votre organisation. Si cette personne n’a pas encore de compte sur ce site Internet, elle sera d’abord invitée à en créer un.", - "Involved in as a Community Connector": "Participation en tant que personne facilitatrice communautaire", - "Involved in as a Consultation Participant": "Participation en tant que personne participante aux consultations", - "Involved in as an Accessibility Consultant": "Participation en tant que personne consultante en matière d’accessibilité", "I require Video Relay Service (VRS) for phone calls": "J’ai besoin du service de relais vidéo (SRV) pour les appels téléphoniques", "Is there a group with a specific experience of identity you are interested in engaging?": "Y a-t-il un groupe ayant une identité spécifique que vous souhaitez impliquer ?", "Is there a specific disability or Deaf group you are interested in engaging?": "Y a-t-il un groupe spécifique de personnes en situation de handicap ou de personnes sourdes que vous souhaitez impliquer ?", @@ -809,6 +817,8 @@ "I work for a private business, the federal government, or a public sector organization regulated under the Accessible Canada Act.": "Je travaille pour une entreprise privée, le gouvernement fédéral ou une organisation du secteur public réglementée par la Loi canadienne sur l’accessibilité.", "I would like to speak to someone to discuss additional access needs or concerns": "Je voudrais parler à une personne afin de discuter de mes besoins ou préoccupations supplémentaires en matière d’accessibilité", "I’ve gone to orientation, why isn’t this updated?": "J’ai déjà participé à la séance d’information et d’orientation, pourquoi cela n’apparait-il pas?", + "Joined as a Community Connector": "Participation à titre de personne facilitratrice communautaire", + "Joined as a Consultation Participant": "Participation à titre de personne participant à des consultations", "Join our accessibility community": "Rejoignez notre communauté en faveur de l’accessibilité", "Keeping my information up to date": "Maintenir mes informations à jour", "Language": "Langue", @@ -818,7 +828,7 @@ "Language :language removed.": "Langue :language supprimée.", "Language :number": "Langue :number", "Language added.": "Langue ajoutée.", - "Language code": "Language code", + "Language code": "Code de la langue", "language connections": "language connections", "language constituencies": "language constituencies", "Language groups": "Communautés linguistiques", @@ -859,7 +869,7 @@ "lived experience constituencies": "lived experience constituencies", "lived experience of disability, or of being Deaf, or both": "l’expérience vécue du handicap, de la surdité, ou des deux", "lived experience of disability or of being Deaf, or of both": "expérience vécue du handicap ou de la surdité, ou des deux", - "lived experiences": "lived experiences", + "lived experiences": "expériences vécues", "Lived or living experience": "Expérience vécue", "Living in urban, rural, or remote areas": "Vivant dans des zones urbaines, rurales ou éloignées", "Location": "Emplacement", @@ -883,9 +893,7 @@ "Manage project": "Gérer le projet", "Manage this project": "Gérer ce projet", "Manitoba": "Manitoba", - "Mark agreement as received": "Marquer l’entente comme reçue", "Mark as read": "Marquer comme lu", - "Mark estimate as returned": "Marquer le devis comme retourné", "Mark the estimate as \"returned\" by visiting the link below and searching for :projectable.": "Marquez le devis comme « retourné » en visitant le lien ci-dessous et en recherchant :projectable.", "match you to their projects or engagements": "vous jumeler à leurs projets ou consultations", "Materials": "Matériels", @@ -917,12 +925,12 @@ "Module - :title": "Module - :title", "Modules": "Modules", "Monday": "Lundi", - "Most of the time, we will not need to tell them who requested the access need. However, for some of the access needs, we will—and we’ll tell you which ones below.": "Most of the time, we will not need to tell them who requested the access need. However, for some of the access needs, we will—and we’ll tell you which ones below.", + "Most of the time, we will not need to tell them who requested the access need. However, for some of the access needs, we will—and we’ll tell you which ones below.": "La plupart du temps, nous n’aurons pas besoin de communiquer l’identité de la personne qui a demandé à bénéficier de la mesure d’accessibilité. Toutefois, pour certains besoins d’accès, nous le ferons - et nous vous dirons lesquels ci-dessous.", "Mountain Standard or Daylight Time": "Heure normale ou avancée des Rocheuses", "Mountain Standard Time*": "Heure normale des Rocheuses*", "Multiple disabilities": "Incapacités multiples", - "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30": "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30", - "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30. The specified \"--days=:days\" is invalid.": "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30. The specified \"--days=:days\" is invalid.", + "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30": "Must specify a number of days greater than 1 using the ”--days” flag. Example --days=30", + "Must specify a number of days greater than 1 using the \"--days\" flag. Example --days=30. The specified ”--days=:days” is invalid.": "Must specify a number of days greater than 1 using the ”--days” flag. Example --days=30. The specified ”--days=:days” is invalid.", "My dashboard": "Mon tableau de bord", "My email": "Mon adresse courriel", "My organization’s page": "Page de mon organisation", @@ -960,6 +968,7 @@ "New project": "Nouveau projet", "New reports uploaded": "Nouveaux rapports téléversés", "Next": "Suivant", + "Next steps": "Prochaines étapes", "No": "Non", "No, don’t share my access needs": "Non, veuillez ne pas partager mes besoins en matière d’accessibilité", "No, give me a group with intersectional experiences and\/or identities": "Non, proposez-moi un groupe avec des expériences et\/ou des identités intersectionnelles", @@ -980,9 +989,8 @@ "Non-binary people": "Personnes non-binaires", "None found.": "Rien n’a été trouvé.", "None listed": "Aucun listé", - "None selected": "Rien n’a été sélectionné", "No outcomes or reports available.": "Aucun résultat ou rapport disponible.", - "No projects found.": "Aucun projet trouvé.", + "No projects found.": "Aucune consultation trouvée.", "No resources found.": "Aucune ressource trouvée.", "Northwest Territories": "Territoires du Nord-Ouest", "Not attended yet": "Vous n’avez pas encore participé à une rencontre d’information et d’orientation.", @@ -1032,13 +1040,13 @@ "Once you have hired a Community Organization, please select the organization below.": "Une fois que vous aurez engagé une organisation communautaire, veuillez sélectionner l’organisation ci-dessous.", "Once you publish your engagement details, anyone on this website will be able to access it.": "Une fois que vous aurez publié les détails de vos consultations, n’importe qui sur ce site Internet pourra y accéder.", "Once your account has been approved, you can review and publish your organization’s page. You must have completed all the previous steps.": "Une fois votre compte approuvé, vous pouvez réviser et publier la page de votre organization. Vous devrez avoir suivi toutes les étapes précédentes auparavant.", - "Once your account has been approved, you can review and publish your page. You must have completed all the previous steps.": "Une fois votre compte approuvé, vous pouvez réviser et publier votre page. Vous devrez avoir suivi toutes les étapes précédentes auparavant.", "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information about your organization so businesses and government can learn more about what you do and who you represent or serve.": "Une fois inscrit, vous pouvez vous inscrire à une séance d’orientation pour découvrir ce que vous pouvez faire sur ce site. Vous pouvez également fournir des informations sur votre organisation afin que les entreprises et les gouvernements puissent en savoir plus sur ce que vous faites et qui vous représentez ou soutenez.", "Once you sign up, you can sign up for an orientation session to learn about what you can do on this website. You can also fill in information to facilitate a smoother collaboration with organizations, such as access needs, communication preferences, and consultation preferences.": "Une fois inscrit, vous pouvez vous inscrire à une séance d’orientation pour découvrir ce que vous pouvez faire sur ce site. Vous pouvez également remplir des informations destinées à rendre la collaboration avec les organisations plus harmonieuse, telles que vos besoins en matière d’accessibilité, vos préférences en ce qui concerne les communications ou encore les consultations.", "Once you’ve reviewed the project details, please:": "Une fois que vous aurez revu les détails du projet, veuillez :", "Only people with specific disabilities and\/or Deaf people": "Personnes ayant des handicaps spécifiques et\/ou personnes sourdes", "Only reachable within cross-disability and Deaf or intersectional groups": "Only reachable within cross-disability and Deaf or intersectional groups", "Ontario": "Ontario", + "Open": "Ouverte(s)", "Open call": "Invitation ouverte", "Opens in new tab": "S’ouvre dans un nouvel onglet", "open to other formats": "ouvert à d’autres formats", @@ -1098,13 +1106,13 @@ "Page title": "Titre de la page", "Page translations": "Traductions de la page", "Paid": "Opportunité rémunérée", - "paid": "paid", + "paid": "payé", "Pain-related disabilities": "Incapacités liées à la douleur", "Parliamentary entities": "Entités parlementaires", "Participant": "Personne participante", "Participant access needs": "Besoins en matière d’accessibilité des personnes participantes", "Participant details": "Détails de la personne participante", - "Participant Invitation": "Participant Invitation", + "Participant Invitation": "Invitation des personnes participantes", "Participant location": "Emplacement de la personne participante", "Participants": "Personnes participantes", "participants confirmed": "personnes participantes confirmées", @@ -1120,7 +1128,7 @@ "Payment": "Paiement", "Payment information": "Informations de paiement", "Payment type": "Type de paiement", - "Payment types": "Payment types", + "Payment types": "Types de paiement", "PDF": "PDF", "Pending": "En attente", "Pending approval": "En attente d’approbation", @@ -1138,12 +1146,14 @@ "Phone number to join": "Numéro de téléphone à rejoindre", "phone number to join the meeting": "numéro de téléphone pour se joindre à la réunion", "Physical and mobility disabilities": "Déficience physique et de mobilité", - "Plain language": "Langage simple", + "Pick your role": "Choisissez un rôle", + "Plain language": "Langage clair", "Plan and share your project with others on this website.": "Planifiez et partagez votre projet avec d’autres personnes sur ce site Internet.", "Play": "Jouer", "Please:": "Veuillez :", "Please be specific about where you would like the participants to go to participate in this engagement.": "Veuillez préciser le lieu où vous souhaitez que les personnes se rendent pour participer à cette consultation.", "Please check all that apply.": "Veuillez cocher toutes les cases qui s’appliquent.", + "Please check your email for a confirmation of your session date. Please email <:email> if you did not get the email, or if you need to reschedule or cancel. If you’ve gone to your orientation session, it may take 2-3 business days to be updated here on the website.": "Veuillez vérifier dans votre boîte courriel pour une confirmation de la date de votre séance. Veuillez envoyer un courriel à <:email> si vous ne l’avez pas reçue, ou si vous devez reporter ou annuler votre session. Si vous avez participé à votre session d’information et d’orientation, la mise à jour sur le site web pourrait prendre 2 à 3 jours ouvrables.", "Please choose a new password for The Accessibility Exchange": "Veuillez choisir un nouveau mot de passe pour le Connecteur pour l’accessibilité", "Please choose the language or languages you would like to use on this website.": "Veuillez choisir la ou les langues que vous souhaitez utiliser sur ce site Internet.", "Please click the button below to verify your email address.": "Veuillez cliquer sur le bouton ci-dessous pour vérifier votre adresse courriel.", @@ -1161,15 +1171,14 @@ "Please create your page to share more about who you are, your experiences, and your interests.": "Veuillez créer votre page pour en dire plus sur qui vous êtes, vos expériences et vos intérêts.", "Please describe how the Disability and Deaf communities will be impacted by the outcomes of your project.": "Veuillez décrire comment les communautés des personnes en situation de handicap et des personnes sourdes seront touchées par les résultats de votre projet.", "Please describe this engagement.": "Veuillez décrire cette consultation.", - "Please enter a :attribute that is less than or the same as the ideal number of participants.": "Veuillez saisir un :attribut inférieur ou égal au nombre idéal de personnes participantes.", + "Please enter a :attribute that is less than or the same as the ideal number of participants.": "Veuillez saisir un :attribute inférieur ou égal au nombre idéal de personnes participantes.", "Please enter an end year for your experience that is equal to or greater than the start year.": "Veuillez indiquer une année de fin pour votre expérience qui soit égale ou supérieure à l’année de début.", - "Please enter a valid :attribute.": "Please enter a valid :attribute.", + "Please enter a valid :attribute.": "Veuillez saisir un :attribute valide.", "Please enter a valid date for the :attribute.": "Veuillez entrer une date valide pour le champ :attribute.", - "Please enter a valid website link under “Accessibility and Inclusion links”.": "Veuillez saisir un lien Internet valide sous \"Liens en lien avec l’accessibilité et l’inclusion\".", + "Please enter a valid website link under “Accessibility and Inclusion links”.": "Veuillez saisir un lien Internet valide sous ”Liens en lien avec l’accessibilité et l’inclusion”.", "Please enter the email address of the individual you have hired as a Community Connector.": "Veuillez entrer l’adresse courriel de la personne que vous avez embauchée en tant que personne facilitatrice communautaire.", "Please enter your own name and email, rather than you organization’s. You will be able to create your organization in a later step.": "Veuillez saisir votre nom et votre adresse courriel plutôt que ceux de votre organisation. Vous pourrez créer votre organisation plus tard.", - "Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.": "Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.", - "Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.": "Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.", + "Please fill out and return your application. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.": "Veuillez remplir et retourner votre demande. Vous devez nous la retourner et la faire approuver avant de pouvoir participer à la séance d’information et d’orientation. Vous trouverez le formulaire de demande dans le lien ci-dessous ou dans le courriel que nous vous avons envoyé.", "Please identify the type of Regulated Organization yours is:": "Veuillez identifier le type d’organisation réglementée que vous êtes :", "Please include any links that describes the accessibility and inclusion initiatives your regulated entity has. This can include reports, case studies, and more.": "Veuillez inclure tout lien qui décrit les initiatives en matière d’accessibilité et d’inclusion de votre entité réglementée. Cela peut inclure des rapports, des études de cas, et plus encore.", "Please indicate how you would like to be notified of a new person or people being added to your engagements.": "Veuillez indiquer comment vous souhaitez être informé de l’ajout d’une ou plusieurs nouvelles personnes à vos consultations.", @@ -1201,6 +1210,7 @@ "Please list any training related to accessibility or inclusion that your team members have received.": "Veuillez énumérer toute formation liée à l’accessibilité ou à l’inclusion que les membres de votre équipe ont reçue.", "Please note that all organizations have been asked to provide gender neutral and accessible washrooms by default.": "Veuillez noter que toutes les organisations ont été invitées à fournir des toilettes non genrées et accessibles par défaut.", "Please note that selecting some of these options may open up new follow-up questions below them. ": "Veuillez noter que sélectionner certaines des options suivantes peut faire apparaître de nouvelles questions complémentaires. ", + "Please pick whether you’d like to be a Participant, a Consultant, or a Connector.": "Veuillez choisir si vous souhaitez être une personne participant à des consultations, une personne consultante en accessibilité ou une personne facilitatrice communautaire.", "Please provide personal information that will help us find consultations for you to participate in.": "Veuillez fournir les renseignements personnels nécessaires pour nous aider à trouver des consultations auxquelles vous pourriez participer.", "Please provide the details for a member of your team whom potential participants may contact to ask questions.": "Veuillez fournir les coordonnées de la personne de votre équipe que les personnes susceptibles de participer peuvent contacter pour leur poser des questions.", "Please reach out to us and we can try to help.": "N’hésitez pas à nous contacter et nous nous efforcerons de vous aider.", @@ -1291,12 +1301,8 @@ "Project scope (English)": "Portée du projet (anglais)", "Project scope (French)": "Portée du projet (français)", "Project scope must be provided in either English or French.": "La portée du projet doit être fournie en anglais ou en français.", - "Projects I am contracted for": "Projets pour lesquels je suis sous contrat", - "Projects I am participating in": "Projets auxquels je participe", - "Projects I am running": "Projets que je dirige", - "Projects involved in as a Community Connector": "Mes projets à titre de personne facilitatrice communautaire", - "Projects involved in as a Consultation Participant": "Mes projets à titre de personne participant à des consultations", "Projects I’m running": "Projets que je dirige", + "Projects my organization has created": "Projets créés par mon organisation", "projects notification setting": "paramètres des notifications pour le projet", "Project start date": "Date de début du projet", "Projects that are looking for people that my organization represents or supports": "Projets cherchant des personnes que mon organisation représente ou soutient", @@ -1347,8 +1353,8 @@ "Registration": "Registration", "regulated-organization.types.' . $type)], 'en": "regulated-organization.types.' . $type)], 'en", "Regulated Organization": "Organisation sous réglementation fédérale", - "regulated organization": "organisation sous réglementation fédérale", "Regulated organization": "Organisation sous réglementation fédérale", + "regulated organization": "organisation sous réglementation fédérale", "Regulated organization name": "Nom de l’organisation sous réglementation fédérale", "Regulated Organization page": "Page de l’organisation sous réglementation fédérale", "Regulated organizations": "Organisations sous réglementation fédérale", @@ -1402,7 +1408,6 @@ "return to engagement": "retourner à la consultation", "Review and publish engagement details": "Réviser et publier les détails de la consultation", "Review and publish your organization’s public page": "Révisez et publiez la page publique de votre organisation", - "Review and publish your public page": "Révisez et publiez votre page publique", "review and updates notification settings": "review and updates notification settings", "Review engagement details": "Réviser les détails de la consultation", "Review project": "Réviser le projet", @@ -1411,18 +1416,17 @@ "role": "rôle", "Roles": "Rôles", "roles": "rôles", - "Roles:": "Rôles :", "Roles and permissions": "Rôles et permissions", "Run by": "Dirigé par", - "Running": "Running", + "Running": "En cours", "Running a consultation": "Gestion de la consultation", "Rural areas": "Zones rurales", - "Safe walk program": "Service de raccompagnement (\"Safe Walk\")", + "Safe walk program": "Service de raccompagnement (”Safe Walk”)", "Saskatchewan": "Saskatchewan", "Saturday": "Samedi", "Save": "Enregistrer", "Save and back": "Enregistrer et revenir à la page précédente", - "Save and back to confirm access needs": "Save and back to confirm access needs", + "Save and back to confirm access needs": "Enregistrer et revenir pour confirmer les besoins en matière d’accessibilité", "Save and next": "Enregistrer et passer à la page suivante", "Save and previous": "Sauver et retourner à la page précédente", "Save changes": "Sauvegarder les modifications", @@ -1477,21 +1481,23 @@ "Sign language translation": "Traduction en langue des signes", "Sign Language video": "Vidéo en langue des signes", "Sign out": "Se déconnecter", - "Sign up": "S’inscrire", + "Sign up": "Inscriptions", "Sign up and attend an orientation session": "Inscrivez-vous et participez à une session d’information et d’orientation", + "Sign up closed on :date": "Inscriptions fermées depuis le :date", "Sign up deadline": "Date limite d’inscription", "sign up deadline": "date limite d’inscription", - "Sign up for an open engagement": "Sign up for an open engagement", + "Sign up for an open engagement": "S’inscrire à une consultation en cours", "Sign up for an orientation session": "S’inscrire à une séance d’orientation", "Sign up for this engagement": "S’inscrire à cette consultation", "Sign up online": "S’inscrire en ligne", "Sign up on the phone": "S’inscrire au téléphone", + "Sign up open until :date": "Inscriptions ouvertes jusqu’au :date", "Since a website link under “Accessibility and Inclusion links” has been entered, you must also enter a website title.": "Puisqu’un lien Internet a été saisi dans la section « Liens relatifs à l’accessibilité et à l’inclusion », vous devez également saisir un titre de site Internet.", "Since a website title under “Accessibility and Inclusion links” has been entered, you must also enter a website link.": "Puisqu’un titre a été saisi dans la section « Liens relatifs à l’accessibilité et à l’inclusion », vous devez également saisir un lien Internet.", "Since this is a follow-up to a previous project, you must specify the previous project.": "Puisqu’il s’agit du prolongement d’un projet précédent, vous devez préciser le projet originel.", "Since you have indicated that your contact person needs VRS, please enter a phone number.": "Puisque vous avez indiqué que votre personne contact a besoin du service de relais vidéo, veuillez entrer un numéro de téléphone.", "Since you have indicated that your support person needs VRS, please enter a phone number.": "Veuillez indiquer un numéro de téléphone pour la personne vous soutenant.", - "Single parents and\/or guardians": "Single parents and\/or guardians", + "Single parents and\/or guardians": "Familles monoparentales et\/ou tuteurs", "Site unavailable": "Service indisponible", "Skills and strengths": "Compétences et forces", "skills and strengths": "skills and strengths", @@ -1525,7 +1531,7 @@ "Status updated.": "Statut actualisé.", "Step :current of :total": "Étape :current de :total", "Steps for creating your project": "Étapes à suivre pour créer votre projet", - "Stop": "Stop", + "Stop": "Arrêter", "Street address": "Adresse postale", "Submit": "Soumettre", "Such as, federal departments, agencies, and crown corporations, other public sector bodies and businesses.": "Par exemple, les ministères fédéraux, les agences et les sociétés d’État, les autres organismes et entreprises du secteur public.", @@ -1586,12 +1592,12 @@ "The agreement for “:project” has been marked as received.": "L’entente pour « :project » a été marquée comme reçue.", "The agreement has been marked as received.": "The agreement has been marked as received.", "The agreement will be sent with your estimate. Please sign this agreement and send it to <:email>.": "L’entente sera envoyée avec votre devis. Veuillez signer l’entente et l’envoyer à <:email>.", - "The app:refresh-dev command cannot be run in the \":env\" application environment.": "The app:refresh-dev command cannot be run in the \":env\" application environment.", - "The Canadian Forces and the Royal Canadian Mounted Police": "Les Forces canadiennes et la Gendarmerie royale du Canada", + "The app:refresh-dev command cannot be run in the \":env\" application environment.": "The app:refresh-dev command cannot be run in the ”:env” application environment.", + "The Canadian Forces and the Royal Canadian Mounted Police": "Forces canadiennes et Gendarmerie royale du Canada", "The Community Organization being consulted with for this engagement.": "Organisation communautaire consultée dans le cadre de cette consultation.", "The estimate for “:project” has been marked as returned.": "Le devis pour « :project » a été marqué comme retourné.", "The estimate has been marked as returned.": "The estimate has been marked as returned.", - "The following values will be expanded in the output to their full URL or email address: \":home": "The following values will be expanded in the output to their full URL or email address: \":home", + "The following values will be expanded in the output to their full URL or email address: \":home": "The following values will be expanded in the output to their full URL or email address: ”:home", "The individual on this website with the email address you provided is not a community connector.": "La personne pour laquelle vous avez entré l’adresse courriel n’est pas une personne facilitatrice communautaire.", "The individual with the email address you provided is already participating in this engagement.": "La personne avec le courriel que vous avez fourni participe déjà à cette consultation.", "The languages you can work in.": "Les langues dans lesquelles vous pouvez travailler.", @@ -1614,6 +1620,7 @@ "The other payment type must be specified.": "Vous devez spécifier l’autre type de paiement.", "The person with the email address you provided is not a consultation participant.": "La personne dont l’adresse courriel est indiquée ne participe pas à la consultation.", "The provided password does not match your current password.": "Le mot de passe fourni ne correspond pas à votre mot de passe actuel.", + "There are no next steps. After this you’ll be able to sign up for engagements!": "Il n’y a pas de prochaines étapes. Après cela, vous pourrez vous inscrire à des consultations!", "There is already a :type with the name registered on this platform.": "Il existe déjà un :type avec ce nom enregistré sur la plateforme.", "There is already a :type with the name “:name” registered on this platform. If this is the organization you work for, please contact your colleagues to get an invitation to the organization. If this isn’t the organization you work for, please use a different name.": "Il existe déjà un :type avec le nom « :name » sur cette plateforme. S’il s’agit de l’organisation pour laquelle vous travaillez, veuillez contacter vos collègues pour obtenir une invitation à la rejoindre. S’il ne s’agit pas de l’organisation pour laquelle vous travaillez, veuillez utiliser un autre nom.", "There is no disability type filled in under \"something else\". Please fill this in.": "Aucun type de handicap n’a été indiqué sous « autre chose ». Merci de le remplir.", @@ -1631,7 +1638,7 @@ "The suspension of :account has been lifted.": "La suspension de :account a été levée.", "The suspension of an organization and its users has been lifted.": "La suspension d’une organisation et de ses membres a été levée.", "The type of disability they experience": "Le type de handicap vécu", - "The user’s role is missing.": "The user’s role is missing.", + "The user’s role is missing.": "Le rôle de l’utilisateur n’est pas défini.", "They have been instructed to send their signed agreement to <:email>.": "Ils ont été priés d’envoyer leur accord signé à <:email>.", "They require Video Relay Service (VRS) for phone calls": "Cette personne a besoin du service de relais vidéo (SRV) pour les appels téléphoniques", "They will not be able to:": "Ils ne seront pas en mesure de faire les choses suivantes :", @@ -1651,7 +1658,6 @@ "This estimate includes the following engagements:": "Ce devis comprend les consultations suivantes :", "This estimate was sent to :contact on :date.": "Ce devis a été envoyé à :contact le :date.", "This includes disability and Deaf representative organizations, support organizations, and other civil society organizations (not only disability focused).": "Cela inclut les organisations représentant les personnes en situation de handicap et les personnes sourdes, les organisations de défense des droits et les autres organisations de la société civile (pas seulement axées sur le handicap).", - "This includes projects by Regulated Organizations and Community Organizations.": "Cela comprend les projets des organisations réglementées et des organisations communautaires.", "This individual has already been invited to your engagement.": "Cette personne a déjà été invitée à votre consultation.", "This information is a part of your public profile that you can publish and share with other members of the website, including governments and businesses. This provides an overview to others about who you are.": "Ces informations font partie du profil public que vous pouvez publier et partager avec les autres membres du site Internet, y compris les gouvernements et les entreprises. Cela donne aux autres un aperçu de qui vous êtes.", "This information is used to tell regulated organizations if you have any special interests. This entire page is optional.": "Ces informations sont utilisées pour indiquer aux organismes réglementés si vous avez des intérêts en particulier. Cette page est entièrement facultative.", @@ -1680,7 +1686,8 @@ "This will help people know what to expect when working with you.": "Cela permettra aux gens de savoir à quoi s’attendre lorsqu’ils travaillent avec vous.", "This will help you get paid in the way that you want.": "Cela vous permettra d’être payé de la façon qui vous convient le mieux.", "This will only be shared with participants who have accepted the invitation.": "Cette information ne sera partagée qu’avec les personnes qui ont acceptées l’invitation.", - "This will show Community Connectors on the [browse projects](:url) page that you are looking, and that they are welcome to reach out.": "Cela montrera aux personnes facilitatrices communautaires de la page [parcourir les projets](:url) que vous êtes en train de chercher et qu’elles peuvent vous contacter.", + "This will show Community Connectors on the [browse engagements](:url) page that you are looking, and that they are welcome to reach out.": "Cela montrera aux personnes facilitatrices communautaires sur la page [browse engagements](:url) que vous êtes à la recherche d’une personne pour cette consultation et que vous êtes intéressé-e à être contacté-e.", + "This will show up once you pick your role.": "Cela apparaîtra une fois que vous aurez choisi votre rôle.", "Through contacting me or my support person": "En me contactant ou en contactant la personne m’apportant du soutien", "Throughout this page, you can choose whether you would like notifications to be sent through the website or by contacting the project team contact for that specific project directly. You can edit this in each individual project page.": "Sur cette page, vous pouvez choisir si vous souhaitez que les notifications soient envoyées via le site Internet ou directement à la personne responsable du projet en question. Vous pouvez modifier ce réglage pour chaque projet individuellement.", "Throughout this page, you can chose whether you would like notifications to be sent through the website or by contacting :contact_person directly.": "Sur cette page, vous pouvez choisir si vous souhaitez que les notifications soient envoyées via le site Internet ou directement à :contact_person.", @@ -1746,7 +1753,7 @@ "Upon request": "Sur demande", "Urban, rural, or remote": "Urbain, rural ou éloigné", "Urban areas": "Zones urbaines", - "User languages": "User languages", + "User languages": "Langues de l’utilisateur", "using the matching service to match the regulated organization with a group of people who meet the criteria.": "en utilisant le service de jumelage afin de mettre en relation l’organisme réglementé avec un groupe de personnes qui répondent à ses critères.", "Verify Email Address": "Vérifiez votre adresse courriel", "Verify your email": "Vérifiez votre adresse courriel", @@ -1765,8 +1772,9 @@ "Voice recording": "Enregistrement vocal", "Volunteer": "Bénévole", "VRS": "SRV", + "Watch introduction video again": "Visionner à nouveau la vidéo de présentation", "Ways to attend": "Façons de participer", - "ways to attend": "ways to attend", + "ways to attend": "façons de participer", "Ways to participate": "Façons de participer", "We ask Accessibility Consultants for the following information:": "Nous demandons aux personnes consultantes en matière d’accessibilité de fournir les informations suivantes :", "We ask Community Connectors for the following information:": "Nous demandons aux personnes facilitatrices communautaires de fournir les informations suivantes :", @@ -1775,7 +1783,7 @@ "Website accessibility preferences": "Préférences d’accessibilité du site Internet", "Website language": "Langue du site internet", "Website link": "Lien de votre site Internet", - "Website links must be in the format “https:\/\/example.com”.": "Les liens vers les sites Internet doivent être au format \"https:\/\/example.com\".", + "Website links must be in the format “https:\/\/example.com”.": "Les liens vers les sites Internet doivent être au format ”https:\/\/example.com”.", "Website settings": "Réglages du site", "Website title": "Titre du site Internet", "We can offer some time flexibility if it does not match with participants’ schedules.": "Nous sommes en mesure d’offrir une certaine flexibilité au niveau des horaires si ceux-ci ne correspondent pas à l’emploi du temps des personnes participantes.", @@ -1784,7 +1792,7 @@ "Welcome to": "Bienvenue sur le", "Welcome to the Accessibility Exchange": "Bienvenue sur le Connecteur pour l’accessibilité", "Welcome to The Accessibility Exchange": "Bienvenue sur le Connecteur pour l’accessibilité", - "We may have not updated this status in our system yet. Please wait a few days before seeing this status update. If you have further questions, please [contact us](:url).": "Il se peut que la mise à jour n'ait pas encore été enregistrée dans notre système. Un délai de quelques jours pourrait être nécessaire avant de voir la mise à jour dans votre compte. Si vous avez d’autres questions, n’hésitez pas à [nous contacter](:url).", + "We may have not updated this status in our system yet. Please wait a few days before seeing this status update. If you have further questions, please [contact us](:url).": "Il se peut que la mise à jour n’ait pas encore été enregistrée dans notre système. Un délai de quelques jours pourrait être nécessaire avant de voir la mise à jour dans votre compte. Si vous avez d’autres questions, n’hésitez pas à [nous contacter](:url).", "We will ask you about what is the best way to contact you, and your contact information. We will also ask you about whether you have a preference for either in-person or virtual meetings.": "Nous vous demanderons quel est le meilleur moyen de vous contacter et quelles sont vos coordonnées. Nous vous demanderons également si vous avez une préférence pour les réunions en personne ou virtuelles.", "We will ask you about what your access needs are to participate in either an in-person meeting or virtual meeting. We also ask whether you have a preference for either in-person or virtual meetings.": "Nous vous demandons quels sont vos besoins en matière d’accessibilité pour participer à une réunion en personne ou à une réunion virtuelle. Nous vous demandons également si vous avez une préférence pour les réunions en personne ou virtuelles.", "We will ask you about whether you have a preference for either in-person or virtual meetings. We will also ask you how you would like us to contact you, and for your contact information.": "Nous vous demanderons si vous avez une préférence pour les réunions en personne ou virtuelles. Nous vous demanderons également comment vous souhaitez que nous vous contactions, ainsi que vos coordonnées.", @@ -1932,14 +1940,14 @@ "You currently do not have a Community Organization for this engagement.": "Vous n’avez actuellement pas d’organisation communautaire pour cette consultation.", "You don’t need to be a member of these communities yourself.": "Vous n’avez pas besoin d’être vous-même membre de ces communautés.", "You have been invited as a :role": "Vous avez été invité en tant que :role", - "You have been invited as a :role to :projectable’s :invitationable_type, :invitationable.": "Vous avez été invité en tant que :role à :projectable :invitationable_type, :invitationable.", + "You have been invited as a :role to :projectable’s :invitationable_type, :invitationable.": "Vous avez été invité en tant que :role à la :invitationable_type de :projectable , :invitationable.", "You have been invited as a Consultation Participant": "Vous avez été invité en tant que personne participante à la consultation", "You have been invited to join :invitationable’s team.": "Vous avez été invité à rejoindre l’équipe « :invitationable ».", "You have been invited to join the :invitationable team!": "Vous avez été invité à rejoindre l’équipe :invitationable !", "You have been invited to join the :invitationable_type “:invitationable” as a :role.": "Vous avez été invité à rejoindre le :invitationable_type « :invitationable» en tant que :role.", "You have been invited to join the :invitationable_type “:invitationable” as a participant.": "Vous avez été invité à rejoindre le :invitationable_type « :invitationable» en tant que personne participante.", "You have been invited to the :invitationable_type \":invitationable\" as a :role on The Accessibility Exchange. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.": "Vous avez été invité au :invitationable_type « :invitationable » en tant que :role sur le Connecteur pour l’accessibilité. Connectez-vous à votre compte à l’adresse https:\/\/accessibilityexchange.ca pour continuer.", - "You have been invited to the engagement \":invitationable\" as a participant on The Accessibility Exchange. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.": "Vous avez été invité à la consultation \":invitationable\" en tant que participant au Connecteur pour l’accessibilité. Connectez-vous à votre compte sur https:\/\/accessibilityexchange.ca pour continuer.", + "You have been invited to the engagement \":invitationable\" as a participant on The Accessibility Exchange. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.": "Vous avez été invité à la consultation ”:invitationable” en tant que participant au Connecteur pour l’accessibilité. Connectez-vous à votre compte sur https:\/\/accessibilityexchange.ca pour continuer.", "You have completed your engagement details, **but you won’t be able to publish them until you [get an estimate](:get_estimate) for this project and approve it**.": "Vous avez rempli les détails de votre consultation, **mais vous ne pourrez pas les publier avant d’avoir [obtenu un devis](:get_estimate) pour ce projet et de l’avoir approuvé**.", "You have declined an invitation on behalf of your organization, :organization, to work as a :role on :invitationable.": "Vous avez refusé une invitation au nom de votre organisation, :organization, à travailler en tant que :role au sein de :invitationable.", "You have declined an invitation on behalf of your organization.": "Vous avez décliné une invitation au nom de votre organisation.", @@ -1952,26 +1960,26 @@ "You have not passed the quiz.": "Vous n’avez pas réussi le jeu-questionnaire.", "You have now completed this course. Your certificate of completion has been sent to your email.": "Vous avez complété avec succès ce sours. Votre certification de réussite vous a été envoyé par courriel.", "You have successfully added :notificationable to your list.": "Vous avez ajouté avec succès :notificationable à votre liste.", - "You have successfully added :organization as the Community Organization you are consulting with for this engagement.": "Vous avez ajouté avec succès :organisation comme l’organisation communautaire avec laquelle vous travaillez pour cette consultation.", + "You have successfully added :organization as the Community Organization you are consulting with for this engagement.": "Vous avez ajouté avec succès :organization comme l’organisation communautaire avec laquelle vous travaillez pour cette consultation.", "You have successfully added the Community Organization you are consulting with for this engagement.": "Vous avez ajouté avec succès l’organisation communautaire avec laquelle vous travaillez pour cette consultation.", "You have successfully added to your list.": "Vous avez ajouté avec succès à votre liste.", "You have successfully approved your estimate.": "Vous avez approuvé le devis avec succès.", - "You have successfully blocked.": "You have successfully blocked.", + "You have successfully blocked.": "Bloqué avec succès.", "You have successfully blocked :blockable.": "Vous avez bloqué : blockable.", "You have successfully completed course :course and passed the quiz.": "Vous avez terminé avec succès le cours :course et réussi le jeu-questionnaire.", "You have successfully left this engagement.": "Vous avez quitté cette consultation avec succès.", "You have successfully removed :notificationable from your notification list.": "Vous avez supprimé :notifiable de votre liste de notification.", "You have successfully removed :organization as the Community Organization for this engagement.": "Vous avez retiré :organization comme organisation communautaire pour cette consultation.", - "You have successfully removed from your notification list.": "You have successfully removed from your notification list.", - "You have successfully removed the Community Organization for this engagement.": "You have successfully removed the Community Organization for this engagement.", + "You have successfully removed from your notification list.": "Retiré avec succès de votre liste de notifications.", + "You have successfully removed the Community Organization for this engagement.": "Vous avez supprimé avec succès l’organisation communautaire pour cette consultation.", "You have successfully saved your :model page.": "Vous avez enregistré avec succès votre page :model.", "You have successfully saved your draft :item page.": "Vous avez enregistré avec succès votre brouillon de page :item.", "You have successfully saved your draft :model page.": "Vous avez enregistré avec succès votre brouillon de page :model.", "You have successfully signed up": "Vous vous êtes inscrit avec succès", - "You have successfully signed up, and your name and your contact information have been shared with :projectable. Please confirm your access needs so they can be shared with :projectable (without your name beside it):": "You have successfully signed up, and your name and your contact information have been shared with :projectable. Please confirm your access needs so they can be shared with :projectable (without your name beside it):", + "You have successfully signed up, and your name and your contact information have been shared with :projectable. Please confirm your access needs so they can be shared with :projectable (without your name beside it):": "Vous vous êtes inscrit(e) avec succès et votre nom et vos coordonnées ont été communiqués à :projectable. Veuillez confirmer vos besoins en matière d’accessibilité afin qu’ils puissent être partagés avec :projectable (votre nom ne sera pas communiqué) :", "You have successfully signed up for this engagement.": "Vous vous êtes inscrit avec succès à cette consultation.", "You have successfully submitted an estimate request.": "Votre demande de devis a été soumise avec succès.", - "You have successfully unblocked.": "You have successfully unblocked.", + "You have successfully unblocked.": "Débloqué avec succès.", "You have successfully unblocked :blockable.": "Vous avez débloqué :blockable.", "You may accept this invitation by clicking the button below:": "Vous pouvez accepter cette invitation en cliquant sur le bouton ci-dessous :", "You must agree to the privacy policy.": "Vous devez accepter la politique de confidentialité.", @@ -2000,7 +2008,7 @@ "You must enter your organization name in either English or French.": "Vous devez saisir le nom de votre organisation en anglais ou en français.", "You must enter your organization’s name in either English or French.": "Vous devez saisir le nom de votre organisation en anglais ou en français.", "You must fill out your [payment information](:url) before you can sign up.": "Vous devez rentrer vos [informations de paiement](:url) avant de pouvoir vous joindre.", - "You must identify the other team that will be going through the results and producing an outcome.": "You must identify the other team that will be going through the results and producing an outcome.", + "You must identify the other team that will be going through the results and producing an outcome.": "Vous devez identifier l’autre équipe qui analysera les résultats et produira un rapport.", "You must identify who will be going through the results and producing an outcome.": "Vous devez identifier qui examinera les résultats et produira un rapport.", "You must indicate at least one way for participants to attend the meeting.": "Vous devez indiquer au moins un moyen pour les personnes participantes de se joindre à la réunion.", "You must indicate if the reports will be publicly available.": "Veuillez indiquer si les rapports seront accessibles au public.", @@ -2008,6 +2016,7 @@ "You must indicate the :values.": "Vous devez indiquer l’attribut :values.", "You must indicate who you want to engage.": "Vous devez indiquer qui vous voulez impliquer.", "You must pick at least one of these roles.": "Vous devez choisir au moins un de ces rôles.", + "You must return this and have it approved.": "Vous devez nous le renvoyer pour approbation.", "You must select a language.": "Vous devez sélectionner une langue.", "You must select a role for your organization.": "Vous devez sélectionner un rôle pour votre organisation.", "You must select at least one age group you can connect to.": "Vous devez sélectionner au moins un groupe d’âge auprès duquel vous pouvez servir d’intermédiaire.", @@ -2018,8 +2027,8 @@ "You must select at least one gender or sexual identity group your organization specifically :represents_or_serves_and_supports.": "Vous devez sélectionner au moins un groupe d’identité sexuelle ou de genre que votre organisation :represents_or_serves_and_supports.", "You must select at least one Indigenous group you can connect to.": "Vous devez sélectionner au moins un groupe autochtone auprès duquel vous pouvez servir d’intermédiaire.", "You must select at least one Indigenous group your organization specifically :represents_or_serves_and_supports.": "Vous devez sélectionner au moins un groupe autochtone que votre organisation :represents_or_serves_and_supports.", - "You must select at least one option for \"Do you specifically :represent_or_serve_and_support people with disabilities, Deaf persons, and\/or their supporters?\"": "Vous devez sélectionner au moins une option pour \":represent_or_serve_and_support spécifiquement les personnes en situation de handicap, les personnes sourdes et\/ou leurs alliés ?\"", - "You must select at least one option for “Can you connect to people with disabilities, Deaf persons, and\/or their supporters?”": "Vous devez sélectionner au moins une option pour \"Pouvez-vous servir d’intermédiaire auprès des personnes en situation de handicap, des personnes sourdes et\/ou leurs alliés?\"", + "You must select at least one option for \"Do you specifically :represent_or_serve_and_support people with disabilities, Deaf persons, and\/or their supporters?\"": "Vous devez sélectionner au moins une option pour ”:represent_or_serve_and_support spécifiquement les personnes en situation de handicap, les personnes sourdes et\/ou leurs alliés ?”", + "You must select at least one option for “Can you connect to people with disabilities, Deaf persons, and\/or their supporters?”": "Vous devez sélectionner au moins une option pour ”Pouvez-vous servir d’intermédiaire auprès des personnes en situation de handicap, des personnes sourdes et\/ou leurs alliés?”", "You must select at least one option for “Where do the people that you :represent_or_serve_and_support come from?”": "Vous devez sélectionner au moins une option pour « D’où viennent les personnes que vous représentez »", "You must select at least one option for “Where do the people that you can connect to come from?”": "Vous devez sélectionner au moins une option pour « D’où viennent les personnes auprès desquelles vous pouvez servir d’intermédiaire ? »", "You must select at least one way to attend the meeting.": "Vous devez choisir au moins une façon d’assister à la réunion.", @@ -2034,16 +2043,16 @@ "You must select one option for “Can you connect to refugees and\/or immigrants?”": "Vous devez sélectionner une option pour « Pouvez-vous servir d’intermédiaire auprès des personnes réfugiées ou migrantes ? »", "You must select one option for “Does your organization :represent_or_serve_and_support a specific age bracket or brackets?”": "Vous devez sélectionner une option pour « Votre organisation :represent_or_serve_and_support -t-elle une ou plusieurs tranches d’âge spécifiques ? »", "You must select one option for “Does your organization :represent_or_serve_and_support a specific ethnoracial identity or identities?”": "Vous devez sélectionner une option pour « Votre organisation :represent_or_serve_and_support -t-elle une ou plusieurs groupes racisés ou éthniques ? »", - "You must select one option for “Does your organization specifically :represent_or_serve_and_support people who are First Nations, Inuit, or Métis?”": "Vous devez sélectionner une option pour \"Votre organisation :represent_or_serve_and_support spécifiquement les membres des Premières nations, les Inuits ou les Métis?\"", - "You must select one option for “Does your organization specifically :represent_or_serve_and_support people who are marginalized based on gender or sexual identity?”": "You must select one option for “Does your organization specifically :represent_or_serve_and_support people who are marginalized based on gender or sexual identity?”", - "You must select one option for “Does your organization specifically :represent_or_serve_and_support refugees and\/or immigrants?”": "You must select one option for “Does your organization specifically :represent_or_serve_and_support refugees and\/or immigrants?”", + "You must select one option for “Does your organization specifically :represent_or_serve_and_support people who are First Nations, Inuit, or Métis?”": "Vous devez sélectionner une option pour ”Votre organisation :represent_or_serve_and_support spécifiquement les membres des Premières nations, les Inuits ou les Métis?”", + "You must select one option for “Does your organization specifically :represent_or_serve_and_support people who are marginalized based on gender or sexual identity?”": "Vous devez sélectionner une option pour ”Votre organisation représente-t-elle spécifiquement ou sert-elle et soutient-elle les personnes marginalisées en raison de leur genre ou de leur identité sexuelle ?”", + "You must select one option for “Does your organization specifically :represent_or_serve_and_support refugees and\/or immigrants?”": "Vous devez sélectionner une option pour ”Votre organisation représente-t-elle ou sert-elle spécifiquement les personne réfugiées et\/ou les personnes migrantes?”", "You must select one option for “Do you have lived experience of the people you can connect to?”": "Vous devez saisir une réponse à la question « Avez-vous une expérience vécue partagée avec les personnes pour lesquelles vous pouvez servir d’intermédiaire ? »", - "You must select one option for “Do you have staff who have lived experience of the people you :represent_or_serve_and_support?”": "You must select one option for “Do you have staff who have lived experience of the people you :represent_or_serve_and_support?”", + "You must select one option for “Do you have staff who have lived experience of the people you :represent_or_serve_and_support?”": "Vous devez sélectionner une option pour ”Votre personnel a-t-il une expérience vécue des personnes que vous représentez, servez ou soutenez?”", "You must select one option for “Please select people with disabilities that you can connect to”.": "Vous devez indiquer une option pour la question « Sélectionnez les personnes en situation de handicap auprès desquelles vous pouvez servir d’intermédiaire ».", - "You must select one option for “Please select people with disabilities that you specifically :represent_or_serve_and_support”.": "You must select one option for “Please select people with disabilities that you specifically :represent_or_serve_and_support”.", + "You must select one option for “Please select people with disabilities that you specifically :represent_or_serve_and_support”.": "Vous devez sélectionner une option pour ”Veuillez sélectionner les personnes en situation de handicap que vous représentez ou soutenez”.", "You must select what type of organization you are.": "Vous devez sélectionner votre type d’organisation.", "You must select what you would like to do on the website.": "Vous devez sélectionner ce que vous souhaiteriez faire sur le site Internet.", - "You must select which people with specific disabilities and\/or Deaf people you can connect to.": "You must select which people with specific disabilities and\/or Deaf people you can connect to.", + "You must select which people with specific disabilities and\/or Deaf people you can connect to.": "Vous devez sélectionner les personnes ayant des handicaps spécifiques et\/ou les personnes sourdes avec lesquelles vous avez des liens.", "You must select which specific disability and\/or Deaf groups your organization :represents_or_serves_and_supports.": "Vous devez sélectionner les groupes de personnes handicapées et\/ou de sourds que votre organisation :represents_or_serves_and_supports.", "You must tell us who you’re joining as.": "Vous devez nous dire sous quelle identité vous vous inscrivez.", "You must [approve your estimate and return your signed agreement](:estimates_and_agreements) before you can publish your engagement.": "Vous devez [approuver votre devis et renvoyer votre entente signée](:estimates_and_agreements) avant de pouvoir publier votre consultation.", @@ -2061,7 +2070,6 @@ "Your account on the Accessibility Exchange has been suspended.": "Votre compte sur le Connecteur pour l’accessibilité a été suspendu.", "Your account on the Accessibility Exchange is no longer suspended.": "Votre compte sur le Connecteur pour l’accessibilité a été réinstauré.", "Your account suspension has been lifted": "La suspension de votre compte a été levée", - "Your agreement has been received": "Votre entente a été reçue", "Your agreement has been received for **:project**. You can now publish your project page and engagement details.": "Votre entente a été reçue pour **:project**. Vous pouvez maintenant publier votre page de projet et les détails de votre consultation.", "Your agreement has been received for :project. You can now publish your project page and engagement details. Sign in to your account at https:\/\/accessibilityexchange.ca to continue.": "Votre entente a été reçue pour :project. Vous pouvez maintenant publier votre page de projet et les détails de votre consultation. Connectez-vous à votre compte sur https:\/\/accessibilityexchange.ca pour continuer.", "Your areas of interest have been updated.": "Vos centres d’intérêt ont été mis à jour.", @@ -2075,7 +2083,6 @@ "Your engagement has been updated.": "Votre consultation a été mise à jour.", "Your engagement translations have been updated.": "Les traductions de vos consultations ont été mises à jour.", "Your estimate for **:project**, along with a project agreement for you to sign, has been sent to <:contact>.": "Votre devis pour **:project**, ainsi qu’une entente à signer ont été envoyés à <:contact>.", - "Your estimate has been returned": "Votre devis a été retourné", "Your estimate has been returned for :project, along with a project agreement for you to sign. Sign in to your account at https:\/\/accessibilityexchange.ca for further details.": "Votre devis a été renvoyé pour le projet :project, ainsi qu’une etente de projet à signer. Connectez-vous à votre compte sur https:\/\/accessibilityexchange.ca pour plus de détails.", "Your federally regulated organization has been deleted.": "Votre organisation sous réglementation fédérale a été supprimée.", "Your federally regulated organization has been updated.": "Votre organisation sous réglementation fédérale a été mise à jour.", @@ -2118,6 +2125,7 @@ "your public profile will be removed from the platform": "votre profil public sera supprimé de la plateforme", "Your regulated organization, :name, will be deleted and cannot be recovered. If you still want to delete your regulated organization, please enter your current password to proceed.": "Votre organisme réglementé, :name, sera supprimé et ne pourra pas être récupéré. Si vous souhaitez toujours supprimer votre organisme réglementé, veuillez saisir votre mot de passe actuel pour continuer.", "Your roles have been saved.": "Vos rôles ont été enregistrés.", + "Your signed agreement has been received": "Votre entente signée a été reçue", "your support person, :name": "la personne vous apportant du soutien, :name", "Your support person’s name is required if they are your preferred contact person.": "Le nom de la personne vous apportant du soutien est requis s’il s’agit de votre personne de contact.", "Your website accessibility preferences have been updated.": "Vos préférences en matière d’accessibilité pour le site Internet ont été mises à jour.", @@ -2146,6 +2154,7 @@ "Yukon Territory": "Territoire du Yukon", "[:projectable](:projectable_url) has approved an estimate for their project [:project](:project_url).": "[:projectable](:projectable_url) a approuvé un devis pour leur projet [:project](:project_url).", "[:projectable](:projectable_url) has requested an estimate for their project [:project](:project_url).": "[:projectable](:projectable_url) a demandé un devis pour leur projet [:project](:project_url).", + "{1} :count engagement matches your applied filters.": "{1} :count engagement matches your applied filters.", "{1} :count project matches your applied filters.": "{1} :count projet(s) correspondent à vos critères de recherche.", "{1} :count result for “:searchQuery”.": "{1} :count resultat(s) pour « :searchQuery ».", "“About your organization”": "« À propos de votre organisation »", diff --git a/resources/lang/fr/routes.php b/resources/lang/fr/routes.php index bf6e19af3..d86f0c66b 100644 --- a/resources/lang/fr/routes.php +++ b/resources/lang/fr/routes.php @@ -35,6 +35,7 @@ 'dashboard/notifications' => 'dashboard/notifications', 'dashboard/notifications/all' => 'dashboard/notifications/all', 'dashboard/trainings' => 'dashboard/trainings', + 'engagements' => 'engagements', 'engagements/{engagement}' => 'engagements/{engagement}', 'engagements/{engagement}/access-needs-permissions' => 'engagements/{engagement}/access-needs-permissions', 'engagements/{engagement}/confirm-access-needs' => 'engagements/{engagement}/confirm-access-needs', @@ -114,7 +115,6 @@ 'people-and-organizations' => 'people-and-organizations', 'people-and-organizations/consultants' => 'people-and-organizations/consultants', 'projects' => 'projets', - 'projects/all' => 'projects/all', 'projects/context/select' => 'projects/context/select', 'projects/contracted' => 'projects/contracted', 'projects/create' => 'projects/create', diff --git a/resources/views/components/card/engagement.blade.php b/resources/views/components/card/engagement.blade.php index 017292a50..3d5d5c25e 100644 --- a/resources/views/components/card/engagement.blade.php +++ b/resources/views/components/card/engagement.blade.php @@ -1,3 +1,9 @@ +@props([ + 'byline' => false, + 'level' => 2, + 'model' => null, +]) + <x-card class="engagement" title-class="h4"> <x-slot name="title"> <a @@ -7,7 +13,17 @@ </x-slot> @if ($model->format) - <p><strong>{{ $model->display_format }}</strong></p> + <p><strong> + + @if ($byline) + {{ __(':format by :projectable', [ + 'format' => $model->display_format, + 'projectable' => $model->project->projectable->name, + ]) }} + @else + {{ $model->display_format }} + @endif + </strong></p> @endif <div class="meta"> @@ -27,6 +43,16 @@ @endif </div> + @if ($model->signup_by_date) + <p class="font-semibold"> + @if ($model->signup_by_date >= now()) + {{ __('Sign up open until :date', ['date' => $model->signup_by_date->isoFormat('LL')]) }} + @else + {{ __('Sign up closed on :date', ['date' => $model->signup_by_date->isoFormat('LL')]) }} + @endif + </p> + @endif + <p class="flex flex-wrap gap-2"> @if ($model->recruitment === 'open-call') <span class="badge badge--lavender">{{ __('Seeking participants') }}</span> @@ -34,6 +60,6 @@ @if ($model->extra_attributes->get('seeking_community_connector')) <span class="badge badge--yellow">{{ __('Seeking community connector') }}</span> @endif - <span @class(['badge', 'badge--turquoise' => $model->paid])>{{ $model->paid ? __('Paid') : __('Volunteer') }}</span> + <span @class(['badge', 'badge--green' => $model->paid])>{{ $model->paid ? __('Paid') : __('Volunteer') }}</span> </p> </x-card> diff --git a/resources/views/components/date-picker.blade.php b/resources/views/components/date-picker.blade.php index d7fa9627f..e7fa65707 100644 --- a/resources/views/components/date-picker.blade.php +++ b/resources/views/components/date-picker.blade.php @@ -8,7 +8,7 @@ ]) <fieldset class="field @error($name) field--error @enderror" id="{{ $name }}" - aria-describedby="{{ $name }}-hint {{ $name }}-output" x-data="datePicker('{{ $value }}')"> + aria-describedby="{{ $name }}-hint {{ $name }}-output" x-data="datePicker(@js($value))"> <legend> {{ $label ?? __('forms.label_date') }} </legend> diff --git a/resources/views/components/expander.blade.php b/resources/views/components/expander.blade.php index 81e1a1abb..513de4081 100644 --- a/resources/views/components/expander.blade.php +++ b/resources/views/components/expander.blade.php @@ -1,6 +1,6 @@ -@props(['level', 'summary' => '', 'type' => null, 'expanded' => 'false']) +@props(['level', 'summary' => '', 'type' => null, 'expanded' => false]) <div {{ $attributes->class(['expander stack', 'expander--disclosure' => $type === 'disclosure'])->whereDoesntStartWith('x-data') }} - x-data="{ expanded: {{ $expanded }} }"> + x-data="{ expanded: @js($expanded) }"> <x-heading class="title" :level="$level"> <button type="button" x-bind:aria-expanded="expanded.toString()" x-on:click="expanded = !expanded"> <span>{{ $summary }}</span> diff --git a/resources/views/components/interpretation.blade.php b/resources/views/components/interpretation.blade.php index 3fc2d13f2..655afa5ee 100644 --- a/resources/views/components/interpretation.blade.php +++ b/resources/views/components/interpretation.blade.php @@ -7,7 +7,7 @@ {{ __('Sign Language video') }} </button> <div class="stack width:full" x-data="vimeoPlayer({ - url: '{{ $videoSrc }}', + url: @js($videoSrc), byline: false, dnt: true, pip: true, diff --git a/resources/views/components/navigation.blade.php b/resources/views/components/navigation.blade.php index 4c8e0e029..be27d5131 100644 --- a/resources/views/components/navigation.blade.php +++ b/resources/views/components/navigation.blade.php @@ -11,12 +11,10 @@ {{ __('Dashboard') }} </x-nav-link> </li> - @if (Auth::user()->hasVerifiedEmail() && Auth::user()->can('viewOwned', 'App\Models\Project')) + @if (Auth::user()->hasVerifiedEmail() && Auth::user()->can('viewOwned', 'App\Models\Engagement')) <li> - <x-nav-link :href="Auth::user()->isAdministrator() - ? localized_route('projects.all-projects') - : localized_route('projects.my-projects')" :active="request()->localizedRouteIs('projects.my-projects')"> - {{ __('Projects') }} + <x-nav-link :href="localized_route('engagements.index')" :active="request()->localizedRouteIs('engagements.index')"> + {{ __('Engagements') }} </x-nav-link> </li> @endif diff --git a/resources/views/components/translatable-input.blade.php b/resources/views/components/translatable-input.blade.php index bbe10057f..f3f4b10a1 100644 --- a/resources/views/components/translatable-input.blade.php +++ b/resources/views/components/translatable-input.blade.php @@ -26,7 +26,11 @@ @if (is_signed_language($language)) @else <div class="expander field @error($name . '.' . $language) field--error @enderror stack" - x-data="{ expanded: false, value: '{{ old($name . '.' . $language, $model ? $model->getTranslation($name, $language, false) : '') }}', badgeText: '{{ __('Content added') }}' }"> + x-data="{ + expanded: false, + value: @js(old($name . '.' . $language, $model ? $model->getTranslation($name, $language, false) : '')), + badgeText: @js(__('Content added')) + }"> <p class="title" id="{{ Str::slug(__(':label (:locale)', ['label' => $label, 'locale' => get_language_exonym($language)])) }}"> <button type="button" diff --git a/resources/views/components/translatable-textarea.blade.php b/resources/views/components/translatable-textarea.blade.php index 3a3bcf6fc..8a1f38462 100644 --- a/resources/views/components/translatable-textarea.blade.php +++ b/resources/views/components/translatable-textarea.blade.php @@ -26,7 +26,11 @@ @if (is_signed_language($language)) @else <div class="expander field @error($name . '.' . $language) field--error @enderror stack" - x-data="{ expanded: false, value: '{{ old($name . '.' . $language, $model ? $model->getTranslation($name, $language, false) : '') }}', badgeText: '{{ __('Content added') }}' }"> + x-data="{ + expanded: false, + value: @js(old($name . '.' . $language, $model ? $model->getTranslation($name, $language, false) : '')), + badgeText: @js(__('Content added')) + }"> <p class="title" id="{{ Str::slug(__(':label (:locale)', ['label' => $label, 'locale' => get_language_exonym($language)])) }}"> <button type="button" diff --git a/resources/views/components/translation-picker.blade.php b/resources/views/components/translation-picker.blade.php index 81d7fcf8f..32a6cf290 100644 --- a/resources/views/components/translation-picker.blade.php +++ b/resources/views/components/translation-picker.blade.php @@ -1,4 +1,4 @@ -<div class="translation-picker stack" x-data="translationPicker([@foreach ($languages as $language){ code: '{{ $language }}', exonym: '{{ get_language_exonym($language) }}' }@if (!$loop->last), @endif @endforeach], { +<div class="translation-picker stack" x-data="translationPicker([@foreach ($languages as $language){ code: @js($language), exonym: @js(get_language_exonym($language)) }@if (!$loop->last), @endif @endforeach], { @foreach ($availableLanguages as $language)@if ($language['value'] !== '')'{{ $language['value'] }}': '{{ $language['label'] }}'@if (!$loop->last), @endif @endif @endforeach })"> diff --git a/resources/views/courses/show.blade.php b/resources/views/courses/show.blade.php index 4a1719dc1..c6e39bcf1 100644 --- a/resources/views/courses/show.blade.php +++ b/resources/views/courses/show.blade.php @@ -36,7 +36,7 @@ <x-interpretation name="{{ __('About this course', [], 'en') }}" /> @if ($course->video) <div class="stack w-full" x-data="vimeoPlayer({ - url: '{{ $course->video }}', + url: @js($course->video), byline: false, dnt: true, pip: true, @@ -54,30 +54,27 @@ <div class="border-divider mb-12 mt-14 border-x-0 border-b-0 border-t-3 border-solid pt-6"> <h2>{{ __('Modules') }}</h2> <x-interpretation name="{{ __('Modules', [], 'en') }}" /> - <div class="grid"> + <div class="grid md:grid-cols-2"> @foreach ($modules as $module) - <div class="grid"> - {{-- <div class="flex flex-col"> --}} - <div class="card"> - <div class="flex items-start justify-between gap-8"> - <h3> - <a - href="{{ localized_route('modules.module-content', ['course' => $course, 'module' => $module]) }}"> - {{ $module->title }} - </a> - </h3> - @if ($user->modules->find($module->id)?->getRelationValue('pivot')->finished_content_at) - <span class="badge shrink-0">{{ __('completed') }}</span> - @elseif ($user->modules->find($module->id)?->getRelationValue('pivot')->started_content_at) - <span class="badge shrink-0">{{ __('In progress') }}</span> - @endif - </div> - <div class="flex items-center gap-1"> - <x-heroicon-o-play /> - <p>{{ __('Video') }}</p> - </div> - <p>{{ $module->description }}</p> + <div class="card"> + <div class="flex items-start justify-between gap-8"> + <h3> + <a + href="{{ localized_route('modules.module-content', ['course' => $course, 'module' => $module]) }}"> + {{ $module->title }} + </a> + </h3> + @if ($user->modules->find($module->id)?->getRelationValue('pivot')->finished_content_at) + <span class="badge shrink-0">{{ __('completed') }}</span> + @elseif ($user->modules->find($module->id)?->getRelationValue('pivot')->started_content_at) + <span class="badge shrink-0">{{ __('In progress') }}</span> + @endif </div> + <div class="flex items-center gap-1"> + <x-heroicon-o-play /> + <p>{{ __('Video') }}</p> + </div> + <p>{{ $module->description }}</p> </div> @endforeach </div> diff --git a/resources/views/dashboard.blade.php b/resources/views/dashboard.blade.php index ae1ad50c5..0213e901a 100644 --- a/resources/views/dashboard.blade.php +++ b/resources/views/dashboard.blade.php @@ -23,18 +23,32 @@ <h1 class="mt-0" itemprop="name"> {{ __('My dashboard') }} </h1> + @if ($user->individual && !empty($user->individual->roles)) + <a class="with-icon mr-4" href="{{ localized_route('individuals.show-role-edit') }}"> + @svg('heroicon-o-pencil', 'mr-1') + {{ __('Edit roles') }} + </a> + @endif + @if ($user->organization && !empty($user->organization->roles)) + <a class="with-icon mr-4" + href="{{ localized_route('organizations.show-role-edit', $user->organization) }}"> + @svg('heroicon-o-pencil', 'mr-1') + {{ __('Edit roles') }} + </a> + @endif + @if (!empty($user->introduction())) + <a class="with-icon" href="{{ localized_route('users.show-introduction') }}"> + @svg('heroicon-o-play') + {{ __('Watch introduction video again') }} + </a> + @endif + @if ($user->isAdministrator()) <x-interpretation name="{{ __('My dashboard', [], 'en') }}" namespace="dashboard-administrator" /> @endif + @if ($user->individual) <x-interpretation name="{{ __('My dashboard', [], 'en') }}" namespace="dashboard-individual" /> - <p> - <strong>{{ __('Roles:') }}</strong> {{ implode(', ', $user->individual->display_roles) }} - <a class="cta secondary ml-2" href="{{ localized_route('individuals.show-role-edit') }}"> - @svg('heroicon-o-pencil', 'mr-1') - {{ __('Edit roles') }} - </a> - </p> @endif @if ($user->regulatedOrganization) @@ -43,18 +57,28 @@ @if ($user->organization) <x-interpretation name="{{ __('My dashboard', [], 'en') }}" namespace="dashboard-organization" /> - <p> - <strong>{{ __('Roles:') }}</strong> - {{ empty($user->organization->display_roles) ? __('None selected') : implode(', ', $user->organization->display_roles) }} - <a class="cta secondary ml-2" - href="{{ localized_route('organizations.show-role-edit', $user->organization) }}"> - @svg('heroicon-o-pencil', 'mr-1') - {{ __('Edit roles') }} - </a> - </p> @endif </x-slot> + <div class="stack"> + @unless (Auth::user()->checkStatus('dismissedCustomizationPrompt')) + <livewire:prompt :model="Auth::user()" modelPath="dismissed_customize_prompt_at" :heading="__('Customize this website’s accessibility')" :interpretationName="__('Customize this website’s accessibility', [], 'en')" + interpretationNameSpace="getting_started" :description="__('Change colour contrast and turn on text to speech.')" :actionLabel="__('Customize')" :actionUrl="localized_route('settings.edit-website-accessibility-preferences')" /> + @endunless + + @if (Auth::user()->organization && !Auth::user()->organization->checkStatus('dismissedInvitePrompt')) + <livewire:prompt :model="Auth::user()->organization" modelPath="dismissed_invite_prompt_at" :heading="__('Invite others to your organization')" + :interpretationName="__('Invite others to your organization', [], 'en')" interpretationNameSpace="getting_started-invite_to_community_org" :description="__('Please invite others so you can work on projects together.')" + :actionLabel="__('Invite')" :actionUrl="localized_route('settings.invite-to-invitationable')" /> + @endif + + @if (Auth::user()->regulatedOrganization && !Auth::user()->regulatedOrganization->checkStatus('dismissedInvitePrompt')) + <livewire:prompt :model="Auth::user()->regulatedOrganization" modelPath="dismissed_invite_prompt_at" :heading="__('Invite others to your organization')" + :interpretationName="__('Invite others to your organization', [], 'en')" interpretationNameSpace="getting_started-invite_to_regulated_org" :description="__('Please invite others so you can work on projects together.')" + :actionLabel="__('Invite')" :actionUrl="localized_route('settings.invite-to-invitationable')" /> + @endif + </div> + @if ($user->hasTasksToComplete()) @include('dashboard.getting-started') @endif diff --git a/resources/views/dashboard/getting-started.blade.php b/resources/views/dashboard/getting-started.blade.php index 03a5fd5b7..719e95eec 100644 --- a/resources/views/dashboard/getting-started.blade.php +++ b/resources/views/dashboard/getting-started.blade.php @@ -2,36 +2,55 @@ <div class="flex items-center gap-5"> @svg('heroicon-o-clipboard-document-list', 'icon--2xl icon--green') <h2 class="mt-0">{{ __('Getting started') }}</h2> - <x-interpretation class="interpretation--center" name="{{ __('Getting started', [], 'en') }}" - namespace="getting_started" /> </div> - <div class="stack"> - @unless (Auth::user()->checkStatus('dismissedCustomizationPrompt')) - <livewire:prompt :model="Auth::user()" modelPath="dismissed_customize_prompt_at" :heading="__('Customize this website’s accessibility')" :interpretationName="__('Customize this website’s accessibility', [], 'en')" - interpretationNameSpace="getting_started" :description="__('Change colour contrast and turn on text to speech.')" :actionLabel="__('Customize')" :actionUrl="localized_route('settings.edit-website-accessibility-preferences')" /> - @endunless + @if ($user->context === App\Enums\UserContext::Individual->value) + <x-interpretation class="interpretation--center" name="{{ __('Getting started', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('Here are all the steps you have to do before you start signing up for engagements.') }}</p> - @if (Auth::user()->organization && !Auth::user()->organization->checkStatus('dismissedInvitePrompt')) - <livewire:prompt :model="Auth::user()->organization" modelPath="dismissed_invite_prompt_at" :heading="__('Invite others to your organization')" :interpretationName="__('Invite others to your organization', [], 'en')" - interpretationNameSpace="getting_started-invite_to_community_org" :description="__('Please invite others so you can work on projects together.')" :actionLabel="__('Invite')" - :actionUrl="localized_route('settings.invite-to-invitationable')" /> - @endif + <div class="stack"> + <div> + </div> + <div class="flex items-center gap-5 pt-4"> + @svg('heroicon-o-pencil', 'icon--xl') + <h3 class="mt-0">{{ __('Current step') }}</h3> + </div> + <x-interpretation name="{{ __('Current step', [], 'en') }}" namespace="getting_started" /> - @if (Auth::user()->regulatedOrganization && !Auth::user()->regulatedOrganization->checkStatus('dismissedInvitePrompt')) - <livewire:prompt :model="Auth::user()->regulatedOrganization" modelPath="dismissed_invite_prompt_at" :heading="__('Invite others to your organization')" - :interpretationName="__('Invite others to your organization', [], 'en')" interpretationNameSpace="getting_started-invite_to_regulated_org" :description="__('Please invite others so you can work on projects together.')" - :actionLabel="__('Invite')" :actionUrl="localized_route('settings.invite-to-invitationable')" /> - @endif - </div> + <div class="getting-started__current-task stack pb-4"> + @include('dashboard.partials.getting-started-individual') + </div> - <ol class="getting-started__list counter stack" role="list"> - @if ($user->context === App\Enums\UserContext::Individual->value) - @include('dashboard.partials.getting-started-individual') - @elseif ($user->context === App\Enums\UserContext::Organization->value) - @include('dashboard.partials.getting-started-organization') - @elseif ($user->context === App\Enums\UserContext::RegulatedOrganization->value) - @include('dashboard.partials.getting-started-regulated-organization') - @endif - </ol> + <div class="stack pb-4"> + <div class="flex items-center gap-5 pt-4"> + @svg('heroicon-o-arrow-right', 'icon--xl') + <h3 class="mt-0">{{ __('Next steps') }}</h3> + </div> + <x-interpretation name="{{ __('Next steps', [], 'en') }}" namespace="getting_started" /> + <ol class="getting-started__task-list stack" role="list"> + @stack('next-steps') + </ol> + </div> + + @if (Auth::user()->checkStatus('approved')) + <x-expander :summary="__('Completed steps')" level="3"> + <x-interpretation name="{{ __('Completed steps', [], 'en') }}" namespace="getting_started" /> + <ol class="getting-started__task-list stack" role="list"> + @stack('completed-steps') + </ol> + </x-expander> + @endif + </div> + @else + <x-interpretation class="interpretation--center" name="{{ __('Getting started', [], 'en') }}" + namespace="getting_started" /> + <ol class="getting-started__list counter stack" role="list"> + @if ($user->context === App\Enums\UserContext::Organization->value) + @include('dashboard.partials.getting-started-organization') + @elseif ($user->context === App\Enums\UserContext::RegulatedOrganization->value) + @include('dashboard.partials.getting-started-regulated-organization') + @endif + </ol> + @endif </div> diff --git a/resources/views/dashboard/individual.blade.php b/resources/views/dashboard/individual.blade.php index 37a1ea195..e8313845a 100644 --- a/resources/views/dashboard/individual.blade.php +++ b/resources/views/dashboard/individual.blade.php @@ -10,24 +10,19 @@ @endif </li> @endif - @can('viewAny', App\Models\Project::class) - @if ($user->individual->isConnector() || $user->individual->inProgressContractedProjects()->count()) - <li> - <a - href="{{ localized_route('projects.my-contracted-projects') }}">{{ __('Projects involved in as a Community Connector') }}</a> - </li> - @endif - @endcan @if (!$user->oriented_at) <li> <a href="{{ orientation_link($user->context) }}">{{ __('Sign up for an orientation session') }}</a> </li> @endif - @can('viewAny', App\Models\Project::class) - @if ($user->individual->isParticipant() || $user->individual->inProgressParticipatingProjects()->count()) + @can('viewJoined', 'App\Models\Engagement') + @if ( + $user->individual->isParticipant() || + $user->individual->isConnector() || + $user->individual->engagements()->count() || + $user->individual->connectingEngagements()->count()) <li> - <a - href="{{ localized_route('projects.my-participating-projects') }}">{{ __('Projects involved in as a Consultation Participant') }}</a> + <a href="{{ localized_route('engagements.joined') }}">{{ __('Engagements I’ve joined') }}</a> </li> @endif @endcan @@ -35,7 +30,7 @@ <a href="{{ localized_route('dashboard.trainings') }}">{{ __('My trainings') }}</a> </li> </x-quick-links> - <div class="border-divider mt-14 mb-12 border-x-0 border-t-3 border-b-0 border-solid pt-6"> + <div class="border-divider mb-12 mt-14 border-x-0 border-b-0 border-t-3 border-solid pt-6"> @include('dashboard.partials.notifications', [ 'notifications' => $user->allUnreadNotifications(), ]) diff --git a/resources/views/dashboard/organization.blade.php b/resources/views/dashboard/organization.blade.php index bba03134d..d24b9229a 100644 --- a/resources/views/dashboard/organization.blade.php +++ b/resources/views/dashboard/organization.blade.php @@ -25,28 +25,27 @@ <a href="{{ orientation_link($user->context) }}">{{ __('Sign up for an orientation session') }}</a> </li> @endif - @if ($memberable && $user->can('viewAny', App\Models\Project::class)) - @if ($memberable->isConnector() || $memberable->inProgressContractedProjects()->count()) + @if ($memberable && $user->can('viewJoined', 'App\Models\Engagement')) + @if ( + $memberable->isParticipant() || + $memberable->isConnector() || + $memberable->engagements()->count() || + $memberable->connectingEngagements()->count()) <li> - <a - href="{{ localized_route('projects.my-contracted-projects') }}">{{ __('Projects involved in as a Community Connector') }}</a> - </li> - @endif - @if ($memberable->isParticipant() || $memberable->inProgressParticipatingProjects()->count()) - <li> - <a - href="{{ localized_route('projects.my-participating-projects') }}">{{ __('Projects involved in as a Consultation Participant') }}</a> + <a href="{{ localized_route('engagements.joined') }}">{{ __('Engagements I’ve joined') }}</a> </li> @endif + @endif + @if ($memberable && $user->can('viewAny', 'App\Models\Project')) <li> - <a href="{{ localized_route('projects.my-running-projects') }}">{{ __('Projects I’m running') }}</a> + <a href="{{ localized_route('projects.my-projects') }}">{{ __('Projects I’m running') }}</a> </li> @endif <li> <a href="{{ localized_route('dashboard.trainings') }}">{{ __('My trainings') }}</a> </li> </x-quick-links> - <div class="border-divider mt-14 mb-12 border-x-0 border-t-3 border-b-0 border-solid pt-6"> + <div class="border-divider mb-12 mt-14 border-x-0 border-b-0 border-t-3 border-solid pt-6"> @include('dashboard.partials.notifications', [ 'notifications' => $user->allUnreadNotifications(), ]) diff --git a/resources/views/dashboard/partials/getting-started-individual.blade.php b/resources/views/dashboard/partials/getting-started-individual.blade.php index 2f227b983..72a9f327a 100644 --- a/resources/views/dashboard/partials/getting-started-individual.blade.php +++ b/resources/views/dashboard/partials/getting-started-individual.blade.php @@ -1,122 +1,175 @@ -@if (Auth::user()->individual->isConnector() || Auth::user()->individual->isConsultant()) - <li class="getting-started__list-item stack"> - <h3> - <a class="counter__item" - href="{{ localized_route('individuals.edit', Auth::user()->individual) }}">{{ __('Create a public page') }}</a> - </h3> - <x-interpretation name="{{ __('Create a public page', [], 'en') }}" namespace="getting_started-individual" /> - <p> - {{ __('Please create your page to share more about who you are, your experiences, and your interests.') }} - </p> - @if (Auth::user()->individual->isPublishable()) - <span class="badge">{{ __('Completed') }}</span> - @elseif (Auth::user()->individual->isInProgress()) - <span class="badge">{{ __('In progress') }}</span> - @else - <span class="badge">{{ __('Not started yet') }}</span> - @endif - </li> -@endif -<li class="getting-started__list-item stack"> - <h3> - <a class="counter__item" - href="{{ localized_route('dashboard.collaboration-preferences') }}">{{ __('Enter your collaboration preferences') }}</a> - </h3> - <x-interpretation name="{{ __('Enter your collaboration preferences', [], 'en') }}" - namespace="getting_started-individual" /> - <p> - {{ __('This will help people know what to expect when working with you.') }} - </p> - @if (Auth::user()->individual->paymentTypes->count() || !blank(Auth::user()->individual->other_payment_type)) - <span class="badge">{{ __('Completed') }}</span> - @else - <span class="badge">{{ __('Incomplete') }}</span> - @endif -</li> -<li class="getting-started__list-item stack"> - <h3> - <a class="counter__item" href="{{ orientation_link(Auth::user()->context) }}" rel="noopener" target="_blank"> - {{ __('Sign up and attend an orientation session') }} - @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') - </a> - </h3> +{{-- MARK: Sign up --}} +@if (Auth::user()->checkStatus('pending')) + <a class="current-task__action with-icon" href="{{ orientation_link(Auth::user()->context) }}" rel="noopener" + target="_blank"> + {{ __('Sign up and attend an orientation session') }} + @svg('heroicon-o-arrow-top-right-on-square', 'ml-1 icon--lg') + </a> <x-interpretation name="{{ __('Sign up and attend an orientation session', [], 'en') }}" - namespace="getting_started-individual" /> - <p> - {{ __('Click the link above to sign up for an orientation session. (This will lead you to an external site, and when you’re done it will bring you back automatically.)') }} + namespace="getting_started-individual-link" /> + <p>{{ __('Before you do anything else, you must attend an orientation session to learn about this website and your options.') }} </p> - @if (Auth::user()->checkStatus('approved')) - <span class="badge">{{ __('Attended') }}</span> - @elseif (Auth::user()->checkStatus('pending')) - <span class="badge">{{ __('Not attended yet') }}</span> - <x-expander type="disclosure" :level="4"> - <x-slot name="summary">{{ __('I’ve gone to orientation, why isn’t this updated?') }}</x-slot> - <x-interpretation name="{{ __('I’ve gone to orientation, why isn’t this updated?', [], 'en') }}" + {{ safe_markdown('Please check your email for a confirmation of your session date. Please email <:email> if you did not get the email, or if you need to reschedule or cancel. If you’ve gone to your orientation session, it may take 2-3 business days to be updated here on the website.', ['email' => settings('email')]) }} +@else + @push('completed-steps') + <li> + <p class="h4">{{ __('Sign up and attend an orientation session') }}</p> + <x-interpretation name="{{ __('Sign up and attend an orientation session', [], 'en') }}" namespace="getting_started-individual" /> - {{ safe_markdown( - 'We may have not updated this status in our system yet. Please wait a few days before seeing this status update. If you have further questions, please [contact us](:url).', - ['url' => '#footer-contact'], - ) }} - </x-expander> + <p>{{ __('Before you do anything else, you must attend an orientation session to learn about this website and your options.') }} + </p> + </li> + @endPush +@endif + +{{-- MARK: Pick role --}} +@if (empty(Auth::user()->individual->roles)) + @if (Auth::user()->checkStatus('approved')) + <a class="current-task__action with-icon" href="{{ localized_route('individuals.show-role-selection') }}"> + {{ __('Pick your role') }} + @svg('heroicon-o-chevron-right', 'ml-1 icon--lg') + </a> + <x-interpretation name="{{ __('Pick your role', [], 'en') }}" namespace="getting_started-individual-link" /> + <p>{{ __('Please pick whether you’d like to be a Participant, a Consultant, or a Connector.') }}</p> + @push('next-steps') + <li> + <p>{{ __('This will show up once you pick your role.') }}</p> + <x-interpretation name="{{ __('This will show up once you pick your role.', [], 'en') }}" + namespace="getting_started-individual" /> + </li> + @endpush + @else + @push('next-steps') + <li> + <p class="h4">{{ __('Pick your role') }}</p> + <x-interpretation name="{{ __('Pick your role', [], 'en') }}" namespace="getting_started-individual" /> + <p>{{ __('Please pick whether you’d like to be a Participant, a Consultant, or a Connector.') }}</p> + </li> + @endpush @endif -</li> -@if (Auth::user()->individual->isConnector() || Auth::user()->individual->isConsultant()) - <li class="getting-started__list-item stack"> - <h3 class="counter__item">{{ __('Fill out and return your application') }}</h3> - <x-interpretation name="{{ __('Fill out and return your application', [], 'en') }}" - namespace="getting_started-individual" /> - <p> - @php - $roles = []; - if (Auth::user()->individual->isConsultant()) { - $roles[] = __('Accessibility Consultant'); - } - if (Auth::user()->individual->isConnector()) { - $roles[] = __('Community Connector'); - } - @endphp +@else + @push('completed-steps') + <li> + <p class="h4">{{ __('Pick your role') }}</p> + <x-interpretation name="{{ __('Pick your role', [], 'en') }}" namespace="getting_started-individual" /> + <p>{{ __('Please pick whether you’d like to be a Participant, a Consultant, or a Connector.') }}</p> + </li> + @endPush +@endif - @if (count($roles) == 1) - {{ __('Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.', ['role' => $roles[0]]) }} - @elseif(count($roles) == 2) - {{ __('Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.', ['role' => $roles[0], 'otherRole' => $roles[1]]) }} - @endif - </p> - <ul role="list"> - @if (Auth::user()->individual->isConsultant()) - <li> - <a href="{{ settings_localized('ac_application', locale()) }}" rel="noopener" target="_blank"> - {{ __('Application for Accessibility Consultant') }} - @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') - </a> - </li> - @endif - @if (Auth::user()->individual->isConnector()) +{{-- MARK: Collaboration Prefs --}} +@if (Auth::user()->individual->isParticipant()) + @if (Auth::user()->individual->paymentTypes->count() || !blank(Auth::user()->individual->other_payment_type)) + @push('completed-steps') + <li> + <p class="h4">{{ __('Fill in your collaboration preferences') }}</p> + <x-interpretation name="{{ __('Fill in your collaboration preferences', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('This will help people know what to expect when working with you.') }}</p> + </li> + @endpush + @elseif (empty(Auth::user()->individual->roles)) + @push('next-steps') + <li> + <p class="h4">{{ __('Fill in your collaboration preferences') }}</p> + <x-interpretation name="{{ __('Fill in your collaboration preferences', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('This will help people know what to expect when working with you.') }}</p> + </li> + @endpush + @else + <a class="current-task__action with-icon" href="{{ localized_route('dashboard.collaboration-preferences') }}"> + {{ __('Fill in your collaboration preferences') }} + @svg('heroicon-o-chevron-right', 'ml-1 icon--lg') + </a> + <x-interpretation name="{{ __('Fill in your collaboration preferences', [], 'en') }}" + namespace="getting_started-individual-link" /> + <p>{{ __('This will help people know what to expect when working with you.') }}</p> + + @if (!Auth::user()->individual->isConnector() && !Auth::user()->individual->isConsultant()) + @push('next-steps') <li> - <a href="{{ settings_localized('cc_application', locale()) }}" rel="noopener" target="_blank"> - {{ __('Application for Community Connector') }} - @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') - </a> + <p>{{ __('There are no next steps. After this you’ll be able to sign up for engagements!') }}</p> + <x-interpretation + name="{{ __('There are no next steps. After this you’ll be able to sign up for engagements!', [], 'en') }}" + namespace="getting_started-individual" /> </li> - @endif - </ul> - </li> - <li class="getting-started__list-item stack"> - <h3> - <a class="counter__item" - href="{{ localized_route('individuals.edit', Auth::user()->individual) }}">{{ __('Review and publish your public page') }}</a> - </h3> - <x-interpretation name="{{ __('Review and publish your public page', [], 'en') }}" - namespace="getting_started-individual" /> - <p> - {{ __('Once your account has been approved, you can review and publish your page. You must have completed all the previous steps.') }} - </p> - @if (Auth::user()->checkStatus('pending')) - <span class="badge">{{ __('Not yet approved') }}</span> - @elseif (Auth::user()->individual->checkStatus('published')) - <span class="badge">{{ __('Published') }}</span> - @else - <span class="badge">{{ __('Ready to publish') }}</span> + @endpush @endif - </li> + @endif +@endif + +{{-- MARK: Application --}} +{{-- + TODO: Split Application and Public page into separate steps. + Until we have approvals for applications we won't know when the application has been completed. To workaround this + the Application step has been combined with the Public Page step. +--}} +@if (Auth::user()->individual->isConnector() || Auth::user()->individual->isConsultant()) + @if (Auth::user()->individual->checkStatus('published')) + @push('completed-steps') + <li> + <p class="h4">{{ __('Fill out and return your application') }}</p> + <x-interpretation name="{{ __('Fill out and return your application', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('You must return this and have it approved.') }}</p> + </li> + <li> + <p class="h4">{{ __('Create a public page') }}</p> + <x-interpretation name="{{ __('Create a public page', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('Please create your page to share more about who you are, your experiences, and your interests.') }} + </p> + </li> + @endpush + @elseif ( + (Auth::user()->individual->isParticipant() && + (Auth::user()->individual->paymentTypes->count() || !blank(Auth::user()->individual->other_payment_type))) || + (!Auth::user()->individual->isParticipant() && !empty(Auth::user()->individual->roles))) + <div> + <a class="current-task__action with-icon" href="{{ settings_localized('ac_cc_application', locale()) }}" + rel="noopener" target="_blank"> + {{ __('Fill out and return your application') }} + @svg('heroicon-o-arrow-top-right-on-square', 'ml-1 icon--lg') + </a> + <x-interpretation name="{{ __('Fill out and return your application', [], 'en') }}" + namespace="getting_started-individual-link" /> + <p>{{ __('You must return this and have it approved.') }}</p> + </div> + <div> + <a class="current-task__action with-icon" + href="{{ localized_route('individuals.edit', Auth::user()->individual) }}"> + {{ __('Create a public page') }} + @svg('heroicon-o-chevron-right', 'ml-1 icon--lg') + </a> + <x-interpretation name="{{ __('Create a public page', [], 'en') }}" + namespace="getting_started-individual-link" /> + <p>{{ __('Please create your page to share more about who you are, your experiences, and your interests.') }} + </p> + </div> + @push('next-steps') + <li> + <p>{{ __('There are no next steps. After this you’ll be able to sign up for engagements!') }}</p> + <x-interpretation + name="{{ __('There are no next steps. After this you’ll be able to sign up for engagements!', [], 'en') }}" + namespace="getting_started-individual" /> + </li> + @endpush + @else + @push('next-steps') + <li> + <p class="h4">{{ __('Fill out and return your application') }}</p> + <x-interpretation name="{{ __('Fill out and return your application', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('You must return this and have it approved.') }}</p> + </li> + <li> + <p class="h4">{{ __('Create a public page') }}</p> + <x-interpretation name="{{ __('Create a public page', [], 'en') }}" + namespace="getting_started-individual" /> + <p>{{ __('Please create your page to share more about who you are, your experiences, and your interests.') }} + </p> + </li> + @endpush + @endif @endif diff --git a/resources/views/dashboard/partials/getting-started-organization.blade.php b/resources/views/dashboard/partials/getting-started-organization.blade.php index 4c8394f12..777fe149a 100644 --- a/resources/views/dashboard/partials/getting-started-organization.blade.php +++ b/resources/views/dashboard/partials/getting-started-organization.blade.php @@ -55,40 +55,12 @@ <x-interpretation name="{{ __('Fill out and return your application', [], 'en') }}" namespace="getting_started-community_org" /> <p> - @php - $roles = []; - if (Auth::user()->organization->isConsultant()) { - $roles[] = __('Accessibility Consultant'); - } - if (Auth::user()->organization->isConnector()) { - $roles[] = __('Community Connector'); - } - @endphp - - @if (count($roles) == 1) - {{ __('Please fill out and return your application for your :role role. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.', ['role' => $roles[0]]) }} - @elseif(count($roles) == 2) - {{ __('Please fill out and return your application for your :role and :otherRole roles. You must return this and have it approved before you can attend orientation. You can find the applications in the links below, or in the email we sent you.', ['role' => $roles[0], 'otherRole' => $roles[1]]) }} - @endif + {{ __('Please fill out and return your application. You must return this and have it approved before you can attend orientation. You can find the application in the link below, or in the email we sent you.') }} </p> - <ul role="list"> - @if (Auth::user()->organization->isConsultant()) - <li> - <a href="{{ settings_localized('ac_application', locale()) }}" rel="noopener" target="_blank"> - {{ __('Application for Accessibility Consultant') }} - @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') - </a> - </li> - @endif - @if (Auth::user()->organization->isConnector()) - <li> - <a href="{{ settings_localized('cc_application', locale()) }}" rel="noopener" target="_blank"> - {{ __('Application for Community Connector') }} - @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') - </a> - </li> - @endif - </ul> + <a href="{{ settings_localized('ac_cc_application', locale()) }}" rel="noopener" target="_blank"> + {{ __('Application for Accessibility Consultant and Community Connector') }} + @svg('heroicon-o-arrow-top-right-on-square', 'ml-1') + </a> </li> @endif <li class="getting-started__list-item stack"> diff --git a/resources/views/dashboard/regulated-organization.blade.php b/resources/views/dashboard/regulated-organization.blade.php index b6f89d978..8663741d7 100644 --- a/resources/views/dashboard/regulated-organization.blade.php +++ b/resources/views/dashboard/regulated-organization.blade.php @@ -29,14 +29,14 @@ @endif @can('viewAny', App\Models\Project::class) <li> - <a href="{{ localized_route('projects.my-running-projects') }}">{{ __('Projects I’m running') }}</a> + <a href="{{ localized_route('projects.my-projects') }}">{{ __('Projects I’m running') }}</a> </li> @endcan <li> <a href="{{ localized_route('dashboard.trainings') }}">{{ __('My trainings') }}</a> </li> </x-quick-links> - <div class="border-divider mt-14 mb-12 border-x-0 border-t-3 border-b-0 border-solid pt-6"> + <div class="border-divider mb-12 mt-14 border-x-0 border-b-0 border-t-3 border-solid pt-6"> @include('dashboard.partials.notifications', [ 'notifications' => $user->allUnreadNotifications(), ]) diff --git a/resources/views/engagements/joined.blade.php b/resources/views/engagements/joined.blade.php new file mode 100644 index 000000000..f97a19ab3 --- /dev/null +++ b/resources/views/engagements/joined.blade.php @@ -0,0 +1,42 @@ +<x-app-layout header-class="header--tabbed" page-width="wide"> + <x-slot name="title">{{ $title ?? __('Engagements I’ve joined') }}</x-slot> + <x-slot name="header"> + <div class="center center:wide stack"> + <div class="flex flex-wrap items-center justify-between gap-4"> + <h1 id="projects" itemprop="name"> + {{ __('Engagements I’ve joined') }} + </h1> + @if (Auth::user()->can('viewAny', 'App\Models\Engagement')) + <a class="cta secondary" + href="{{ localized_route('engagements.index') }}">{{ __('Browse all engagements') }}</a> + @endif + </div> + <x-interpretation name="{{ __('Engagements I’ve joined', [], 'en') }}" namespace="engagements-joined" /> + </div> + </x-slot> + + <nav class="nav--tabbed" aria-labelledby="projects"> + <div class="center center:wide"> + <ul class="-mt-4 flex gap-6" role="list"> + @if ($showParticipating) + <li class="w-full"> + <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" :href="localized_route('engagements.joined-participating')" + :active="$section === App\Enums\ProjectInvolvement::Participating->value"> + {{ __('Joined as a Consultation Participant') }} + </x-nav-link> + </li> + @endif + @if ($showConnecting) + <li class="w-full"> + <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" :href="localized_route('engagements.joined-contracted')" + :active="$section === App\Enums\ProjectInvolvement::Contracted->value"> + {{ __('Joined as a Community Connector') }} + </x-nav-link> + </li> + @endif + </ul> + </div> + </nav> + + @includeIf("engagements.joined.{$section}") +</x-app-layout> diff --git a/resources/views/engagements/joined/contracted.blade.php b/resources/views/engagements/joined/contracted.blade.php new file mode 100644 index 000000000..af279deeb --- /dev/null +++ b/resources/views/engagements/joined/contracted.blade.php @@ -0,0 +1,23 @@ +<h2>{{ __('Joined as a Community Connector') }}</h2> +<x-interpretation name="{{ __('Joined as a Community Connector', [], 'en') }}" namespace="engagements-joined" /> + +@if ($activeEngagements->count()) + <div class="grid"> + @foreach ($activeEngagements as $activeEngagement) + <x-card.engagement :model="$activeEngagement" :byline=true /> + @endforeach + </div> +@else + <p>{{ __('No projects found.') }}</p> +@endif + +@if ($completeEngagements->count()) + <x-expander level="3" :summary="__('Completed engagements')"> + <x-interpretation name="{{ __('Completed engagements', [], 'en') }}" namespace="engagements-joined" /> + <div class="grid"> + @foreach ($completeEngagements as $completeEngagement) + <x-card.engagement :model="$completeEngagement" :byline=true /> + @endforeach + </div> + </x-expander> +@endif diff --git a/resources/views/engagements/joined/participating.blade.php b/resources/views/engagements/joined/participating.blade.php new file mode 100644 index 000000000..13fd85337 --- /dev/null +++ b/resources/views/engagements/joined/participating.blade.php @@ -0,0 +1,23 @@ +<h2>{{ __('Joined as a Consultation Participant') }}</h2> +<x-interpretation name="{{ __('Joined as a Consultation Participant', [], 'en') }}" namespace="engagements-joined" /> + +@if ($activeEngagements->count()) + <div class="grid"> + @foreach ($activeEngagements as $activeEngagement) + <x-card.engagement :model="$activeEngagement" :byline=true /> + @endforeach + </div> +@else + <p>{{ __('No projects found.') }}</p> +@endif + +@if ($completeEngagements->count()) + <x-expander level="3" :summary="__('Completed engagements')"> + <x-interpretation name="{{ __('Completed engagements', [], 'en') }}" namespace="engagements-joined" /> + <div class="grid"> + @foreach ($completeEngagements as $completeEngagement) + <x-card.engagement :model="$completeEngagement" :byline=true /> + @endforeach + </div> + </x-expander> +@endif diff --git a/resources/views/engagements/show-criteria-selection.blade.php b/resources/views/engagements/show-criteria-selection.blade.php index 012c317a5..7ebe18719 100644 --- a/resources/views/engagements/show-criteria-selection.blade.php +++ b/resources/views/engagements/show-criteria-selection.blade.php @@ -47,7 +47,7 @@ </div> <div class="box box--alt space-y-6 px-6 py-8" x-cloak x-show="editing"> - <div class="stack" x-data="{ locationType: '{{ old('location_type', $engagement->matchingStrategy->location_type ?? App\Enums\LocationType::Regions->value) }}' }"> + <div class="stack" x-data="{ locationType: @js(old('location_type', $engagement->matchingStrategy->location_type ?? App\Enums\LocationType::Regions->value)) }"> <fieldset class="field @error('location_type') field--error @enderror"> <legend> {{ __('Are you looking for individuals in specific provinces or territories or specific cities or towns?') }} @@ -96,7 +96,7 @@ class="sr-only">{{ __('Disability or Deaf group') }}</span> </div> <div class="box box--alt space-y-6 px-6 py-8" x-cloak x-show="editing"> - <div class="stack" x-data="{ crossDisability: {{ old('cross_disability_and_deaf', $engagement->matchingStrategy->cross_disability_and_deaf ?? 1) }} }"> + <div class="stack" x-data="{ crossDisability: @js(old('cross_disability_and_deaf', $engagement->matchingStrategy->cross_disability_and_deaf ?? 1)) }"> <fieldset class="field @error('cross_disability_and_deaf') field--error @enderror"> <legend> {{ __('Is there a specific disability or Deaf group you are interested in engaging?') }} @@ -145,8 +145,8 @@ class="sr-only">{{ __('Disability or Deaf group') }}</span> <div class="box box--alt space-y-6 px-6 py-8" x-cloak x-show="editing"> <div class="stack" x-data="{ - intersectional: {{ old('intersectional', $engagement->matchingStrategy->extra_attributes->get('intersectional', 1)) }}, - otherIdentityType: '{{ old('other_identity_type', $engagement->matchingStrategy->extra_attributes->get('other_identity_type', '')) }}' + intersectional: @js(old('intersectional', $engagement->matchingStrategy->extra_attributes->get('intersectional', 1))), + otherIdentityType: @js(old('other_identity_type', $engagement->matchingStrategy->extra_attributes->get('other_identity_type', ''))) }"> <fieldset class="field @error('intersectional') field--error @enderror"> <legend> diff --git a/resources/views/engagements/show.blade.php b/resources/views/engagements/show.blade.php index 4ce16c145..a4f93139e 100644 --- a/resources/views/engagements/show.blade.php +++ b/resources/views/engagements/show.blade.php @@ -14,11 +14,15 @@ @endpush @endif <ol class="breadcrumbs" role="list"> - <li><a href="{{ localized_route('projects.my-projects') }}">{{ __('My projects') }}</a></li> - <li> - <a - href="@can('update', $project){{ localized_route('projects.manage', $project) }}@else{{ localized_route('projects.show', $project) }}@endcan">{{ $project->name }}</a> - </li> + @if (auth()->user()->isMemberOf($engagement->project->projectable)) + <li><a href="{{ localized_route('projects.my-projects') }}">{{ __('My projects') }}</a></li> + <li> + <a + href="@can('update', $project){{ localized_route('projects.manage', $project) }}@else{{ localized_route('projects.show', $project) }}@endcan">{{ $project->name }}</a> + </li> + @else + <li><a href="{{ localized_route('engagements.index') }}">{{ __('Engagements') }}</a></li> + @endif </ol> <h1 id="engagement"> {{ $engagement->getTranslation('name', $language) }} diff --git a/resources/views/engagements/sign-up.blade.php b/resources/views/engagements/sign-up.blade.php index c14c3508f..9d09eb7bb 100644 --- a/resources/views/engagements/sign-up.blade.php +++ b/resources/views/engagements/sign-up.blade.php @@ -2,8 +2,7 @@ <x-slot name="title">{{ __('Sign up for this engagement') }}</x-slot> <x-slot name="header"> <ol class="breadcrumbs" role="list"> - <li><a href="{{ localized_route('projects.my-projects') }}">{{ __('My projects') }}</a></li> - <li><a href="{{ localized_route('projects.show', $project) }}">{{ $project->name }}</a></li> + <li><a href="{{ localized_route('engagements.index') }}">{{ __('Engagements') }}</a></li> <li><a href="{{ localized_route('engagements.show', $engagement) }}">{{ $engagement->name }}</a></li> </ol> <h1 class="w-full md:w-2/3"> diff --git a/resources/views/individuals/edit/communication-and-consultation-preferences.blade.php b/resources/views/individuals/edit/communication-and-consultation-preferences.blade.php index 8a2fe245a..a53f853a2 100644 --- a/resources/views/individuals/edit/communication-and-consultation-preferences.blade.php +++ b/resources/views/individuals/edit/communication-and-consultation-preferences.blade.php @@ -14,7 +14,7 @@ <hr class="divider--thick"> - <div class="stack" x-data="{ contactPerson: '{{ old('preferred_contact_person', $individual->user->preferred_contact_person ?? 'me') }}' }"> + <div class="stack" x-data="{ contactPerson: @js(old('preferred_contact_person', $individual->user->preferred_contact_person ?? 'me')) }"> <fieldset> <legend>{{ __('Contact person') . ' ' . __('(required)') }}</legend> <x-interpretation class="mt-0" name="{{ __('Contact person', [], 'en') }}" diff --git a/resources/views/livewire/admin-estimates-and-agreements.blade.php b/resources/views/livewire/admin-estimates-and-agreements.blade.php index ff68a84da..fa366b9c9 100644 --- a/resources/views/livewire/admin-estimates-and-agreements.blade.php +++ b/resources/views/livewire/admin-estimates-and-agreements.blade.php @@ -83,12 +83,12 @@ <td> @if ($project->estimate_returned_at && !$project->agreement_received_at) <button class="secondary" - wire:click="markAgreementReceived({{ $project->id }})">{{ __('Mark agreement as received') }} + wire:click="markAgreementReceived({{ $project->id }})">{{ __('Agreement signed and received') }} <span class="sr-only">{{ __('for :project', ['project' => $project->name]) }}</span> </button> @elseif(!$project->estimate_returned_at) <button class="secondary" - wire:click="markEstimateReturned({{ $project->id }})">{{ __('Mark estimate as returned') }} + wire:click="markEstimateReturned({{ $project->id }})">{{ __('Estimate and agreement have been sent') }} <span class="sr-only">{{ __('for :project', ['project' => $project->name]) }}</span> </button> @endif diff --git a/resources/views/livewire/all-projects.blade.php b/resources/views/livewire/browse-engagements.blade.php similarity index 76% rename from resources/views/livewire/all-projects.blade.php rename to resources/views/livewire/browse-engagements.blade.php index 8cc3f58a0..5a7a4da87 100644 --- a/resources/views/livewire/all-projects.blade.php +++ b/resources/views/livewire/browse-engagements.blade.php @@ -1,12 +1,20 @@ <x-slot name="title"> - {{ __('Projects') }} + {{ __('Engagements') }} </x-slot> <x-slot name="header"> - <h1 id="browse-all-projects"> - {{ __('Browse all projects') }} - </h1> - <x-interpretation name="{{ __('Browse all projects', [], 'en') }}" namespace="all_projects" /> + <div class="center center:wide stack pb-12 pt-4"> + <div class="flex flex-wrap items-center justify-between gap-4"> + <h1 id="browse-all-engagements"> + {{ __('Browse all engagements') }} + </h1> + @unless (Auth::user()->isAdministrator()) + <a class="cta secondary" + href="{{ localized_route('engagements.joined') }}">{{ __('Engagements I’ve joined') }}</a> + @endunless + </div> + </div> + <x-interpretation name="{{ __('Browse all engagements', [], 'en') }}" namespace="browse-engagements" /> </x-slot> <div> @@ -22,10 +30,10 @@ @if ($searchQuery) <p class="h4"> {{ trans_choice( - __('{1} :count result for “:searchQuery”.', ['count' => $projects->total(), 'searchQuery' => $searchQuery]) . + __('{1} :count result for “:searchQuery”.', ['count' => $engagements->total(), 'searchQuery' => $searchQuery]) . '|' . - __(':count results for “:searchQuery”.', ['count' => $projects->total(), 'searchQuery' => $searchQuery]), - $projects->total(), + __(':count results for “:searchQuery”.', ['count' => $engagements->total(), 'searchQuery' => $searchQuery]), + $engagements->total(), ) }} </p> @elseif ( @@ -41,10 +49,10 @@ $recruitmentMethods) <p class="h4"> {{ trans_choice( - __('{1} :count project matches your applied filters.', ['count' => $projects->total()]) . + __('{1} :count engagement matches your applied filters.', ['count' => $engagements->total()]) . '|' . - __(':count projects match your applied filters.', ['count' => $projects->total()]), - $projects->total(), + __(':count engagements match your applied filters.', ['count' => $engagements->total()]), + $engagements->total(), ) }} </p> @endif @@ -53,15 +61,15 @@ <div class="stack with-sidebar with-sidebar:2/3"> <div class="filters"> <h2 class="mb-6 mt-0">{{ __('Filters') }}</h2> - <x-interpretation name="{{ __('Filters', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Filters', [], 'en') }}" namespace="browse-engagements" /> <div class="mb-6"> <button class="secondary" type="button" wire:click="selectNone()">{{ __('Clear filters') }}</button> </div> <x-expander :level="3"> - <x-slot name="summary">{{ __('Status') }}</x-slot> - <x-interpretation name="{{ __('Status', [], 'en') }}" namespace="all_projects" /> + <x-slot name="summary">{{ __('Sign up') }}</x-slot> + <x-interpretation name="{{ __('Sign up', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('status') field--error @enderror"> - <legend class="visually-hidden">{{ __('Status') }}</legend> + <legend class="visually-hidden">{{ __('Sign up') }}</legend> @foreach ($statusesData as $status) <div class="field"> <x-hearth-input id="status-{{ $status['value'] }}" name="statuses[]" type="checkbox" @@ -72,9 +80,24 @@ <x-hearth-error for="status" /> </fieldset> </x-expander> + <x-expander :level="3"> + <x-slot name="summary">{{ __('Format') }}</x-slot> + <x-interpretation name="{{ __('Format', [], 'en') }}" namespace="browse-engagements" /> + <fieldset class="filter__options field @error('format') field--error @enderror"> + <legend class="visually-hidden">{{ __('Format') }}</legend> + @foreach ($formatsData as $format) + <div class="field"> + <x-hearth-input id="format-{{ $format['value'] }}" name="formats[]" type="checkbox" + value="{{ $format['value'] }}" wire:model.live="formats" /> + <label for="format-{{ $format['value'] }}">{{ $format['label'] }}</label> + </div> + @endforeach + <x-hearth-error for="format" /> + </fieldset> + </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Who they’re seeking') }}</x-slot> - <x-interpretation name="{{ __('Who they’re seeking', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Who they’re seeking', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('seeking') field--error @enderror"> <legend class="visually-hidden">{{ __('Who they’re seeking') }}</legend> @foreach ($seekingsData as $seeking) @@ -89,7 +112,7 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Initiated by') }}</x-slot> - <x-interpretation name="{{ __('Initiated by', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Initiated by', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('initiator') field--error @enderror"> <legend class="visually-hidden">{{ __('Initiated by') }}</legend> @foreach ($initiatorsData as $initiator) @@ -105,7 +128,7 @@ <x-expander :level="3"> <x-slot name="summary">{{ __('Disability and Deaf groups they are looking for') }}</x-slot> <x-interpretation name="{{ __('Disability and Deaf groups they are looking for', [], 'en') }}" - namespace="all_projects" /> + namespace="browse-engagements" /> <fieldset class="filter__options field @error('seekingGroup') field--error @enderror"> <legend class="visually-hidden">{{ __('Disability and Deaf groups they are looking for') }} </legend> @@ -122,13 +145,14 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Virtual or in-person') }}</x-slot> - <x-interpretation name="{{ __('Virtual or in-person', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Virtual or in-person', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('meetingType') field--error @enderror"> <legend class="visually-hidden">{{ __('Virtual or in-person') }}</legend> @foreach ($meetingTypesData as $meetingType) <div class="field"> <x-hearth-input id="meetingType-{{ $meetingType['value'] }}" name="meetingTypes[]" - type="checkbox" value="{{ $meetingType['value'] }}" wire:model.live="meetingTypes" /> + type="checkbox" value="{{ $meetingType['value'] }}" + wire:model.live="meetingTypes" /> <label for="meetingType-{{ $meetingType['value'] }}">{{ $meetingType['label'] }}</label> </div> @endforeach @@ -137,13 +161,13 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Participant location') }}</x-slot> - <x-interpretation name="{{ __('Participant location', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Participant location', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('location') field--error @enderror"> <legend class="visually-hidden">{{ __('Participant location') }}</legend> @foreach ($locationsData as $location) <div class="field"> - <x-hearth-input id="location-{{ $location['value'] }}" name="locations[]" type="checkbox" - value="{{ $location['value'] }}" wire:model.live="locations" /> + <x-hearth-input id="location-{{ $location['value'] }}" name="locations[]" + type="checkbox" value="{{ $location['value'] }}" wire:model.live="locations" /> <label for="location-{{ $location['value'] }}">{{ $location['label'] }}</label> </div> @endforeach @@ -152,13 +176,14 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Compensation') }}</x-slot> - <x-interpretation name="{{ __('Compensation', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Compensation', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('compensation') field--error @enderror"> <legend class="visually-hidden">{{ __('Compensation') }}</legend> @foreach ($compensationsData as $compensation) <div class="field"> <x-hearth-input id="compensation-{{ $compensation['value'] }}" name="compensations[]" - type="checkbox" value="{{ $compensation['value'] }}" wire:model.live="compensations" /> + type="checkbox" value="{{ $compensation['value'] }}" + wire:model.live="compensations" /> <label for="compensation-{{ $compensation['value'] }}">{{ $compensation['label'] }}</label> </div> @@ -168,7 +193,7 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Sectors') }}</x-slot> - <x-interpretation name="{{ __('Sectors', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Sectors', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('sector') field--error @enderror"> <legend class="visually-hidden">{{ __('Sectors') }}</legend> @foreach ($sectorsData as $sector) @@ -183,7 +208,7 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Areas of impact') }}</x-slot> - <x-interpretation name="{{ __('Areas of impact', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Areas of impact', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('impact') field--error @enderror"> <legend class="visually-hidden">{{ __('Areas of impact') }}</legend> @foreach ($impactedAreasData as $impact) @@ -198,7 +223,7 @@ </x-expander> <x-expander :level="3"> <x-slot name="summary">{{ __('Recruitment method') }}</x-slot> - <x-interpretation name="{{ __('Recruitment method', [], 'en') }}" namespace="all_projects" /> + <x-interpretation name="{{ __('Recruitment method', [], 'en') }}" namespace="browse-engagements" /> <fieldset class="filter__options field @error('recruitment') field--error @enderror"> <legend class="visually-hidden">{{ __('Recruitment method') }}</legend> @foreach ($recruitmentMethodsData as $recruitmentMethod) @@ -215,17 +240,17 @@ </x-expander> </div> <div class="md:pl-4"> - <section aria-labelledby="browse-all-projects"> + <section aria-labelledby="browse-all-engagements"> <div class="projects stack"> - @forelse($projects as $project) - <x-card.project :model="$project" :level="2" /> + @forelse($engagements as $engagement) + <x-card.engagement :model="$engagement" :byline=true /> @empty - <p>{{ __('No projects found.') }}</p> + <p>{{ __('No engagements found.') }}</p> @endforelse </div> </section> - {{ $projects->onEachSide(2)->links('vendor.livewire.tailwind-custom') }} + {{ $engagements->onEachSide(2)->links('vendor.livewire.tailwind-custom') }} </div> </div> </div> diff --git a/resources/views/livewire/manage-engagement-connector.blade.php b/resources/views/livewire/manage-engagement-connector.blade.php index 5024e4bbe..e0aadb849 100644 --- a/resources/views/livewire/manage-engagement-connector.blade.php +++ b/resources/views/livewire/manage-engagement-connector.blade.php @@ -45,8 +45,8 @@ namespace="manage_engagement_connector" /> {{ safe_markdown( - 'This will show Community Connectors on the [browse projects](:url) page that you are looking, and that they are welcome to reach out.', - ['url' => localized_route('projects.all-projects')], + 'This will show Community Connectors on the [browse engagements](:url) page that you are looking, and that they are welcome to reach out.', + ['url' => localized_route('engagements.index')], ) }} <div class="field"> diff --git a/resources/views/livewire/module-content.blade.php b/resources/views/livewire/module-content.blade.php index fb0b1f595..ce50b9394 100644 --- a/resources/views/livewire/module-content.blade.php +++ b/resources/views/livewire/module-content.blade.php @@ -15,7 +15,7 @@ <div> <div class="stack ml-2 mr-2"> <div class="stack w-full" wire:ignore x-data="vimeoPlayer({ - url: '{{ $module->video }}', + url: @js($module->video), byline: false, dnt: true, pip: true, @@ -23,8 +23,8 @@ responsive: true, speed: true, title: false - })" @play="Livewire.emit('onPlayerStart')" - @ended="Livewire.emit('onPlayerEnd')"> + })" @play="Livewire.dispatch('onPlayerStart')" + @ended="Livewire.dispatch('onPlayerEnd')"> </div> <p>{{ $module->introduction }}</p> </div> diff --git a/resources/views/livewire/prompt.blade.php b/resources/views/livewire/prompt.blade.php index f51d5f8e3..5d3434ca0 100644 --- a/resources/views/livewire/prompt.blade.php +++ b/resources/views/livewire/prompt.blade.php @@ -9,7 +9,7 @@ @endisset <p>{{ $description }}</p> <div class="actions"> - <a class="cta" href="{{ $actionUrl }}">{{ $actionLabel }}</a> + <a class="cta" href="{{ $actionUrl }}" wire:click="dismiss">{{ $actionLabel }}</a> <form wire:submit="dismiss"> <button class="borderless" @click="visible = false">{{ __('Dismiss') }}</button> </form> diff --git a/resources/views/livewire/theme-switcher.blade.php b/resources/views/livewire/theme-switcher.blade.php index fbf138ce3..12524e3c4 100644 --- a/resources/views/livewire/theme-switcher.blade.php +++ b/resources/views/livewire/theme-switcher.blade.php @@ -1,5 +1,5 @@ <nav class="themes" aria-label="{{ __('themes') }}" x-data="{ - theme: '{{ $theme }}', + theme: @js($theme), preview(theme) { $wire.setTheme(theme); this.theme = theme; diff --git a/resources/views/projects/edit/1.blade.php b/resources/views/projects/edit/1.blade.php index badf6fbd4..78a567e34 100644 --- a/resources/views/projects/edit/1.blade.php +++ b/resources/views/projects/edit/1.blade.php @@ -74,7 +74,7 @@ <h3>{{ __('Project outcome') }}</h3> <x-interpretation name="{{ __('Project outcome', [], 'en') }}" /> - <fieldset class="field @error('outcome_analysis') field--error @enderror stack" x-data="{ otherOutcomeAnalysis: {{ old('has_other_outcome_analysis', !is_null($project->outcome_analysis_other) && $project->outcome_analysis_other !== '' ? 'true' : 'false') }} }"> + <fieldset class="field @error('outcome_analysis') field--error @enderror stack" x-data="{ otherOutcomeAnalysis: @js(old('has_other_outcome_analysis', !is_null($project->outcome_analysis_other) && $project->outcome_analysis_other !== '' ? true : false)) }"> <legend> {{ __('Who will be going through the results and producing an outcome?') . ' ' . __('(required)') }} </legend> diff --git a/resources/views/projects/my-projects.blade.php b/resources/views/projects/my-projects.blade.php index 0e3febeea..e219c3674 100644 --- a/resources/views/projects/my-projects.blade.php +++ b/resources/views/projects/my-projects.blade.php @@ -1,113 +1,19 @@ <x-app-layout header-class="header--tabbed" page-width="wide"> - <x-slot name="title">{{ __('Projects') }}</x-slot> + <x-slot name="title">{{ __('Projects my organization has created') }}</x-slot> <x-slot name="header"> <div class="center center:wide stack"> - <div class="flex flex-wrap items-center justify-between gap-4"> + <div class="flex items-center justify-between gap-4"> <h1 id="projects" itemprop="name"> - {{ __('Projects') }} + {{ __('Projects my organization has created') }} </h1> - @if (Auth::user()->can('viewAny', 'App\Models\Project')) - <a class="cta secondary" - href="{{ localized_route('projects.all-projects') }}">{{ __('Browse all projects') }}</a> - @endif + @can('create', 'App\Models\Project') + <a class="cta shrink-0" + href="{{ $projectable->projects->count() > 0 ? localized_route('projects.show-context-selection') : localized_route('projects.show-language-selection') }}">{{ __('Create new project') }}</a> + @endcan </div> - <x-interpretation name="{{ __('Projects', [], 'en') }}" /> + <x-interpretation name="{{ __('Projects my organization has created', [], 'en') }}" /> </div> </x-slot> - @if ( - ($user->context === \App\Enums\UserContext::Organization->value && - ($user->organization->isConsultant() || - $user->organization->isConnector() || - $user->organization->isParticipant())) || - ($user->context === \App\Enums\UserContext::Individual->value && - ($user->individual->isConsultant() || $user->individual->isConnector()) && - ($user->individual->isParticipant() || $user->individual->inProgressParticipatingProjects()->count()))) - @if ( - $user->context === \App\Enums\UserContext::Organization->value || - ($user->context === \App\Enums\UserContext::Individual->value && count($user->individual?->roles ?? []) > 1) || - ($user->individual?->inProgressContractedProjects()->count() && - $user->individual?->inProgressParticipatingProjects()->count())) - <nav class="nav--tabbed" aria-labelledby="projects"> - <div class="center center:wide"> - <ul class="-mt-4 flex gap-6" role="list"> - @if ($user->context === \App\Enums\UserContext::Organization->value) - {{-- currently there's no project and engagement level consultants; check Github issue #1539 - @if ($user->organization->isConsultant() || $user->organization->isConnector()) - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-projects')" :active="request()->localizedRouteIs('projects.my-projects')"> - {{ __('Involved in as an Accessibility Consultant') }} - </x-nav-link> - </li> - @endif - --}} - @if ($user->organization->isConnector() && Auth::user()->can('viewAny', 'App\Models\Project')) - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-contracted-projects')" :active="$section === App\Enums\ProjectInvolvement::Contracted->value"> - {{ __('Involved in as a Community Connector') }} - </x-nav-link> - </li> - @endif - @if ($user->organization->isParticipant() && Auth::user()->can('viewAny', 'App\Models\Project')) - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-participating-projects')" :active="$section === App\Enums\ProjectInvolvement::Participating->value"> - {{ __('Involved in as a Consultation Participant') }} - </x-nav-link> - </li> - @endif - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-running-projects')" :active="$section === App\Enums\ProjectInvolvement::Running->value"> - {{ __('Projects I am running') }} - </x-nav-link> - </li> - @endif - @if ($user->context === \App\Enums\UserContext::Individual->value && Auth::user()->can('viewAny', 'App\Models\Project')) - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-participating-projects')" :active="$section === App\Enums\ProjectInvolvement::Participating->value"> - {{ __('Involved in as a Consultation Participant') }} - </x-nav-link> - </li> - <li class="w-full"> - <x-nav-link class="inline-flex w-full items-center justify-center border-t-0" - :href="localized_route('projects.my-contracted-projects')" :active="$section === App\Enums\ProjectInvolvement::Contracted->value"> - {{ __('Involved in as a Community Connector') }} - </x-nav-link> - </li> - @endif - </ul> - </div> - </nav> - @endif - @endif - @if (Auth::user()->can('viewAny', 'App\Models\Project')) - @switch($user->context) - @case('organization') - @include(isset($section) ? 'projects.my-projects.' . $section : 'projects.my-projects.running') - @break - - @case('regulated-organization') - @includeWhen($projectable, 'projects.my-projects.running') - @break - - @default - @include(isset($section) ? 'projects.my-projects.' . $section : 'projects.my-projects.participating') - @endswitch - <div class="full accent--color -mb-8 mt-12 py-12"> - <div class="center center:wide stack text-center"> - <h2>{{ __('Browse all projects') }}</h2> - <x-interpretation name="{{ __('Browse all projects', [], 'en') }}" /> - <p>{{ __('This includes projects by Regulated Organizations and Community Organizations.') }}</p> - <p class="mt-8"><a class="cta" - href="{{ localized_route('projects.all-projects') }}">{{ __('Browse all projects') }}</a> - </p> - </div> - </div> - @else - @includeWhen($projectable, 'projects.my-projects.running') - @endif + @includeWhen($projectable, 'projects.my-projects.running') </x-app-layout> diff --git a/resources/views/projects/my-projects/contracted.blade.php b/resources/views/projects/my-projects/contracted.blade.php deleted file mode 100644 index 2911b0ef1..000000000 --- a/resources/views/projects/my-projects/contracted.blade.php +++ /dev/null @@ -1,60 +0,0 @@ -<h2>{{ __('Projects I am contracted for') }}</h2> -<x-interpretation name="{{ __('Projects I am contracted for', [], 'en') }}" /> - -@if ($user->context === 'individual') - <h3>{{ __('In progress') }}</h3> - <x-interpretation name="{{ __('In progress', [], 'en') }}" namespace="projects_contracted-individual" /> - @forelse ($user->individual->inProgressContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - <h3>{{ __('Upcoming') }}</h3> - <x-interpretation name="{{ __('Upcoming', [], 'en') }}" namespace="projects_contracted-individual" /> - @forelse ($user->individual->upcomingContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - @if (!$user->individual->completedContractedProjects->isEmpty()) - <x-expander level="3" :summary="__('Completed')"> - <x-interpretation name="{{ __('Completed', [], 'en') }}" namespace="projects_contracted-individual" /> - @forelse ($user->individual->completedContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - </x-expander> - @endif -@endif - -@if ($user->context === 'organization') - <h3>{{ __('In progress') }}</h3> - <x-interpretation name="{{ __('In progress', [], 'en') }}" namespace="projects_contracted-organization" /> - @forelse ($user->organization->inProgressContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - <h3>{{ __('Upcoming') }}</h3> - <x-interpretation name="{{ __('Upcoming', [], 'en') }}" namespace="projects_contracted-organization" /> - @forelse ($user->organization->upcomingContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - @if (!$user->organization->completedContractedProjects->isEmpty()) - <x-expander level="3" :summary="__('Completed')"> - <x-interpretation name="{{ __('Completed', [], 'en') }}" namespace="projects_contracted-organization" /> - @forelse ($user->organization->completedContractedProjects as $project) - @include('projects.partials.project-and-contracted-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - </x-expander> - @endif -@endif diff --git a/resources/views/projects/my-projects/participating.blade.php b/resources/views/projects/my-projects/participating.blade.php deleted file mode 100644 index e26b9c2df..000000000 --- a/resources/views/projects/my-projects/participating.blade.php +++ /dev/null @@ -1,60 +0,0 @@ -<h2>{{ __('Projects I am participating in') }}</h2> -<x-interpretation name="{{ __('Projects I am participating in', [], 'en') }}" /> - -@if ($user->context === 'individual') - <h3>{{ __('In progress') }}</h3> - <x-interpretation name="{{ __('In progress', [], 'en') }}" /> - @forelse ($user->individual->inProgressParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - <h3>{{ __('Upcoming') }}</h3> - <x-interpretation name="{{ __('Upcoming', [], 'en') }}" /> - @forelse ($user->individual->upcomingParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - @if (!$user->individual->completedParticipatingProjects->isEmpty()) - <x-expander level="3" :summary="__('Completed')"> - <x-interpretation name="{{ __('Completed', [], 'en') }}" /> - @forelse ($user->individual->completedParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - </x-expander> - @endif -@endif - -@if ($user->context === 'organization') - <h3>{{ __('In progress') }}</h3> - <x-interpretation name="{{ __('In progress', [], 'en') }}" /> - @forelse ($user->organization->inProgressParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - <h3>{{ __('Upcoming') }}</h3> - <x-interpretation name="{{ __('Upcoming', [], 'en') }}" /> - @forelse ($user->organization->upcomingParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - - @if (!$user->organization->completedParticipatingProjects->isEmpty()) - <x-expander level="3" :summary="__('Completed')"> - <x-interpretation name="{{ __('Completed', [], 'en') }}" /> - @forelse ($user->organization->completedParticipatingProjects as $project) - @include('projects.partials.project-and-participating-engagements') - @empty - <p>{{ __('No projects found.') }}</p> - @endforelse - </x-expander> - @endif -@endif diff --git a/resources/views/projects/my-projects/running.blade.php b/resources/views/projects/my-projects/running.blade.php index bf2a1d546..c3aa37688 100644 --- a/resources/views/projects/my-projects/running.blade.php +++ b/resources/views/projects/my-projects/running.blade.php @@ -1,18 +1,3 @@ -<div class="flex flex-wrap items-center justify-between gap-4"> - <h2>{{ __('Projects I am running') }}</h2> - <x-interpretation name="{{ __('Projects I am running', [], 'en') }}" /> - - @if ( - $projectable && - (!$projectable->draftProjects->isEmpty() || - !$projectable->inProgressProjects->isEmpty() || - !$projectable->upcomingProjects->isEmpty() || - !$projectable->completedProjects->isEmpty())) - <a class="cta" - href="{{ $user->projectable->projects->count() > 0 ? localized_route('projects.show-context-selection') : localized_route('projects.show-language-selection') }}">{{ __('Create new project') }}</a> - @endif -</div> - @if ( $projectable && $projectable->draftProjects->isEmpty() && @@ -31,7 +16,7 @@ @endif @if ($projectable && !$projectable->draftProjects->isEmpty()) - <h3>{{ __('Draft') }}</h3> + <h2>{{ __('Draft') }}</h2> <x-interpretation name="{{ __('Draft', [], 'en') }}" /> @foreach ($projectable->draftProjects as $project) @include('projects.partials.project-and-engagements') @@ -39,7 +24,7 @@ @endif @if ($projectable && !$projectable->inProgressProjects->isEmpty()) - <h3>{{ __('In progress') }}</h3> + <h2>{{ __('In progress') }}</h2> <x-interpretation name="{{ __('In progress', [], 'en') }}" /> @foreach ($projectable->inProgressProjects as $project) @include('projects.partials.project-and-engagements') @@ -47,7 +32,7 @@ @endif @if ($projectable && !$projectable->upcomingProjects->isEmpty()) - <h3>{{ __('Upcoming') }}</h3> + <h2>{{ __('Upcoming') }}</h2> <x-interpretation name="{{ __('Upcoming', [], 'en') }}" /> @foreach ($projectable->upcomingProjects as $project) @include('projects.partials.project-and-engagements') diff --git a/resources/views/projects/partials/project-and-engagements.blade.php b/resources/views/projects/partials/project-and-engagements.blade.php index 973c8ed3a..84c2509e5 100644 --- a/resources/views/projects/partials/project-and-engagements.blade.php +++ b/resources/views/projects/partials/project-and-engagements.blade.php @@ -1,7 +1,7 @@ -<x-card.project :model="$project" :level="4" /> +<x-card.project :model="$project" :level="3" /> @if (Auth::user()->can('manage', $project)) @foreach ($project->allEngagements as $engagement) - <x-card.engagement :model="$engagement" :level="5" /> + <x-card.engagement :model="$engagement" :level="4" /> @endforeach @else @foreach ($project->engagements as $engagement) diff --git a/resources/views/projects/show-context-selection.blade.php b/resources/views/projects/show-context-selection.blade.php index 5e66d21df..c5240ddd6 100644 --- a/resources/views/projects/show-context-selection.blade.php +++ b/resources/views/projects/show-context-selection.blade.php @@ -15,7 +15,7 @@ <x-interpretation name="{{ __('About your project', [], 'en') }}" /> <form class="stack" id="create-project" action="{{ localized_route('projects.store-context') }}" method="post" - novalidate x-data="{ context: '{{ old('context', session('context')) ?? '' }}' }"> + novalidate x-data="{ context: @js(old('context', session('context')) ?? '') }"> @csrf <fieldset class="field @error('context') field--error @enderror stack"> diff --git a/resources/views/projects/show.blade.php b/resources/views/projects/show.blade.php index b9654b81d..11c4b4b68 100644 --- a/resources/views/projects/show.blade.php +++ b/resources/views/projects/show.blade.php @@ -14,12 +14,11 @@ @endpush @endif <ol class="breadcrumbs" role="list"> - @can('update', $project) + @if (auth()->user()->isMemberOf($project->projectable)) <li><a href="{{ localized_route('projects.my-projects') }}">{{ __('My projects') }}</a></li> @else - <li><a href="{{ localized_route('projects.my-projects') }}">{{ __('Projects') }}</a></li> - <li><a href="{{ localized_route('projects.all-projects') }}">{{ __('Browse all projects') }}</a></li> - @endcan + <li><a href="{{ localized_route('engagements.index') }}">{{ __('Engagements') }}</a></li> + @endif </ol> <h1 id="project">{{ $project->getTranslation('name', $language) }}</h1> @if ($project->checkStatus('draft')) @@ -31,7 +30,12 @@ <p class="h4"> {{ safe_inlineMarkdown('Accessibility project by [:projectable](:url)', [ 'projectable' => $project->projectable->name, - 'url' => localized_route('regulated-organizations.show', $project->projectable), + 'url' => localized_route( + $project->projectable instanceof App\Models\RegulatedOrganization + ? 'regulated-organizations.show' + : 'organizations.show', + $project->projectable, + ), ]) }} </p> diff --git a/resources/views/regulated-organizations/partials/contact-information.blade.php b/resources/views/regulated-organizations/partials/contact-information.blade.php new file mode 100644 index 000000000..f2bd4af2e --- /dev/null +++ b/resources/views/regulated-organizations/partials/contact-information.blade.php @@ -0,0 +1,11 @@ +<h3>{{ $regulatedOrganization->contact_person_name }}</h3> +<x-interpretation name="{{ __('contact person', [], 'en') }}" /> + +@if ($regulatedOrganization->contact_person_email) + <x-contact-point type="email" :value="$regulatedOrganization->contact_person_email" :preferred="$regulatedOrganization->preferred_contact_method === 'email' && + $regulatedOrganization->contact_person_phone" /> +@endif +@if ($regulatedOrganization->contact_person_phone) + <x-contact-point type="phone" :value="$regulatedOrganization->contact_person_phone" :preferred="$regulatedOrganization->preferred_contact_method === 'phone' && + $regulatedOrganization->contact_person_email" :vrs="$regulatedOrganization->contact_person_vrs" /> +@endif diff --git a/resources/views/regulated-organizations/show.blade.php b/resources/views/regulated-organizations/show.blade.php index cac0af1e8..e544321e0 100644 --- a/resources/views/regulated-organizations/show.blade.php +++ b/resources/views/regulated-organizations/show.blade.php @@ -116,11 +116,18 @@ <li> <x-nav-link :href="localized_route('regulated-organizations.show-projects', $regulatedOrganization)" :active="request()->localizedRouteIs('regulated-organizations.show-projects')">{{ __('Projects') }}</x-nav-link> </li> + <li> + <x-nav-link :href="localized_route( + 'regulated-organizations.show-contact-information', + $regulatedOrganization, + )" :active="request()->localizedRouteIs('regulated-organizations.show-contact-information')">{{ __('Contact information') }}</x-nav-link> + </li> </ul> </nav> <div class="stack"> @if (request()->localizedRouteIs('regulated-organizations.show')) <x-section-heading :name="__('About')" :model="$regulatedOrganization" :href="localized_route('regulated-organizations.edit', $regulatedOrganization)" /> + <x-interpretation name="{{ __('About', [], 'en') }}" /> @include('regulated-organizations.partials.about') @elseif(request()->localizedRouteIs('regulated-organizations.show-projects')) <h2 class="repel">{{ __('Projects') }} @can('update', $regulatedOrganization) @@ -128,7 +135,12 @@ href="{{ $regulatedOrganization->projects->count() > 0 ? localized_route('projects.show-context-selection') : localized_route('projects.show-language-selection') }}">{{ __('Create a project') }}</a> @endcan </h2> + <x-interpretation name="{{ __('Projects', [], 'en') }}" /> @include('regulated-organizations.partials.projects') + @elseif(request()->localizedRouteIs('regulated-organizations.show-contact-information')) + <x-section-heading :name="__('Contact information')" :model="$regulatedOrganization" :href="localized_route('regulated-organizations.edit', $regulatedOrganization)" /> + <x-interpretation name="{{ __('Contact information', [], 'en') }}" /> + @include('regulated-organizations.partials.contact-information') @endif </div> </div> diff --git a/resources/views/settings/access-needs.blade.php b/resources/views/settings/access-needs.blade.php index 2912cc04c..f55f2fab2 100644 --- a/resources/views/settings/access-needs.blade.php +++ b/resources/views/settings/access-needs.blade.php @@ -40,9 +40,9 @@ </fieldset> <fieldset class="field @error('meeting_access_needs') field--error @enderror" x-data="{ - interpretationSigned: {{ in_array($signLanguageInterpretation, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? 'true' : 'false' }}, - interpretationSpoken: {{ in_array($spokenLanguageInterpretation, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? 'true' : 'false' }}, - followUpNeeds: {{ in_array($followUpCallsOrEmails, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? 'true' : 'false' }}, + interpretationSigned: @js(in_array($signLanguageInterpretation, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? true : false), + interpretationSpoken: @js(in_array($spokenLanguageInterpretation, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? true : false), + followUpNeeds: @js(in_array($followUpCallsOrEmails, old('meeting_access_needs', $selectedAccessSupports ?? [])) ? true : false), }"> <legend> <h2>{{ __('For meeting in real time') }}</h2> diff --git a/resources/views/settings/communication-and-consultation-preferences.blade.php b/resources/views/settings/communication-and-consultation-preferences.blade.php index ebbde2739..795c5e945 100644 --- a/resources/views/settings/communication-and-consultation-preferences.blade.php +++ b/resources/views/settings/communication-and-consultation-preferences.blade.php @@ -21,7 +21,7 @@ <h2>{{ __('Communication') }}</h2> <x-interpretation name="{{ __('Communication', [], 'en') }}" /> - <div class="stack" x-data="{ contactPerson: '{{ old('preferred_contact_person', $individual->user->preferred_contact_person ?? 'me') }}' }"> + <div class="stack" x-data="{ contactPerson: @js(old('preferred_contact_person', $individual->user->preferred_contact_person ?? 'me')) }"> <fieldset> <legend>{{ __('Contact person') . ' ' . __('(required)') }}</legend> <x-interpretation name="{{ __('Contact person', [], 'en') }}" /> @@ -105,7 +105,7 @@ </div> @if ($individual->isParticipant()) - <div class="stack" x-data="{ consultingMethods: {{ json_encode(old('consulting_methods', $individual->consulting_methods ?? [])) }} }"> + <div class="stack" x-data="{ consultingMethods: @js(old('consulting_methods', $individual->consulting_methods ?? [])) }"> <h2>{{ __('Consultations') }}</h2> <x-interpretation name="{{ __('Consultations', [], 'en') }}" /> diff --git a/resources/views/settings/payment-information.blade.php b/resources/views/settings/payment-information.blade.php index 8437820c7..3e3386c2b 100644 --- a/resources/views/settings/payment-information.blade.php +++ b/resources/views/settings/payment-information.blade.php @@ -17,7 +17,7 @@ @csrf @method('put') - <fieldset class="field @error('payment_types') field--error @enderror" x-data="{ other: {{ old('other', !is_null($individual->other_payment_type) && $individual->other_payment_type !== '' ? 'true' : 'false') }} }"> + <fieldset class="field @error('payment_types') field--error @enderror" x-data="{ other: @js(old('other', !is_null($individual->other_payment_type) && $individual->other_payment_type !== '' ? true : false)) }"> <legend>{{ __('What types of payment are you able to accept?') }}</legend> <x-interpretation name="{{ __('What types of payment are you able to accept?', [], 'en') }}" /> <p class="field__hint">{{ __('Please check all that apply.') }}</p> diff --git a/resources/views/users/show-introduction.blade.php b/resources/views/users/show-introduction.blade.php index a3e67711e..6566fa8cc 100644 --- a/resources/views/users/show-introduction.blade.php +++ b/resources/views/users/show-introduction.blade.php @@ -38,7 +38,7 @@ @if (array_key_exists(locale(), $user->introduction())) <div class="frame"> <div class="stack w-full" x-data="vimeoPlayer({ - url: '{{ $user->introduction()[locale()] }}', + url: @js($user->introduction()[locale()]), byline: false, dnt: true, pip: true, @@ -52,7 +52,7 @@ @elseif (array_key_exists('en', $user->introduction())) <div class="frame"> <div class="stack w-full" x-data="vimeoPlayer({ - url: '{{ $user->introduction()['en'] }}', + url: @js($user->introduction()['en']), byline: false, dnt: true, pip: true, @@ -66,7 +66,9 @@ @endif <div class="center repel"> - <a class="cta secondary" href="{{ $skipTo }}">{{ __('Skip for now') }}</a> + @empty($user->finished_introduction) + <a class="cta secondary" href="{{ $skipTo }}">{{ __('Skip for now') }}</a> + @endempty <form class="width:full" action="{{ localized_route('users.update-introduction-status') }}" method="post"> @method('put') @csrf diff --git a/routes/engagements.php b/routes/engagements.php index 82c7cb053..29af90aa2 100644 --- a/routes/engagements.php +++ b/routes/engagements.php @@ -1,8 +1,11 @@ <?php use App\Http\Controllers\EngagementController; +use App\Http\Controllers\UserEngagementsController; use App\Livewire\AddEngagementConnector; +use App\Livewire\BrowseEngagements; use App\Livewire\ManageEngagementConnector; +use Illuminate\Support\Facades\Route; Route::controller(EngagementController::class) ->name('engagements.') @@ -26,10 +29,31 @@ ->name('store'); }); +Route::controller(UserEngagementsController::class) + ->name('engagements.') + ->prefix('engagements') + ->group(function () { + Route::multilingual('/joined', 'show') + ->middleware(['auth', 'verified', 'can:viewJoined,App\Models\Engagement']) + ->name('joined'); + + Route::multilingual('/joined/contracted', 'showContracted') + ->middleware(['auth', 'verified', 'can:viewJoined,App\Models\Engagement']) + ->name('joined-contracted'); + + Route::multilingual('/joined/participating', 'showParticipating') + ->middleware(['auth', 'verified', 'can:viewJoined,App\Models\Engagement']) + ->name('joined-participating'); + }); + Route::controller(EngagementController::class) ->prefix('engagements') ->name('engagements.') ->group(function () { + Route::multilingual('', [BrowseEngagements::class, '__invoke']) + ->middleware(['auth', 'verified', 'can:viewAny,App\Models\Engagement']) + ->name('index'); + Route::multilingual('/{engagement}', 'show') ->middleware(['auth', 'verified', 'can:view,engagement']) ->name('show'); diff --git a/routes/projects.php b/routes/projects.php index edb214b7a..22ef3182e 100644 --- a/routes/projects.php +++ b/routes/projects.php @@ -2,32 +2,21 @@ use App\Http\Controllers\ProjectController; use App\Http\Controllers\UserProjectsController; -use App\Livewire\AllProjects; +use Illuminate\Support\Facades\Route; -Route::multilingual('/projects', [UserProjectsController::class, 'show']) - ->middleware(['auth', 'verified', 'can:viewOwned,App\Models\Project']) - ->name('projects.my-projects'); - -Route::multilingual('/projects/contracted', [UserProjectsController::class, 'showContracted']) - ->middleware(['auth', 'verified', 'can:viewAny,App\Models\Project']) - ->name('projects.my-contracted-projects'); - -Route::multilingual('/projects/participating', [UserProjectsController::class, 'showParticipating']) - ->middleware(['auth', 'verified', 'can:viewAny,App\Models\Project']) - ->name('projects.my-participating-projects'); - -Route::multilingual('/projects/running', [UserProjectsController::class, 'showRunning']) - ->middleware(['auth', 'verified', 'can:viewOwned,App\Models\Project']) - ->name('projects.my-running-projects'); +Route::controller(UserProjectsController::class) + ->name('projects.') + ->prefix('projects') + ->group(function () { + Route::multilingual('', 'show') + ->middleware(['auth', 'verified', 'can:viewRunning,App\Models\Project']) + ->name('my-projects'); + }); Route::controller(ProjectController::class) ->prefix('projects') ->name('projects') ->group(function () { - Route::multilingual('/all', [AllProjects::class, '__invoke']) - ->middleware(['auth', 'verified', 'can:viewAny,App\Models\Project']) - ->name('.all-projects'); - Route::multilingual('/context/select', 'showContextSelection') ->middleware(['auth', 'can:create,App\Models\Project']) ->name('.show-context-selection'); diff --git a/routes/regulated-organizations.php b/routes/regulated-organizations.php index 70170c570..c5b4d7df1 100644 --- a/routes/regulated-organizations.php +++ b/routes/regulated-organizations.php @@ -41,6 +41,10 @@ ->middleware(['auth', 'can:view,regulatedOrganization']) ->name('show'); + Route::multilingual('/{regulatedOrganization}/contact-information', 'show') + ->middleware(['auth', 'can:view,regulatedOrganization']) + ->name('show-contact-information'); + Route::multilingual('/{regulatedOrganization}/projects', 'show') ->middleware(['auth', 'can:view,regulatedOrganization']) ->name('show-projects'); diff --git a/tests/Datasets/BrowseEngagementsFormat.php b/tests/Datasets/BrowseEngagementsFormat.php new file mode 100644 index 000000000..437103517 --- /dev/null +++ b/tests/Datasets/BrowseEngagementsFormat.php @@ -0,0 +1,37 @@ +<?php + +use App\Enums\EngagementFormat; + +dataset('browseEngagementsFormat', function () { + $formats = array_column(EngagementFormat::cases(), 'value'); + $engagementNames = array_combine($formats, array_map(fn ($format) => "{$format} - Engagement", $formats)); + $testCases = []; + + $testCases['No Formats'] = [ + 'filter' => [], + 'toSee' => $engagementNames, + ]; + + $testCases['All Formats'] = [ + 'filter' => array_column(EngagementFormat::cases(), 'value'), + 'toSee' => $engagementNames, + ]; + + foreach ($engagementNames as $format => $engagementName) { + $dontSee = []; + + foreach ($engagementNames as $otherFormat => $otherEngagementName) { + if ($otherFormat !== $format) { + $dontSee[$otherFormat] = $otherEngagementName; + } + } + + $testCases["Only {$format} format"] = [ + 'filter' => [$format], + 'toSee' => [$format => $engagementName], + 'dontSee' => $dontSee, + ]; + } + + return $testCases; +}); diff --git a/tests/Datasets/IndividualIsReady.php b/tests/Datasets/IndividualIsReady.php index 9ff5c6c2f..0c07b996f 100644 --- a/tests/Datasets/IndividualIsReady.php +++ b/tests/Datasets/IndividualIsReady.php @@ -18,6 +18,16 @@ ]; return [ + 'No roles set' => [ + [ + 'oriented_at' => null, + ], + [ + 'other_payment_type' => null, + ], + $dont_add_payment_types, + $notReady, + ], 'Participant: not approved' => [ [ 'oriented_at' => null, diff --git a/tests/Feature/DashboardTest.php b/tests/Feature/DashboardTest.php index a5ceef2f0..b8918c2c5 100644 --- a/tests/Feature/DashboardTest.php +++ b/tests/Feature/DashboardTest.php @@ -1,44 +1,154 @@ <?php +use App\Enums\IndividualRole; +use App\Enums\TeamRole; +use App\Enums\UserContext; use App\Models\Organization; use App\Models\RegulatedOrganization; use App\Models\User; use function Pest\Laravel\actingAs; +test('admin user can access dashboard', function () { + $user = User::factory()->create([ + 'context' => UserContext::Administrator->value, + ]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee($user->name) + ->assertDontSee(__('Watch introduction video again')); +}); + test('individual user can access dashboard', function () { $user = User::factory()->create([ - 'context' => 'individual', + 'context' => UserContext::Individual->value, ]); $individual = $user->individual; - $individual->roles = ['participant']; + $individual->roles = [IndividualRole::ConsultationParticipant->value]; $individual->save(); actingAs($user)->get(localized_route('dashboard')) - ->assertOk(); + ->assertOk() + ->assertSee($user->name) + ->assertSee(__('Watch introduction video again')); }); test('regulated organization user can access dashboard', function () { $regulatedOrganizationUser = User::factory()->create([ - 'context' => 'regulated-organization', + 'context' => UserContext::RegulatedOrganization->value, ]); RegulatedOrganization::factory() - ->hasAttached($regulatedOrganizationUser, ['role' => 'admin']) + ->hasAttached($regulatedOrganizationUser, ['role' => TeamRole::Administrator->value]) ->create(); actingAs($regulatedOrganizationUser)->get(localized_route('dashboard')) - ->assertOk(); + ->assertOk() + ->assertSee($regulatedOrganizationUser->name) + ->assertSee(__('Watch introduction video again')); }); test('organization user can access dashboard', function () { $organizationUser = User::factory()->create([ - 'context' => 'organization', + 'context' => UserContext::Organization->value, + ]); + + $organization = Organization::factory() + ->hasAttached($organizationUser, ['role' => TeamRole::Administrator->value]) + ->create(); + + actingAs($organizationUser)->get(localized_route('dashboard')) + ->assertRedirect(localized_route('organizations.show-role-selection', $organization)); + + $organization->roles = ['consultant']; + $organization->save(); + + actingAs($organizationUser->fresh())->get(localized_route('dashboard')) + ->assertOk() + ->assertSee($organizationUser->name) + ->assertSee(__('Watch introduction video again')); +}); + +test('training user can access dashboard', function () { + $user = User::factory()->create([ + 'context' => UserContext::TrainingParticipant->value, + ]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee($user->name) + ->assertDontSee(__('Watch introduction video again')); +}); + +test('admin user dashboard prompts', function () { + $user = User::factory()->create([ + 'context' => UserContext::Administrator->value, + ]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee(__('Customize this website’s accessibility')); + + $user->update(['dismissed_customize_prompt_at' => now()]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Customize this website’s accessibility')); +}); + +test('individual user dashboard propmts', function () { + $user = User::factory()->create([ + 'context' => UserContext::Individual->value, + ]); + + $individual = $user->individual; + $individual->roles = [IndividualRole::ConsultationParticipant->value]; + $individual->save(); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee(__('Customize this website’s accessibility')); + + $user->update(['dismissed_customize_prompt_at' => now()]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Customize this website’s accessibility')); +}); + +test('regulated organization user dashboard propmts', function () { + $regulatedOrganizationUser = User::factory()->create([ + 'context' => UserContext::RegulatedOrganization->value, + ]); + + RegulatedOrganization::factory() + ->hasAttached($regulatedOrganizationUser, ['role' => TeamRole::Administrator->value]) + ->create(); + + actingAs($regulatedOrganizationUser)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee(__('Customize this website’s accessibility')) + ->assertSee(__('Invite others to your organization')); + + $regulatedOrganizationUser->update(['dismissed_customize_prompt_at' => now()]); + $regulatedOrganizationUser->regulatedOrganization->update(['dismissed_invite_prompt_at' => now()]); + $regulatedOrganizationUser->refresh(); + + actingAs($regulatedOrganizationUser)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Customize this website’s accessibility')) + ->assertDontSee(__('Invite others to your organization')); +}); + +test('organization user can dashboard propmts', function () { + $organizationUser = User::factory()->create([ + 'context' => UserContext::Organization->value, ]); $organization = Organization::factory() - ->hasAttached($organizationUser, ['role' => 'admin']) + ->hasAttached($organizationUser, ['role' => TeamRole::Administrator->value]) ->create(); actingAs($organizationUser)->get(localized_route('dashboard')) @@ -48,5 +158,32 @@ $organization->save(); actingAs($organizationUser->fresh())->get(localized_route('dashboard')) - ->assertOk(); + ->assertOk() + ->assertSee(__('Customize this website’s accessibility')) + ->assertSee(__('Invite others to your organization')); + + $organizationUser->update(['dismissed_customize_prompt_at' => now()]); + $organizationUser->organization->update(['dismissed_invite_prompt_at' => now()]); + $organizationUser->refresh(); + + actingAs($organizationUser)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Customize this website’s accessibility')) + ->assertDontSee(__('Invite others to your organization')); +}); + +test('training user dashboard propmts', function () { + $user = User::factory()->create([ + 'context' => UserContext::TrainingParticipant->value, + ]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSee(__('Customize this website’s accessibility')); + + $user->update(['dismissed_customize_prompt_at' => now()]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Customize this website’s accessibility')); }); diff --git a/tests/Feature/EngagementTest.php b/tests/Feature/EngagementTest.php index 9009a0e2f..9f5f764c1 100644 --- a/tests/Feature/EngagementTest.php +++ b/tests/Feature/EngagementTest.php @@ -1,10 +1,16 @@ <?php +use App\Enums\Compensation; use App\Enums\EngagementFormat; +use App\Enums\EngagementRecruitment; +use App\Enums\EngagementSignUpStatus; use App\Enums\IdentityCluster; use App\Enums\IdentityType; +use App\Enums\IndividualRole; use App\Enums\LocationType; use App\Enums\MeetingType; +use App\Enums\ProjectInitiator; +use App\Enums\SeekingForEngagement; use App\Enums\UserContext; use App\Http\Requests\StoreEngagementRequest; use App\Http\Requests\UpdateEngagementRequest; @@ -19,21 +25,16 @@ use App\Models\PaymentType; use App\Models\Project; use App\Models\RegulatedOrganization; +use App\Models\Sector; use App\Models\User; use App\Statuses\EngagementStatus; -use Database\Seeders\DatabaseSeeder; -use Database\Seeders\IdentitySeeder; -use Database\Seeders\ImpactSeeder; use Illuminate\Support\Carbon; use function Pest\Laravel\actingAs; use function Pest\Laravel\get; -use function Pest\Laravel\seed; use function Pest\Laravel\withSession; test('users with regulated organization admin role can create engagements', function () { - seed(DatabaseSeeder::class); - $user = User::factory()->create(); $regulatedOrganization = RegulatedOrganization::factory() ->hasAttached($user, ['role' => 'admin']) @@ -212,8 +213,6 @@ })->with('storeEngagementRecruitmentRequestValidationErrors'); test('users can view engagements', function () { - seed(IdentitySeeder::class); - $user = User::factory()->create(); $engagement = Engagement::factory()->create(); @@ -226,11 +225,33 @@ get(localized_route('engagements.show', $engagement)) ->assertRedirect(localized_route('login')); + + get(localized_route('engagements.index')) + ->assertRedirect(localized_route('login')); + + get(localized_route('engagements.joined')) + ->assertRedirect(localized_route('login')); + + get(localized_route('engagements.joined-contracted')) + ->assertRedirect(localized_route('login')); + + get(localized_route('engagements.joined-participating')) + ->assertRedirect(localized_route('login')); }); -test('users with regulated organization admin role can edit engagements', function () { - seed(DatabaseSeeder::class); +test('users can not view engagements, if they are not oriented', function () { + $user = User::factory()->create(); + $pendingUser = User::factory()->create(['oriented_at' => null]); + $engagement = Engagement::factory()->create(); + + actingAs($user)->get(localized_route('engagements.show', $engagement))->assertOk(); + actingAs($user)->get(localized_route('engagements.index'))->assertOk(); + actingAs($pendingUser)->get(localized_route('engagements.show', $engagement))->assertNotFound(); + actingAs($pendingUser)->get(localized_route('engagements.index'))->assertForbidden(); +}); + +test('users with regulated organization admin role can edit engagements', function () { $user = User::factory()->create(['context' => UserContext::RegulatedOrganization->value]); $regulatedOrganization = RegulatedOrganization::factory() ->hasAttached($user, ['role' => 'admin']) @@ -245,6 +266,22 @@ actingAs($user)->get(localized_route('engagements.edit-criteria', $engagement)) ->assertOk(); + $disabilityTypeDeaf = Identity::factory()->create([ + 'name' => [ + 'en' => 'Deaf', + 'fr' => __('Deaf', [], 'fr'), + ], + 'clusters' => ['disability-and-deaf'], + ]); + + $identityTypeAge = Identity::factory()->create([ + 'name' => [ + 'en' => 'Working age adults (15–64)', + 'fr' => __('Working age adults (15–64)', [], 'fr'), + ], + 'clusters' => ['age'], + ]); + $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'location_type' => LocationType::Localities->value, 'regions' => $engagement->matchingStrategy->regions ?? [], @@ -255,12 +292,10 @@ ], ], 'cross_disability_and_deaf' => 0, - 'disability_types' => [ - Identity::whereJsonContains('clusters', IdentityCluster::DisabilityAndDeaf)->first()->id, - ], + 'disability_types' => [$disabilityTypeDeaf->id], 'intersectional' => 0, 'other_identity_type' => IdentityType::AgeBracket->value, - 'age_brackets' => [Identity::whereJsonContains('clusters', IdentityCluster::Age)->first()->id], + 'age_brackets' => [$identityTypeAge->id], ]); actingAs($user)->put(localized_route('engagements.update-criteria', $engagement), $data) @@ -269,14 +304,19 @@ actingAs($user)->get(localized_route('engagements.manage', $engagement)) ->assertSee('Halifax, Nova Scotia') - ->assertSee(Identity::whereJsonContains('clusters', IdentityCluster::DisabilityAndDeaf)->first()->name) - ->assertSee(Identity::whereJsonContains('clusters', IdentityCluster::Age)->first()->name); + ->assertSee($disabilityTypeDeaf->name) + ->assertSee($identityTypeAge->name); + + $identityTypeGender = Identity::factory()->create([ + 'name' => __('Trans people'), + 'clusters' => ['gender-and-sexuality'], + ]); $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'intersectional' => 0, 'other_identity_type' => IdentityType::GenderAndSexualIdentity->value, 'nb_gnc_fluid_identity' => 1, - 'gender_and_sexual_identities' => [Identity::whereJsonContains('clusters', IdentityCluster::GenderAndSexuality)->first()->id], + 'gender_and_sexual_identities' => [$identityTypeGender->id], ]); actingAs($user)->put(localized_route('engagements.update-criteria', $engagement), $data) @@ -285,15 +325,26 @@ $response = actingAs($user)->get(localized_route('engagements.manage', $engagement)); - $response->assertSee(Identity::whereJsonContains('clusters', IdentityCluster::GenderAndSexuality)->first()->name); + $response->assertSee($identityTypeGender->name); foreach (Identity::whereJsonContains('clusters', IdentityCluster::GenderDiverse)->pluck('name') as $identity) { $response->assertSee($identity); } + $indigenousIdentities = [ + __('First Nations'), + __('Inuit'), + __('Métis'), + ]; + + $indigenousIdentityModelKeys = array_map(fn ($indigenousIdentity) => Identity::factory()->create([ + 'name' => $indigenousIdentity, + 'clusters' => ['indigenous'], + ])->id, $indigenousIdentities); + $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'intersectional' => 0, 'other_identity_type' => IdentityType::IndigenousIdentity->value, - 'indigenous_identities' => Identity::whereJsonContains('clusters', IdentityCluster::Indigenous)->get()->modelKeys(), + 'indigenous_identities' => $indigenousIdentityModelKeys, ]); actingAs($user)->put(localized_route('engagements.update-criteria', $engagement), $data) @@ -301,14 +352,31 @@ ->assertRedirect(localized_route('engagements.manage', $engagement)); $response = actingAs($user)->get(localized_route('engagements.manage', $engagement)); - foreach (Identity::whereJsonContains('clusters', IdentityCluster::Indigenous)->pluck('name') as $identity) { + foreach ($indigenousIdentities as $identity) { $response->assertSee($identity); } + $ethnoracialIdentities = [ + __('White'), + __('Black'), + __('East Asian'), + __('Asian'), + __('South Asian'), + __('Southeast Asian'), + __('Middle Eastern'), + __('Latin American'), + __('African'), + ]; + + $ethnoracialIdentityModelKeys = array_map(fn ($ethnoracialIdentity) => Identity::factory()->create([ + 'name' => $ethnoracialIdentity, + 'clusters' => ['ethnoracial'], + ])->id, $ethnoracialIdentities); + $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'intersectional' => 0, 'other_identity_type' => IdentityType::EthnoracialIdentity->value, - 'ethnoracial_identities' => Identity::whereJsonContains('clusters', IdentityCluster::Ethnoracial)->pluck('id')->toArray(), + 'ethnoracial_identities' => $ethnoracialIdentityModelKeys, ]); actingAs($user)->put(localized_route('engagements.update-criteria', $engagement), $data) @@ -316,10 +384,22 @@ ->assertRedirect(localized_route('engagements.manage', $engagement)); $response = actingAs($user)->get(localized_route('engagements.manage', $engagement)); - foreach (Identity::whereJsonContains('clusters', IdentityCluster::Ethnoracial)->pluck('name') as $identity) { + foreach ($ethnoracialIdentities as $identity) { $response->assertSee($identity); } + $statusIdentities = [ + __('Refugees'), + __('Immigrants'), + ]; + + foreach ($statusIdentities as $statusIdentity) { + Identity::factory()->create([ + 'name' => $statusIdentity, + 'clusters' => ['status'], + ]); + } + $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'intersectional' => 0, 'other_identity_type' => IdentityType::RefugeeOrImmigrant->value, @@ -330,7 +410,7 @@ ->assertRedirect(localized_route('engagements.manage', $engagement)); $response = actingAs($user)->get(localized_route('engagements.manage', $engagement)); - foreach (Identity::whereJsonContains('clusters', IdentityCluster::Status)->pluck('name') as $identity) { + foreach ($statusIdentities as $identity) { $response->assertSee($identity); } @@ -348,10 +428,21 @@ ->assertSee('French') ->assertSee('Quebec Sign Language'); + $areaIdentities = [ + __('Urban areas'), + __('Rural areas'), + __('Remote areas'), + ]; + + $areaIdentityModelKeys = array_map(fn ($areaIdentity) => Identity::factory()->create([ + 'name' => $areaIdentity, + 'clusters' => ['area'], + ])->id, $areaIdentities); + $data = UpdateEngagementSelectionCriteriaRequest::factory()->create([ 'intersectional' => 0, 'other_identity_type' => IdentityType::AreaType->value, - 'area_types' => Identity::whereJsonContains('clusters', IdentityCluster::Area)->pluck('id')->toArray(), + 'area_types' => $areaIdentityModelKeys, ]); actingAs($user)->put(localized_route('engagements.update-criteria', $engagement), $data) @@ -359,7 +450,7 @@ ->assertRedirect(localized_route('engagements.manage', $engagement)); $response = actingAs($user)->get(localized_route('engagements.manage', $engagement)); - foreach (Identity::whereJsonContains('clusters', IdentityCluster::Area)->pluck('name') as $identity) { + foreach ($areaIdentities as $identity) { $response->assertSee($identity); } @@ -534,8 +625,6 @@ })->with('updateEngagementSelectionCriteriaRequestValidationErrors'); test('users with regulated organization admin role can manage engagements', function () { - seed(IdentitySeeder::class); - $user = User::factory()->create(); $regulatedOrganization = RegulatedOrganization::factory() ->hasAttached($user, ['role' => 'admin']) @@ -639,7 +728,6 @@ })->with('engagementIsPublishable'); test('admins can see engagement if it isPreviewable()', function () { - seed(ImpactSeeder::class); $project = Project::factory()->create([ 'contact_person_phone' => '4165555555', 'contact_person_response_time' => ['en' => '48 hours'], @@ -654,7 +742,7 @@ ], 'published_at' => now(), ]); - $project->impacts()->attach(Impact::first()->id); + $project->impacts()->attach(Impact::factory()->create()); $regulatedOrganization = $project->projectable; $regulatedOrganizationUser = User::factory()->create(['context' => UserContext::RegulatedOrganization->value]); $regulatedOrganization->users()->attach( @@ -963,3 +1051,840 @@ expect($project->upcomingEngagements)->toHaveCount(1); expect($project->upcomingEngagements->first()->is($upcomingEngagement))->toBeTrue(); }); + +test('users can browse engagements', function () { + $engagementName = 'Test engagement'; + Engagement::factory()->create(['name' => $engagementName]); + + $user = User::factory()->create(); + + actingAs($user)->get(localized_route('engagements.index')) + ->assertOk() + ->assertSee($engagementName); +}); + +test('statuses scope', function () { + $openEngagement = Engagement::factory()->create([ + 'signup_by_date' => Carbon::now()->addDays(5), + ]); + + $closedEngagement = Engagement::factory()->create([ + 'signup_by_date' => Carbon::now()->subDays(5), + ]); + + $noSignUpDateEngagement = Engagement::factory()->create(['signup_by_date' => null]); + + $statusQuery = Engagement::statuses([EngagementSignUpStatus::Open->value])->get(); + expect($statusQuery->contains($openEngagement))->toBeTrue(); + expect($statusQuery->contains($closedEngagement))->toBeFalse(); + expect($statusQuery->contains($noSignUpDateEngagement))->toBeFalse(); + + $statusQuery = Engagement::statuses([EngagementSignUpStatus::Closed->value])->get(); + expect($statusQuery->contains($closedEngagement))->toBeTrue(); + expect($statusQuery->contains($openEngagement))->toBeFalse(); + expect($statusQuery->contains($noSignUpDateEngagement))->toBeFalse(); + + $statusQuery = Engagement::statuses(array_column(EngagementSignUpStatus::cases(), 'value'))->get(); + expect($statusQuery->contains($openEngagement))->toBeTrue(); + expect($statusQuery->contains($closedEngagement))->toBeTrue(); + expect($statusQuery->contains($noSignUpDateEngagement))->toBeFalse(); + + $statusQuery = Engagement::statuses([])->get(); + expect($statusQuery->contains($openEngagement))->toBeTrue(); + expect($statusQuery->contains($closedEngagement))->toBeTrue(); + expect($statusQuery->contains($noSignUpDateEngagement))->toBeTrue(); +}); + +test('formats scope', function (array $filter = [], array $toSee = [], array $dontSee = []) { + $toContain = []; + foreach ($toSee as $format => $name) { + $toContain[] = Engagement::factory()->create([ + 'name' => $name, + 'format' => $format, + ]); + } + + $dontContain = []; + foreach ($dontSee as $format => $name) { + $dontContain[] = Engagement::factory()->create([ + 'name' => $name, + 'format' => $format, + ]); + } + + $formatQuery = Engagement::formats($filter)->get(); + + foreach ($toContain as $engagement) { + expect($formatQuery->contains($engagement))->toBeTrue(); + } + + foreach ($dontContain as $engagement) { + expect($formatQuery->contains($engagement))->toBeFalse(); + } +})->with('browseEngagementsFormat'); + +test('seekings scope', function () { + $openCallEngagement = Engagement::factory()->create(['recruitment' => 'open-call']); + + $connectorEngagement = Engagement::factory()->create([ + 'recruitment' => 'connector', + 'extra_attributes' => ['seeking_community_connector' => true], + ]); + + $organizationEngagement = Engagement::factory()->create([ + 'recruitment' => 'connector', + 'who' => 'organization', + ]); + + $seekingQuery = Engagement::seekings([SeekingForEngagement::Participants->value])->get(); + expect($seekingQuery->contains($openCallEngagement))->toBeTrue(); + expect($seekingQuery->contains($connectorEngagement))->toBeFalse(); + expect($seekingQuery->contains($organizationEngagement))->toBeFalse(); + + $seekingQuery = Engagement::seekings([SeekingForEngagement::Connectors->value])->get(); + expect($seekingQuery->contains($connectorEngagement))->toBeTrue(); + expect($seekingQuery->contains($openCallEngagement))->toBeFalse(); + expect($seekingQuery->contains($organizationEngagement))->toBeFalse(); + + $seekingQuery = Engagement::seekings([SeekingForEngagement::Organizations->value])->get(); + expect($seekingQuery->contains($organizationEngagement))->toBeTrue(); + expect($seekingQuery->contains($connectorEngagement))->toBeFalse(); + expect($seekingQuery->contains($openCallEngagement))->toBeFalse(); + + $seekingQuery = Engagement::seekings(array_column(SeekingForEngagement::cases(), 'value'))->get(); + expect($seekingQuery->contains($openCallEngagement))->toBeTrue(); + expect($seekingQuery->contains($connectorEngagement))->toBeTrue(); + expect($seekingQuery->contains($organizationEngagement))->toBeTrue(); + + $seekingQuery = Engagement::seekings([])->get(); + expect($seekingQuery->contains($openCallEngagement))->toBeTrue(); + expect($seekingQuery->contains($connectorEngagement))->toBeTrue(); + expect($seekingQuery->contains($organizationEngagement))->toBeTrue(); +}); + +test('initiators scope', function () { + $communityOrganizationEngagement = Engagement::factory() + ->for( + Project::factory() + ->for(Organization::factory(), 'projectable') + ) + ->create(); + + $regulatedOrganizationEngagement = Engagement::factory() + ->for( + Project::factory() + ->for(RegulatedOrganization::factory(), 'projectable') + ) + ->create(); + + $initiatorQuery = Engagement::initiators([ProjectInitiator::Organization->value])->get(); + expect($initiatorQuery->contains($communityOrganizationEngagement))->toBeTrue(); + expect($initiatorQuery->contains($regulatedOrganizationEngagement))->toBeFalse(); + + $initiatorQuery = Engagement::initiators([ProjectInitiator::RegulatedOrganization->value])->get(); + expect($initiatorQuery->contains($regulatedOrganizationEngagement))->toBeTrue(); + expect($initiatorQuery->contains($communityOrganizationEngagement))->toBeFalse(); + + $initiatorQuery = Engagement::initiators(array_column(ProjectInitiator::cases(), 'value'))->get(); + expect($initiatorQuery->contains($regulatedOrganizationEngagement))->toBeTrue(); + expect($initiatorQuery->contains($communityOrganizationEngagement))->toBeTrue(); + + $initiatorQuery = Engagement::initiators([])->get(); + expect($initiatorQuery->contains($regulatedOrganizationEngagement))->toBeTrue(); + expect($initiatorQuery->contains($communityOrganizationEngagement))->toBeTrue(); +}); + +test('seekingDisabilityAndDeafGroups scope', function () { + $disabilityTypeDeaf = Identity::factory()->create([ + 'name' => [ + 'en' => 'Deaf', + 'fr' => __('Deaf', [], 'fr'), + ], + 'clusters' => ['disability-and-deaf'], + ]); + $disabilityTypeDeafEngagement = Engagement::factory()->create(); + $disabilityTypeDeafEngagement->matchingStrategy->identities()->attach($disabilityTypeDeaf); + + $disabilityTypeCognitive = Identity::factory()->create([ + 'name' => [ + 'en' => 'Cognitive disabilities', + 'fr' => __('Cognitive disabilities', [], 'fr'), + ], + 'description' => [ + 'en' => 'Includes traumatic brain injury, memory difficulties, dementia', + 'fr' => __('Includes traumatic brain injury, memory difficulties, dementia', [], 'fr'), + ], + 'clusters' => ['disability-and-deaf'], + ]); + $disabilityTypeCognitiveEngagement = Engagement::factory()->create(); + $disabilityTypeCognitiveEngagement->matchingStrategy->identities()->attach($disabilityTypeCognitive); + + $seekingGroupQuery = Engagement::seekingDisabilityAndDeafGroups([$disabilityTypeDeaf->id])->get(); + expect($seekingGroupQuery->contains($disabilityTypeDeafEngagement))->toBeTrue(); + expect($seekingGroupQuery->contains($disabilityTypeCognitiveEngagement))->toBeFalse(); + + $seekingGroupQuery = Engagement::seekingDisabilityAndDeafGroups([$disabilityTypeCognitive->id])->get(); + expect($seekingGroupQuery->contains($disabilityTypeCognitiveEngagement))->toBeTrue(); + expect($seekingGroupQuery->contains($disabilityTypeDeafEngagement))->toBeFalse(); + + $seekingGroupQuery = Engagement::seekingDisabilityAndDeafGroups([$disabilityTypeDeaf->id, $disabilityTypeCognitive->id])->get(); + expect($seekingGroupQuery->contains($disabilityTypeCognitiveEngagement))->toBeTrue(); + expect($seekingGroupQuery->contains($disabilityTypeDeafEngagement))->toBeTrue(); + + $seekingGroupQuery = Engagement::seekingDisabilityAndDeafGroups([])->get(); + expect($seekingGroupQuery->contains($disabilityTypeCognitiveEngagement))->toBeTrue(); + expect($seekingGroupQuery->contains($disabilityTypeDeafEngagement))->toBeTrue(); +}); + +test('meetingTypes scope', function () { + $inPersonInterviewEngagement = Engagement::factory()->create([ + 'extra_attributes' => ['format' => 'interviews'], + 'meeting_types' => [MeetingType::InPerson->value], + ]); + + $virtualWorkshopEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'meeting_types' => [MeetingType::WebConference->value], + ])) + ->create([ + 'extra_attributes' => ['format' => 'workshop'], + 'meeting_types' => null, + ]); + + $phoneFocusGroupEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'meeting_types' => [MeetingType::Phone->value], + ])) + ->create([ + 'extra_attributes' => ['format' => 'focus-group'], + 'meeting_types' => null, + ]); + + $meetingTypeQuery = Engagement::meetingTypes([MeetingType::InPerson->value])->get(); + expect($meetingTypeQuery->contains($inPersonInterviewEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($virtualWorkshopEngagement))->toBeFalse(); + expect($meetingTypeQuery->contains($phoneFocusGroupEngagement))->toBeFalse(); + + $meetingTypeQuery = Engagement::meetingTypes([MeetingType::WebConference->value])->get(); + expect($meetingTypeQuery->contains($virtualWorkshopEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($inPersonInterviewEngagement))->toBeFalse(); + expect($meetingTypeQuery->contains($phoneFocusGroupEngagement))->toBeFalse(); + + $meetingTypeQuery = Engagement::meetingTypes([MeetingType::Phone->value])->get(); + expect($meetingTypeQuery->contains($phoneFocusGroupEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($virtualWorkshopEngagement))->toBeFalse(); + expect($meetingTypeQuery->contains($inPersonInterviewEngagement))->toBeFalse(); + + $meetingTypeQuery = Engagement::meetingTypes(array_column(MeetingType::cases(), 'value'))->get(); + expect($meetingTypeQuery->contains($inPersonInterviewEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($virtualWorkshopEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($phoneFocusGroupEngagement))->toBeTrue(); + + $meetingTypeQuery = Engagement::meetingTypes([])->get(); + expect($meetingTypeQuery->contains($inPersonInterviewEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($virtualWorkshopEngagement))->toBeTrue(); + expect($meetingTypeQuery->contains($phoneFocusGroupEngagement))->toBeTrue(); +}); + +test('compensations scope', function () { + $paidEngagement = Engagement::factory()->create(['paid' => true]); + $volunteerEngagement = Engagement::factory()->create(['paid' => false]); + + $compensationQuery = Engagement::compensations([Compensation::Paid->value])->get(); + expect($compensationQuery->contains($paidEngagement))->toBeTrue(); + expect($compensationQuery->contains($volunteerEngagement))->toBeFalse(); + + $compensationQuery = Engagement::compensations([Compensation::Volunteer->value])->get(); + expect($compensationQuery->contains($volunteerEngagement))->toBeTrue(); + expect($compensationQuery->contains($paidEngagement))->toBeFalse(); + + $compensationQuery = Engagement::compensations(array_column(Compensation::cases(), 'value'))->get(); + expect($compensationQuery->contains($volunteerEngagement))->toBeTrue(); + expect($compensationQuery->contains($paidEngagement))->toBeTrue(); + + $compensationQuery = Engagement::compensations([])->get(); + expect($compensationQuery->contains($volunteerEngagement))->toBeTrue(); + expect($compensationQuery->contains($paidEngagement))->toBeTrue(); +}); + +test('sectors scope', function () { + $privateSector = Sector::factory()->create([ + 'name' => [ + 'en' => 'Federally Regulated private sector', + 'fr' => __('Federally Regulated private sector', [], 'fr'), + ], + 'description' => [ + 'en' => 'Banks, federal transportation network (airlines, rail, road and marine transportation providers that cross provincial or international borders), atomic energy, postal and courier services, the broadcasting and telecommunications sectors', + 'fr' => __('Banks, federal transportation network (airlines, rail, road and marine transportation providers that cross provincial or international borders), atomic energy, postal and courier services, the broadcasting and telecommunications sectors', [], 'fr'), + ], + ]); + + $privateSectorEngagement = Engagement::factory()->create(); + $privateSectorEngagement->project->projectable->sectors()->attach($privateSector); + + $parliamentarySector = Sector::factory()->create([ + 'name' => [ + 'en' => 'Parliamentary entities', + 'fr' => __('Parliamentary entities', [], 'fr'), + ], + 'description' => [ + 'en' => 'House of Commons, Senate, Library of Parliament, Parliamentary Protective Service', + 'fr' => __('House of Commons, Senate, Library of Parliament, Parliamentary Protective Service', [], 'fr'), + ], + ]); + + $parliamentarySectorEngagement = Engagement::factory()->create(); + $parliamentarySectorEngagement->project->projectable->sectors()->attach($parliamentarySector); + + $sectorQuery = Engagement::sectors([$privateSector->id])->get(); + expect($sectorQuery->contains($privateSectorEngagement))->toBeTrue(); + expect($sectorQuery->contains($parliamentarySectorEngagement))->toBeFalse(); + + $sectorQuery = Engagement::sectors([$parliamentarySector->id])->get(); + expect($sectorQuery->contains($parliamentarySectorEngagement))->toBeTrue(); + expect($sectorQuery->contains($privateSectorEngagement))->toBeFalse(); + + $sectorQuery = Engagement::sectors([$privateSector->id, $parliamentarySector->id])->get(); + expect($sectorQuery->contains($privateSectorEngagement))->toBeTrue(); + expect($sectorQuery->contains($parliamentarySectorEngagement))->toBeTrue(); + + $sectorQuery = Engagement::sectors([])->get(); + expect($sectorQuery->contains($privateSectorEngagement))->toBeTrue(); + expect($sectorQuery->contains($parliamentarySectorEngagement))->toBeTrue(); +}); + +test('areas of impact scope', function () { + $employmentImpact = Impact::factory()->create([ + 'name' => [ + 'en' => 'Employment', + 'fr' => __('Employment', [], 'fr'), + ], + ]); + $employmentImpactEngagement = Engagement::factory()->create(); + $employmentImpactEngagement->project->impacts()->attach($employmentImpact); + + $communicationImpact = Impact::factory()->create([ + 'name' => [ + 'en' => 'Communications', + 'fr' => __('Communications', [], 'fr'), + ], + ]); + $communicationImpactEngagement = Engagement::factory()->create(); + $communicationImpactEngagement->project->impacts()->attach($communicationImpact); + + $impactQuery = Engagement::areasOfImpact([$employmentImpact->id])->get(); + expect($impactQuery->contains($employmentImpactEngagement))->toBeTrue(); + expect($impactQuery->contains($communicationImpactEngagement))->toBeFalse(); + + $impactQuery = Engagement::areasOfImpact([$communicationImpact->id])->get(); + expect($impactQuery->contains($communicationImpactEngagement))->toBeTrue(); + expect($impactQuery->contains($employmentImpactEngagement))->toBeFalse(); + + $impactQuery = Engagement::areasOfImpact([$employmentImpact->id, $communicationImpact->id])->get(); + expect($impactQuery->contains($employmentImpactEngagement))->toBeTrue(); + expect($impactQuery->contains($communicationImpactEngagement))->toBeTrue(); + + $impactQuery = Engagement::areasOfImpact([])->get(); + expect($impactQuery->contains($employmentImpactEngagement))->toBeTrue(); + expect($impactQuery->contains($communicationImpactEngagement))->toBeTrue(); +}); + +test('recruitment methods scope', function () { + $openCallEngagement = Engagement::factory()->create([ + 'recruitment' => EngagementRecruitment::OpenCall->value, + ]); + + $connectorEngagement = Engagement::factory()->create([ + 'recruitment' => EngagementRecruitment::CommunityConnector->value, + ]); + + $recruitmentMethodQuery = Engagement::recruitmentMethods([EngagementRecruitment::OpenCall->value])->get(); + expect($recruitmentMethodQuery->contains($openCallEngagement))->toBeTrue(); + expect($recruitmentMethodQuery->contains($connectorEngagement))->toBeFalse(); + + $recruitmentMethodQuery = Engagement::recruitmentMethods([EngagementRecruitment::CommunityConnector->value])->get(); + expect($recruitmentMethodQuery->contains($connectorEngagement))->toBeTrue(); + expect($recruitmentMethodQuery->contains($openCallEngagement))->toBeFalse(); + + $recruitmentMethodQuery = Engagement::recruitmentMethods(array_column(EngagementRecruitment::cases(), 'value'))->get(); + expect($recruitmentMethodQuery->contains($connectorEngagement))->toBeTrue(); + expect($recruitmentMethodQuery->contains($openCallEngagement))->toBeTrue(); + + $recruitmentMethodQuery = Engagement::recruitmentMethods([])->get(); + expect($recruitmentMethodQuery->contains($connectorEngagement))->toBeTrue(); + expect($recruitmentMethodQuery->contains($openCallEngagement))->toBeTrue(); +}); + +test('locations scope', function () { + $regionSpecificEngagement = Engagement::factory()->create(); + $regionSpecificEngagement->matchingStrategy->update([ + 'regions' => ['AB'], + ]); + + $locationSpecificEngagement = Engagement::factory()->create(); + $locationSpecificEngagement->matchingStrategy->update([ + 'locations' => [ + ['region' => 'AB', 'locality' => 'Edmonton'], + ['region' => 'ON', 'locality' => 'Toronto'], + ], + ]); + + $locationQuery = Engagement::locations(['AB'])->get(); + expect($locationQuery->contains($regionSpecificEngagement))->toBeTrue(); + expect($locationQuery->contains($locationSpecificEngagement))->toBeTrue(); + + $locationQuery = Engagement::locations(['ON'])->get(); + expect($locationQuery->contains($regionSpecificEngagement))->toBeFalse(); + expect($locationQuery->contains($locationSpecificEngagement))->toBeTrue(); + + $locationQuery = Engagement::locations(['AB', 'ON'])->get(); + expect($locationQuery->contains($regionSpecificEngagement))->toBeTrue(); + expect($locationQuery->contains($locationSpecificEngagement))->toBeTrue(); + + $locationQuery = Engagement::locations([])->get(); + expect($locationQuery->contains($regionSpecificEngagement))->toBeTrue(); + expect($locationQuery->contains($locationSpecificEngagement))->toBeTrue(); +}); + +test('active and complete scopes', function () { + $activeEngagements = [ + 'project open' => Engagement::factory() + ->for(Project::factory()->state([ + 'start_date' => now()->subMonth(), + 'end_date' => now()->addMonths(3), + ])) + ->create(), + 'at least one upcoming meeting' => Engagement::factory() + ->has(Meeting::factory(3)->state([ + 'date' => now()->subMonth(), + ])) + ->has(Meeting::factory()->state([ + 'date' => now()->addMonth(), + ])) + ->create(), + 'awaiting responses' => Engagement::factory() + ->create(['complete_by_date' => now()->addMonth()]), + 'interview window open' => Engagement::factory() + ->create(['complete_by_date' => now()->addMonth()]), + ]; + + $completeEngagements = [ + 'project closed' => Engagement::factory() + ->for(Project::factory()->state([ + 'start_date' => now()->subMonths(3), + 'end_date' => now()->subMonth(), + ])) + ->create(), + 'all meetings finished' => Engagement::factory() + ->has(Meeting::factory(3)->state([ + 'date' => now()->subMonth(), + ])) + ->create(), + 'responses completed' => Engagement::factory() + ->create(['complete_by_date' => now()->subMonth()]), + 'interview window closed' => Engagement::factory() + ->create(['complete_by_date' => now()->subMonth()]), + ]; + + $activeQuery = Engagement::active()->get(); + foreach ($activeEngagements as $active) { + expect($activeQuery->contains($active))->toBeTrue(); + } + foreach ($completeEngagements as $complete) { + expect($activeQuery->contains($complete))->toBeFalse(); + } + + $completeQuery = Engagement::complete()->get(); + foreach ($completeEngagements as $complete) { + expect($completeQuery->contains($complete))->toBeTrue(); + } + foreach ($activeEngagements as $active) { + expect($completeQuery->contains($active))->toBeFalse(); + } +}); + +test('Engagements I’ve joined pages redirect incomplete orgs', function () { + $user = User::factory()->create(['context' => UserContext::Organization->value]); + $redirectRoute = localized_route('organizations.show-type-selection'); + + actingAs($user)->get(localized_route('engagements.joined')) + ->assertRedirect($redirectRoute); + + actingAs($user)->get(localized_route('engagements.joined-contracted')) + ->assertRedirect($redirectRoute); + + actingAs($user)->get(localized_route('engagements.joined-participating')) + ->assertRedirect($redirectRoute); +}); + +dataset('joinedEngagementsAccessByRoles', [ + 'no roles' => [ + 'roles' => [], + 'routes' => [ + 'engagements.joined' => false, + 'engagements.joined-contracted' => false, + 'engagements.joined-participating' => false, + ], + ], + 'consultant' => [ + 'roles' => [IndividualRole::AccessibilityConsultant->value], + 'routes' => [ + 'engagements.joined' => false, + 'engagements.joined-contracted' => false, + 'engagements.joined-participating' => false, + ], + ], + 'community connector' => [ + 'roles' => [IndividualRole::CommunityConnector->value], + 'routes' => [ + 'engagements.joined' => true, + 'engagements.joined-contracted' => true, + 'engagements.joined-participating' => false, + ], + ], + 'consultation participant' => [ + 'roles' => [IndividualRole::ConsultationParticipant->value], + 'routes' => [ + 'engagements.joined' => true, + 'engagements.joined-contracted' => false, + 'engagements.joined-participating' => true, + ], + ], +]); + +dataset('joinedByEngagement', [ + 'no engagements' => [ + 'engagements' => [], + 'engagementRoutes' => [], + ], + 'active connector engagement' => [ + 'engagements' => [ + 'connector' => true, + ], + 'engagementRoutes' => [ + 'engagements.joined' => true, + 'engagements.joined-contracted' => true, + ], + ], + 'complete connector engagement' => [ + 'engagements' => [ + 'connector' => false, + ], + 'engagementRoutes' => [ + 'engagements.joined' => true, + 'engagements.joined-contracted' => true, + ], + ], + 'active participant engagement' => [ + 'engagements' => [ + 'participant' => true, + ], + 'engagementRoutes' => [ + 'engagements.joined' => true, + 'engagements.joined-participating' => true, + ], + ], + 'complete participant engagement' => [ + 'engagements' => [ + 'participant' => false, + ], + 'engagementRoutes' => [ + 'engagements.joined' => true, + 'engagements.joined-participating' => true, + ], + ], + 'all engagement types' => [ + 'engagements' => [ + 'connector' => true, + 'participant' => true, + ], + 'engagementRoutes' => [ + 'engagements.joined' => true, + 'engagements.joined-contracted' => true, + 'engagements.joined-participating' => true, + ], + ], +]); + +test('Engagements I’ve joined pages for Individuals', function ($roles, $routes, $engagements, $engagementRoutes) { + $user = User::factory()->create(); + $user->individual->roles = $roles; + + if (array_key_exists('connector', $engagements)) { + $date = $engagements['connector'] ? now()->addMonth() : now()->subMonth(); + $connectorEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + $connectorEngagement->connector()->associate($user->individual); + $connectorEngagement->save(); + } + + if (array_key_exists('participant', $engagements)) { + $date = $engagements['participant'] ? now()->addMonth() : now()->subMonth(); + $participantEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + $participantEngagement->participants()->save($user->individual, ['status' => 'confirmed', 'share_access_needs' => '0']); + } + + $mergedRoutes = array_merge($routes, $engagementRoutes); + + foreach ($mergedRoutes as $route => $shouldExist) { + if ($shouldExist) { + $response = actingAs($user)->get(localized_route($route))->assertOk(); + + if ($route === 'engagements.joined') { + expect($response['section'])->toBe($mergedRoutes['engagements.joined-participating'] ? 'participating' : 'contracted'); + } elseif ($route === 'engagements.joined-contracted') { + expect($response['title'])->toBe(__('Engagements I’ve joined as a Community Connector')); + expect($response['section'])->toBe('contracted'); + } else { + expect($response['title'])->toBe(__('Engagements I’ve joined as a Consultation Participant')); + expect($response['section'])->toBe('participating'); + } + + if ($mergedRoutes['engagements.joined-contracted']) { + $response->assertSeeText(__('Joined as a Community Connector')); + expect($response['showConnecting'])->toBeTrue(); + } else { + $response->assertDontSeeText(__('Joined as a Community Connector')); + expect($response['showConnecting'])->toBeFalse(); + } + + if ($mergedRoutes['engagements.joined-participating']) { + $response->assertSeeText(__('Joined as a Consultation Participant')); + expect($response['showParticipating'])->toBeTrue(); + } else { + $response->assertDontSeeText(__('Joined as a Consultation Participant')); + expect($response['showParticipating'])->toBeFalse(); + } + } else { + actingAs($user)->get(localized_route($route))->assertNotFound(); + } + } +}) + ->with('joinedEngagementsAccessByRoles') + ->with('joinedByEngagement'); + +test('Engagements I’ve joined pages for Organizations', function ($roles, $routes, $engagements, $engagementRoutes) { + $user = User::factory()->create(['context' => UserContext::Organization->value]); + $organization = Organization::factory() + ->hasAttached($user, ['role' => 'admin']) + ->create(['roles' => $roles]); + + if (array_key_exists('connector', $engagements)) { + $date = $engagements['connector'] ? now()->addMonth() : now()->subMonth(); + $connectorEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + $connectorEngagement->organizationalConnector()->associate($organization); + $connectorEngagement->save(); + } + + if (array_key_exists('participant', $engagements)) { + $date = $engagements['participant'] ? now()->addMonth() : now()->subMonth(); + $participantEngagement = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + $participantEngagement->organization()->associate($organization); + $participantEngagement->save(); + } + + $mergedRoutes = array_merge($routes, $engagementRoutes); + + foreach ($mergedRoutes as $route => $shouldExist) { + if ($shouldExist) { + $response = actingAs($user)->get(localized_route($route))->assertOk(); + + if ($route === 'engagements.joined') { + expect($response['section'])->toBe($mergedRoutes['engagements.joined-participating'] ? 'participating' : 'contracted'); + } elseif ($route === 'engagements.joined-contracted') { + expect($response['title'])->toBe(__('Engagements I’ve joined as a Community Connector')); + expect($response['section'])->toBe('contracted'); + } else { + expect($response['title'])->toBe(__('Engagements I’ve joined as a Consultation Participant')); + expect($response['section'])->toBe('participating'); + } + + if ($mergedRoutes['engagements.joined-contracted']) { + $response->assertSeeText(__('Joined as a Community Connector')); + expect($response['showConnecting'])->toBeTrue(); + } else { + $response->assertDontSeeText(__('Joined as a Community Connector')); + expect($response['showConnecting'])->toBeFalse(); + } + + if ($mergedRoutes['engagements.joined-participating']) { + $response->assertSeeText(__('Joined as a Consultation Participant')); + expect($response['showParticipating'])->toBeTrue(); + } else { + $response->assertDontSeeText(__('Joined as a Consultation Participant')); + expect($response['showParticipating'])->toBeFalse(); + } + } else { + actingAs($user)->get(localized_route($route))->assertNotFound(); + } + } +}) + ->with('joinedEngagementsAccessByRoles') + ->with('joinedByEngagement'); + +dataset('joinedEngagementsByRoles', [ + 'community connector' => [ + 'roles' => [IndividualRole::CommunityConnector->value], + 'routes' => [ + 'engagements.joined', + 'engagements.joined-contracted', + ], + ], + 'consultation participant' => [ + 'roles' => [IndividualRole::ConsultationParticipant->value], + 'routes' => [ + 'engagements.joined', + 'engagements.joined-participating', + ], + ], +]); + +dataset('engagementActiveStates', [ + 'no engagements' => [ + 'engagementStates' => [ + 'active' => false, + 'complete' => false, + ], + ], + 'only active' => [ + 'engagementStates' => [ + 'active' => true, + 'complete' => false, + ], + ], + 'only complete' => [ + 'engagementStates' => [ + 'active' => false, + 'complete' => true, + ], + ], + 'all engagements' => [ + 'engagementStates' => [ + 'active' => true, + 'complete' => true, + ], + ], +]); + +test('Engagements I’ve joined engagement lists for Individuals', function ($roles, $routes, $engagementStates) { + $user = User::factory()->create(); + $user->individual->roles = $roles; + + $engagements = []; + + foreach ($engagementStates as $type => $state) { + if ($state) { + $date = $type === 'active' ? now()->addMonth() : now()->subMonth(); + + $engagements[$type] = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + if (in_array(IndividualRole::ConsultationParticipant->value, $roles)) { + $engagements[$type]->participants()->save($user->individual, ['status' => 'confirmed', 'share_access_needs' => '0']); + } elseif (in_array(IndividualRole::CommunityConnector->value, $roles)) { + $engagements[$type]->connector()->associate($user->individual); + $engagements[$type]->save(); + } + } + } + + foreach ($routes as $route) { + $response = actingAs($user)->get(localized_route($route)); + $response->assertOk(); + + if ($engagementStates['active']) { + $response->assertSeeText($engagements['active']->name); + $response->assertDontSeeText(__('No projects found.')); + expect($response['activeEngagements']->contains($engagements['active']))->toBeTrue(); + } else { + $response->assertSeeText(__('No projects found.')); + expect($response['activeEngagements'])->toHaveCount(0); + } + + if ($engagementStates['complete']) { + $response->assertSeeText(__('Completed engagements')); + $response->assertSeeText($engagements['complete']->name); + expect($response['completeEngagements']->contains($engagements['complete']))->toBeTrue(); + } else { + $response->assertDontSeeText(__('Completed engagements')); + expect($response['completeEngagements'])->toHaveCount(0); + } + } +}) + ->with('joinedEngagementsByRoles') + ->with('engagementActiveStates'); + +test('Engagements I’ve joined engagement lists for Organizations', function ($roles, $routes, $engagementStates) { + $user = User::factory()->create(['context' => UserContext::Organization->value]); + $organization = Organization::factory() + ->hasAttached($user, ['role' => 'admin']) + ->create(['roles' => $roles]); + + $engagements = []; + + foreach ($engagementStates as $type => $state) { + if ($state) { + $date = $type === 'active' ? now()->addMonth() : now()->subMonth(); + + $engagements[$type] = Engagement::factory() + ->has(Meeting::factory()->state([ + 'date' => $date, + ])) + ->create(); + + if (in_array(IndividualRole::ConsultationParticipant->value, $roles)) { + $engagements[$type]->organization()->associate($organization); + } elseif (in_array(IndividualRole::CommunityConnector->value, $roles)) { + $engagements[$type]->organizationalConnector()->associate($organization); + } + $engagements[$type]->save(); + } + } + + foreach ($routes as $route) { + $response = actingAs($user)->get(localized_route($route)); + $response->assertOk(); + + if ($engagementStates['active']) { + $response->assertSeeText($engagements['active']->name); + $response->assertDontSeeText(__('No projects found.')); + expect($response['activeEngagements']->contains($engagements['active']))->toBeTrue(); + } else { + $response->assertSeeText(__('No projects found.')); + expect($response['activeEngagements'])->toHaveCount(0); + } + + if ($engagementStates['complete']) { + $response->assertSeeText(__('Completed engagements')); + $response->assertSeeText($engagements['complete']->name); + expect($response['completeEngagements']->contains($engagements['complete']))->toBeTrue(); + } else { + $response->assertDontSeeText(__('Completed engagements')); + expect($response['completeEngagements'])->toHaveCount(0); + } + } +}) + ->with('joinedEngagementsByRoles') + ->with('engagementActiveStates'); diff --git a/tests/Feature/SettingsTest.php b/tests/Feature/Filament/SettingsTest.php similarity index 69% rename from tests/Feature/SettingsTest.php rename to tests/Feature/Filament/SettingsTest.php index 1c5718ad0..462b6130d 100644 --- a/tests/Feature/SettingsTest.php +++ b/tests/Feature/Filament/SettingsTest.php @@ -1,14 +1,10 @@ <?php use App\Models\User; -use App\Settings\GeneralSettings; use function Pest\Laravel\actingAs; test('only administrative users can access the settings page', function () { - GeneralSettings::fake( - ['email' => 'support@accessibilityexchange.ca', 'individual_orientation' => ['en' => 'english link'], 'org_orientation' => ['en' => 'english link'], 'fro_orientation' => ['en' => 'english link'], 'ac_application' => ['en' => 'english link'], 'cc_application' => ['en' => 'english link']] - ); $user = User::factory()->create(); $administrator = User::factory()->create(['context' => 'administrator']); @@ -22,6 +18,7 @@ 'Contact', 'Support email', 'Support phone', + 'Privacy email', 'Mailing address', 'Social media', 'Facebook page', @@ -38,10 +35,7 @@ 'Federally regulated organization orientation', 'English', 'French', - 'Accessibility consultant application', - 'English', - 'French', - 'Community connector application', + 'Accessibility Consultant and Community Connector application', 'English', 'French', ]); diff --git a/tests/Feature/IndividualTest.php b/tests/Feature/IndividualTest.php index 331b70537..167eb30b1 100644 --- a/tests/Feature/IndividualTest.php +++ b/tests/Feature/IndividualTest.php @@ -40,8 +40,6 @@ test('individual users can select an individual role', function () { $user = User::factory()->create(); - actingAs($user)->get(localized_route('dashboard'))->assertRedirect(localized_route('individuals.show-role-selection')); - actingAs($user)->get(localized_route('individuals.show-role-selection')) ->assertOk() ->assertViewHas('defaultRoles', [IndividualRole::ConsultationParticipant->value]); @@ -1206,3 +1204,91 @@ expect($individual->isReady())->toEqual($expected); })->with('individualIsReady'); + +test('Individual getting started', function () { + $user = User::factory()->create(['oriented_at' => null]); + $individual = $user->individual; + $individual->update(['published_at' => null]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSeeInOrder([ + __('Getting started'), + __('Current step'), + __('Sign up and attend an orientation session'), + __('Next steps'), + __('Pick your role'), + ], false) + ->assertDontSee(__('Fill in your collaboration preferences'), false) + ->assertDontSee(__('Fill out and return your application'), false) + ->assertDontSee(__('Create a public page'), false) + ->assertDontSee(__('Completed steps'), false); + + $user->update(['oriented_at' => now()]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSeeInOrder([ + __('Getting started'), + __('Current step'), + __('Pick your role'), + __('Next steps'), + __('This will show up once you pick your role.'), + __('Completed steps'), + __('Sign up and attend an orientation session'), + ], false) + ->assertDontSee(__('Fill in your collaboration preferences'), false) + ->assertDontSee(__('Fill out and return your application'), false) + ->assertDontSee(__('Create a public page'), false) + ->assertDontSee(__('Edit roles'), false); + + $individual->update(['roles' => [IndividualRole::ConsultationParticipant->value]]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSeeInOrder([ + __('Edit roles'), + __('Getting started'), + __('Current step'), + __('Fill in your collaboration preferences'), + __('Next steps'), + __('There are no next steps. After this you’ll be able to sign up for engagements!'), + __('Completed steps'), + __('Sign up and attend an orientation session'), + __('Pick your role'), + ], false) + ->assertDontSee(__('This will show up once you pick your role.'), false) + ->assertDontSee(__('Fill out and return your application'), false) + ->assertDontSee(__('Create a public page'), false); + + $individual->update(['other_payment_type' => 'other']); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Getting started'), false); + + $individual->update(['roles' => [IndividualRole::CommunityConnector->value]]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertSeeInOrder([ + __('Getting started'), + __('Current step'), + __('Fill out and return your application'), + __('Create a public page'), + __('Next steps'), + __('There are no next steps. After this you’ll be able to sign up for engagements!'), + __('Completed steps'), + __('Sign up and attend an orientation session'), + __('Pick your role'), + ], false) + ->assertDontSee(__('Fill in your collaboration preferences'), false) + ->assertDontSee(__('This will show up once you pick your role.'), false); + + $individual->update(['published_at' => now()]); + + actingAs($user)->get(localized_route('dashboard')) + ->assertOk() + ->assertDontSee(__('Getting started'), false); + +}); diff --git a/tests/Feature/Livewire/AllProjectsTest.php b/tests/Feature/Livewire/AllProjectsTest.php deleted file mode 100644 index 3fad1fa95..000000000 --- a/tests/Feature/Livewire/AllProjectsTest.php +++ /dev/null @@ -1,476 +0,0 @@ -<?php - -use App\Livewire\AllProjects; -use App\Models\Engagement; -use App\Models\Identity; -use App\Models\Impact; -use App\Models\MatchingStrategy; -use App\Models\Meeting; -use App\Models\Organization; -use App\Models\Project; -use App\Models\RegulatedOrganization; -use App\Models\Sector; -use Carbon\Carbon; -use Database\Seeders\IdentitySeeder; -use Database\Seeders\ImpactSeeder; -use Database\Seeders\SectorSeeder; - -use function Pest\Laravel\seed; -use function Pest\Livewire\livewire; - -test('test searchQuery property change', function () { - $sampleProjectName = 'Sample Project'; - Project::factory()->create(['name->en' => $sampleProjectName]); - $allProjects = livewire(AllProjects::class, ['searchQuery' => '']) - ->assertSee($sampleProjectName) - ->set('searchQuery', 'Test') - ->assertDontSee($sampleProjectName) - ->set('searchQuery', 'Sample') - ->assertSee($sampleProjectName) - ->set('searchQuery', 'sample') - ->assertSee($sampleProjectName); -}); - -test('test statuses property change', function () { - $upComingProjectName = 'Upcoming Project'; - $inProgressProjectName = 'In progress Project'; - $completedProjectName = 'Completed Project'; - Project::factory()->create([ - 'name->en' => $upComingProjectName, - 'start_date' => Carbon::now()->addDays(5), - ]); - - Project::factory()->create([ - 'name->en' => $inProgressProjectName, - 'start_date' => Carbon::now()->subDays(5), - 'end_date' => Carbon::now()->addDays(5), - ]); - - Project::factory()->create([ - 'name->en' => $completedProjectName, - 'end_date' => Carbon::now()->subDays(5), - ]); - - $allProjects = livewire(AllProjects::class, ['statuses' => []]); - $allProjects->assertSee($upComingProjectName); - $allProjects->assertSee($inProgressProjectName); - $allProjects->assertSee($completedProjectName); - - $allProjects->set('statuses', ['upcoming']); - $allProjects->assertSee($upComingProjectName); - $allProjects->assertDontSee($inProgressProjectName); - $allProjects->assertDontSee($completedProjectName); - - $allProjects->set('statuses', ['inProgress']); - $allProjects->assertDontSee($upComingProjectName); - $allProjects->assertSee($inProgressProjectName); - $allProjects->assertDontSee($completedProjectName); - - $allProjects->set('statuses', ['completed']); - $allProjects->assertDontSee($upComingProjectName); - $allProjects->assertDontSee($inProgressProjectName); - $allProjects->assertSee($completedProjectName); - - $allProjects->set('statuses', ['upcoming', 'inProgress', 'completed']); - $allProjects->assertSee($upComingProjectName); - $allProjects->assertSee($inProgressProjectName); - $allProjects->assertSee($completedProjectName); -}); - -test('test seekings property change', function () { - $projectSeekingParticipantsName = 'Project Seeking Participants'; - $projectSeekingParticipants = Project::factory()->create([ - 'name->en' => $projectSeekingParticipantsName, - ]); - - $openCallEngagement = Engagement::factory()->create([ - 'recruitment' => 'open-call', - 'project_id' => $projectSeekingParticipants->id, - ]); - - $projectSeekingConnectorsName = 'Project Seeking Connectors'; - $projectSeekingConnectors = Project::factory()->create([ - 'name->en' => $projectSeekingConnectorsName, - ]); - - $connectorEngagement = Engagement::factory()->create([ - 'recruitment' => 'connector', - 'project_id' => $projectSeekingConnectors->id, - 'extra_attributes' => ['seeking_community_connector' => true], - ]); - - $projectSeekingOrganizationsName = 'Project Seeking Organizations'; - $projectSeekingOrganizations = Project::factory()->create([ - 'name->en' => $projectSeekingOrganizationsName, - ]); - - $organizationEngagement = Engagement::factory()->create([ - 'recruitment' => 'connector', - 'who' => 'organization', - 'project_id' => $projectSeekingOrganizations->id, - ]); - - $allProjects = livewire(AllProjects::class, ['seekings' => []]); - $allProjects->assertSee($projectSeekingParticipantsName); - $allProjects->assertSee($projectSeekingConnectorsName); - $allProjects->assertSee($projectSeekingOrganizationsName); - - $allProjects->set('seekings', ['participants']); - $allProjects->assertSee($projectSeekingParticipantsName); - $allProjects->assertDontSee($projectSeekingConnectorsName); - $allProjects->assertDontSee($projectSeekingOrganizationsName); - - $allProjects->set('seekings', ['connectors']); - $allProjects->assertDontSee($projectSeekingParticipantsName); - $allProjects->assertSee($projectSeekingConnectorsName); - $allProjects->assertDontSee($projectSeekingOrganizationsName); - - $allProjects->set('seekings', ['organizations']); - $allProjects->assertDontSee($projectSeekingParticipantsName); - $allProjects->assertDontSee($projectSeekingConnectorsName); - $allProjects->assertSee($projectSeekingOrganizationsName); - - $allProjects->set('seekings', ['participants', 'connectors', 'organizations']); - $allProjects->assertSee($projectSeekingParticipantsName); - $allProjects->assertSee($projectSeekingConnectorsName); - $allProjects->assertSee($projectSeekingOrganizationsName); -}); - -test('test initiators property change', function () { - $communityOrganization = Organization::factory()->create(); - $communityOrganizationProjectName = 'Community Organization Project'; - $communityOrganizationProject = Project::factory()->create([ - 'projectable_id' => $communityOrganization->id, - 'name->en' => $communityOrganizationProjectName, - 'projectable_type' => 'App\Models\Organization', - ]); - - $regulatedOrganization = RegulatedOrganization::factory()->create(); - $regulatedOrganizationProjectName = 'Regulated Organization Project'; - $regulatedOrganizationProject = Project::factory()->create([ - 'projectable_id' => $regulatedOrganization->id, - 'name->en' => $regulatedOrganizationProjectName, - 'projectable_type' => 'App\Models\RegulatedOrganization', - ]); - - $allProjects = livewire(AllProjects::class, ['initiators' => []]); - $allProjects->assertSee($communityOrganizationProjectName); - $allProjects->assertSee($regulatedOrganizationProjectName); - - $allProjects->set('initiators', ['organization']); - $allProjects->assertSee($communityOrganizationProjectName); - $allProjects->assertDontSee($regulatedOrganizationProjectName); - - $allProjects->set('initiators', ['regulatedOrganization']); - $allProjects->assertDontSee($communityOrganizationProjectName); - $allProjects->assertSee($regulatedOrganizationProjectName); - - $allProjects->set('initiators', ['organization', 'regulatedOrganization']); - $allProjects->assertSee($communityOrganizationProjectName); - $allProjects->assertSee($regulatedOrganizationProjectName); -}); - -test('test seekingGroups property change', function () { - seed(IdentitySeeder::class); - - $disabilityTypeDeaf = Identity::where('name->en', 'Deaf')->first(); - $projectSeekingDeafExperienceName = 'Project Seeking Deaf Experience'; - $projectSeekingDeafExperience = Project::factory()->create([ - 'name->en' => $projectSeekingDeafExperienceName, - ]); - $engagementSeekingDeafExperience = Engagement::factory()->create(['project_id' => $projectSeekingDeafExperience->id]); - $matchingStrategySeekingDeafExperience = MatchingStrategy::factory()->create([ - 'matchable_type' => 'App\Models\Engagement', - 'matchable_id' => $engagementSeekingDeafExperience->id, - ]); - $matchingStrategySeekingDeafExperience->identities()->attach($disabilityTypeDeaf->id); - - $disabilityTypeCognitive = Identity::where('name->en', 'Cognitive disabilities')->first(); - $projectSeekingCognitiveDisabilityExperienceName = 'Project Seeking Cognitive Disability Experience'; - $projectSeekingCognitiveDisabilityExperience = Project::factory()->create([ - 'name->en' => $projectSeekingCognitiveDisabilityExperienceName, - ]); - $engagementSeekingCognitiveDisabilityExperience = Engagement::factory()->create(['project_id' => $projectSeekingCognitiveDisabilityExperience->id]); - $matchingStrategySeekingCognitiveDisabilityExperience = MatchingStrategy::factory()->create([ - 'matchable_type' => 'App\Models\Engagement', - 'matchable_id' => $engagementSeekingCognitiveDisabilityExperience->id, - ]); - $matchingStrategySeekingCognitiveDisabilityExperience->identities()->attach($disabilityTypeCognitive->id); - - $allProjects = livewire(AllProjects::class, ['seekingGroups' => []]); - $allProjects->assertSee($projectSeekingDeafExperienceName); - $allProjects->assertSee($projectSeekingCognitiveDisabilityExperienceName); - - $allProjects->set('seekingGroups', [$disabilityTypeDeaf->id]); - $allProjects->assertSee($projectSeekingDeafExperienceName); - $allProjects->assertDontSee($projectSeekingCognitiveDisabilityExperienceName); - - $allProjects->set('seekingGroups', [$disabilityTypeCognitive->id]); - $allProjects->assertDontSee($projectSeekingDeafExperienceName); - $allProjects->assertSee($projectSeekingCognitiveDisabilityExperienceName); - - $allProjects->set('seekingGroups', [$disabilityTypeDeaf->id, $disabilityTypeCognitive->id]); - $allProjects->assertSee($projectSeekingDeafExperienceName); - $allProjects->assertSee($projectSeekingCognitiveDisabilityExperienceName); -}); - -test('test meetingTypes property change', function () { - $inpersonInterviewProjectName = 'In person Interview Project'; - $inpersonInterviewProject = Project::factory()->create([ - 'name->en' => $inpersonInterviewProjectName, - ]); - $inPersonInterviewEngagement = Engagement::factory()->create([ - 'project_id' => $inpersonInterviewProject->id, - 'extra_attributes' => ['format' => 'interviews'], - 'meeting_types' => 'in_person', - ]); - - $virtualWorkshopProjectName = 'Virtual Workshop Project'; - $virtualWorkshopProject = Project::factory()->create([ - 'name->en' => $virtualWorkshopProjectName, - ]); - $virtualWorkshopEngagement = Engagement::factory()->create([ - 'project_id' => $virtualWorkshopProject->id, - 'extra_attributes' => ['format' => 'workshop'], - 'meeting_types' => null, - ]); - $virtualWorkshopMeeting = Meeting::factory()->create([ - 'engagement_id' => $virtualWorkshopEngagement->id, - 'meeting_types' => 'web_conference', - ]); - - $phoneFocusGroupProjectName = 'Phone Focus Group Project'; - $phoneFocusGroupProject = Project::factory()->create([ - 'name->en' => $phoneFocusGroupProjectName, - ]); - $phoneFocusGroupEngagement = Engagement::factory()->create([ - 'project_id' => $phoneFocusGroupProject->id, - 'extra_attributes' => ['format' => 'focus-group'], - 'meeting_types' => null, - ]); - $phoneFocusGroupMeeting = Meeting::factory()->create([ - 'engagement_id' => $phoneFocusGroupEngagement->id, - 'meeting_types' => 'phone', - ]); - - $allProjects = livewire(AllProjects::class, ['meetingTypes' => []]); - $allProjects->assertSee($inpersonInterviewProjectName); - $allProjects->assertSee($virtualWorkshopProjectName); - $allProjects->assertSee($phoneFocusGroupProjectName); - - $allProjects->set('meetingTypes', ['in_person']); - $allProjects->assertSee($inpersonInterviewProjectName); - $allProjects->assertDontSee($virtualWorkshopProjectName); - $allProjects->assertDontSee($phoneFocusGroupProjectName); - - $allProjects->set('meetingTypes', ['web_conference']); - $allProjects->assertDontSee($inpersonInterviewProjectName); - $allProjects->assertSee($virtualWorkshopProjectName); - $allProjects->assertDontSee($phoneFocusGroupProjectName); - - $allProjects->set('meetingTypes', ['phone']); - $allProjects->assertDontSee($inpersonInterviewProjectName); - $allProjects->assertDontSee($virtualWorkshopProjectName); - $allProjects->assertSee($phoneFocusGroupProjectName); - - $allProjects->set('meetingTypes', ['in_person', 'web_conference', 'phone']); - $allProjects->assertSee($inpersonInterviewProjectName); - $allProjects->assertSee($virtualWorkshopProjectName); - $allProjects->assertSee($phoneFocusGroupProjectName); -}); - -test('test compensations property change', function () { - $paidProjectName = 'Paied Project'; - $paidProject = Project::factory()->create([ - 'name->en' => $paidProjectName, - ]); - $paidEngagement = Engagement::factory()->create(['project_id' => $paidProject->id, 'paid' => true]); - - $volunteerProjectName = 'Volunteer Project'; - $volunteerProject = Project::factory()->create([ - 'name->en' => $volunteerProjectName, - ]); - $volunteerEngagement = Engagement::factory()->create(['project_id' => $volunteerProject->id, 'paid' => false]); - - $allProjects = livewire(AllProjects::class, ['compensations' => []]); - $allProjects->assertSee($paidProjectName); - $allProjects->assertSee($volunteerProjectName); - - $allProjects->set('compensations', ['paid']); - $allProjects->assertSee($paidProjectName); - $allProjects->assertDontSee($volunteerProjectName); - - $allProjects->set('compensations', ['volunteer']); - $allProjects->assertDontSee($paidProjectName); - $allProjects->assertSee($volunteerProjectName); - - $allProjects->set('compensations', ['paid', 'volunteer']); - $allProjects->assertSee($paidProjectName); - $allProjects->assertSee($volunteerProjectName); -}); - -test('test sectors property change', function () { - seed(SectorSeeder::class); - $regulatedPrivateSector = Sector::where('name->en', 'Federally Regulated private sector')->first(); - $privateRegulatedOrganization = RegulatedOrganization::factory()->create(); - $privateRegulatedOrganization->sectors()->save($regulatedPrivateSector); - $regulatedPrivateProjectName = 'Regulated Private Sector Project'; - $regulatedPrivateProject = Project::factory()->create([ - 'name->en' => $regulatedPrivateProjectName, - 'projectable_id' => $privateRegulatedOrganization->id, - ]); - - $parliamentarySector = Sector::where('name->en', 'Parliamentary entities')->first(); - $parliamentaryOrganization = RegulatedOrganization::factory()->create(); - $parliamentaryOrganization->sectors()->save($parliamentarySector); - $parliamentaryProjectName = 'Parliamentary Project'; - $parliamentaryProject = Project::factory()->create([ - 'name->en' => $parliamentaryProjectName, - 'projectable_id' => $parliamentaryOrganization->id, - ]); - - $allProjects = livewire(AllProjects::class, ['sectors' => []]); - $allProjects->assertSee($regulatedPrivateProjectName); - $allProjects->assertSee($parliamentaryProjectName); - - $allProjects->set('sectors', [$regulatedPrivateSector->id]); - $allProjects->assertSee($regulatedPrivateProjectName); - $allProjects->assertDontSee($parliamentaryProjectName); - - $allProjects->set('sectors', [$parliamentarySector->id]); - $allProjects->assertDontSee($regulatedPrivateProjectName); - $allProjects->assertSee($parliamentaryProjectName); - - $allProjects->set('sectors', [$regulatedPrivateSector->id, $parliamentarySector->id]); - $allProjects->assertSee($regulatedPrivateProjectName); - $allProjects->assertSee($parliamentaryProjectName); -}); - -test('test impacts property change', function () { - seed(ImpactSeeder::class); - $employmentImpact = Impact::where('name->en', 'Employment')->first(); - $employmentImpactProjectName = 'Employment Impact Project'; - $employmentImpactProject = Project::factory()->create([ - 'name->en' => $employmentImpactProjectName, - ]); - $employmentImpactProject->impacts()->attach($employmentImpact->id); - - $communicationImpact = Impact::where('name->en', 'Communications')->first(); - $communicationImpactProjectName = 'Communication Imapct Project'; - $communicationImpactProject = Project::factory()->create([ - 'name->en' => $communicationImpactProjectName, - ]); - $communicationImpactProject->impacts()->attach($communicationImpact->id); - - $allProjects = livewire(AllProjects::class, ['impacts' => []]); - $allProjects->assertSee($employmentImpactProjectName); - $allProjects->assertSee($communicationImpactProjectName); - - $allProjects->set('impacts', [$employmentImpact->id]); - $allProjects->assertSee($employmentImpactProjectName); - $allProjects->assertDontSee($communicationImpactProjectName); - - $allProjects->set('impacts', [$communicationImpact->id]); - $allProjects->assertDontSee($employmentImpactProjectName); - $allProjects->assertSee($communicationImpactProjectName); - - $allProjects->set('impacts', [$employmentImpact->id, $communicationImpact->id]); - $allProjects->assertSee($employmentImpactProjectName); - $allProjects->assertSee($communicationImpactProjectName); -}); - -test('test recruitmentMethods property change', function () { - $openCallProjectName = 'Open Call Project'; - $openCallProject = Project::factory()->create([ - 'name->en' => $openCallProjectName, - ]); - $openCallEngagement = Engagement::factory()->create(['project_id' => $openCallProject->id, 'recruitment' => 'open-call']); - - $connectorProjectName = 'Connector Project'; - $connectorProject = Project::factory()->create([ - 'name->en' => $connectorProjectName, - ]); - $connectorEngagement = Engagement::factory()->create(['project_id' => $connectorProject->id, 'recruitment' => 'connector']); - - $allProjects = livewire(AllProjects::class, ['recruitmentMethods' => []]); - $allProjects->assertSee($openCallProjectName); - $allProjects->assertSee($connectorProjectName); - - $allProjects->set('recruitmentMethods', ['open-call']); - $allProjects->assertSee($openCallProjectName); - $allProjects->assertDontSee($connectorProjectName); - - $allProjects->set('recruitmentMethods', ['connector']); - $allProjects->assertDontSee($openCallProjectName); - $allProjects->assertSee($connectorProjectName); - - $allProjects->set('recruitmentMethods', ['open-call', 'connector']); - $allProjects->assertSee($openCallProjectName); - $allProjects->assertSee($connectorProjectName); -}); - -test('test locations property change', function () { - $regionSpecificProjectName = 'Region Specific Project'; - $regionSpecificProject = Project::factory()->create([ - 'name->en' => $regionSpecificProjectName, - ]); - $regionSpecificEngagement = Engagement::factory()->create(['project_id' => $regionSpecificProject->id]); - $regionSpecificMatchingStrategy = $regionSpecificEngagement->matchingStrategy; - $regionSpecificMatchingStrategy->update([ - 'regions' => ['AB'], - ]); - - $locationSpecificProjectName = 'Location Specific Project'; - $locationSpecificProject = Project::factory()->create([ - 'name->en' => $locationSpecificProjectName, - ]); - $locationSpecificEngagement = Engagement::factory()->create(['project_id' => $locationSpecificProject->id]); - $locationSpecificMatchingStrategy = $locationSpecificEngagement->matchingStrategy; - $locationSpecificMatchingStrategy->update([ - 'locations' => [ - ['region' => 'AB', 'locality' => 'Edmonton'], - ['region' => 'ON', 'locality' => 'Toronto'], - ], - ]); - - $allProjects = livewire(AllProjects::class, ['locations' => []]); - $allProjects->assertSee($regionSpecificProjectName); - $allProjects->assertSee($locationSpecificProjectName); - - $allProjects->set('locations', ['AB']); - $allProjects->assertSee($regionSpecificProjectName); - $allProjects->assertSee($locationSpecificProjectName); - - $allProjects->set('locations', ['ON']); - $allProjects->assertDontSee($regionSpecificProjectName); - $allProjects->assertSee($locationSpecificProjectName); - - $allProjects->set('locations', ['AB', 'ON']); - $allProjects->assertSee($regionSpecificProjectName); - $allProjects->assertSee($locationSpecificProjectName); -}); - -test('test selectNone', function () { - $upComingProjectName = 'Upcoming Project'; - $upComingProject = Project::factory()->create([ - 'name->en' => $upComingProjectName, - 'start_date' => Carbon::now()->addDays(5), - ]); - $connectorEngagement = Engagement::factory()->create(['project_id' => $upComingProject->id, 'recruitment' => 'connector']); - - $openCallProjectName = 'Open Call Project'; - $openCallProject = Project::factory()->create([ - 'name->en' => $openCallProjectName, - 'start_date' => Carbon::now()->subDays(5), - 'end_date' => Carbon::now()->addDays(5), - ]); - $openCallEngagement = Engagement::factory()->create(['project_id' => $openCallProject->id, 'recruitment' => 'open-call']); - - $allProjects = livewire(AllProjects::class, ['statuses' => ['upcoming'], 'recruitmentMethods' => ['connector']]); - $allProjects->assertSee($upComingProjectName); - $allProjects->assertDontSee($openCallProjectName); - - $allProjects->call('selectNone'); - $allProjects->assertSee($upComingProjectName); - $allProjects->assertSee($openCallProjectName); -}); diff --git a/tests/Feature/Livewire/BrowseEngagementsTest.php b/tests/Feature/Livewire/BrowseEngagementsTest.php new file mode 100644 index 000000000..b826e3e42 --- /dev/null +++ b/tests/Feature/Livewire/BrowseEngagementsTest.php @@ -0,0 +1,539 @@ +<?php + +use App\Enums\Compensation; +use App\Enums\EngagementRecruitment; +use App\Enums\EngagementSignUpStatus; +use App\Enums\MeetingType; +use App\Enums\ProjectInitiator; +use App\Enums\SeekingForEngagement; +use App\Livewire\BrowseEngagements; +use App\Models\Engagement; +use App\Models\Identity; +use App\Models\Impact; +use App\Models\MatchingStrategy; +use App\Models\Meeting; +use App\Models\Project; +use App\Models\RegulatedOrganization; +use App\Models\User; +use Carbon\Carbon; +use Illuminate\Support\Str; + +use function Pest\Livewire\livewire; + +test('searchQuery property change', function () { + $engagementName = 'Sample Engagement'; + $engagement = Engagement::factory()->create(['name->en' => $engagementName]); + $engagement->loadMissing('project.projectable'); + + $this->actingAs(User::factory()->create()); + livewire(BrowseEngagements::class, ['searchQuery' => '']) + ->assertSee($engagementName) + ->set('searchQuery', 'Test') + ->assertDontSee($engagementName) + ->set('searchQuery', 'Sample') + ->assertSee($engagementName) + ->set('searchQuery', 'sample') + ->assertSee($engagementName) + ->set('searchQuery', "{$engagement->project->projectable->name}-test") + ->assertDontSee($engagementName) + ->set('searchQuery', $engagement->project->projectable->name) + ->assertSee($engagementName); +}); + +test('sign up/statuses property change', function () { + $openEngagementName = 'Open Engagement'; + $closedEngagementName = 'Closed Engagement'; + $noSignUpDateEngagement = 'No Sign Up Date Engagement'; + + Engagement::factory()->create([ + 'name->en' => $openEngagementName, + 'signup_by_date' => Carbon::now()->addDays(5), + ]); + + Engagement::factory()->create([ + 'name->en' => $closedEngagementName, + 'signup_by_date' => Carbon::now()->subDays(5), + ]); + + Engagement::factory()->create([ + 'name->en' => $noSignUpDateEngagement, + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['statuses' => []]); + $engagements->assertSee($openEngagementName); + $engagements->assertSee($closedEngagementName); + $engagements->assertSee($noSignUpDateEngagement); + + $engagements->set('statuses', [EngagementSignUpStatus::Open->value]); + $engagements->assertSee($openEngagementName); + $engagements->assertDontSee($closedEngagementName); + $engagements->assertDontSee($noSignUpDateEngagement); + + $engagements->set('statuses', [EngagementSignUpStatus::Closed->value]); + $engagements->assertDontSee($openEngagementName); + $engagements->assertSee($closedEngagementName); + $engagements->assertDontSee($noSignUpDateEngagement); + + $engagements->set('statuses', array_column(EngagementSignUpStatus::cases(), 'value')); + $engagements->assertSee($openEngagementName); + $engagements->assertSee($closedEngagementName); + $engagements->assertDontSee($noSignUpDateEngagement); +}); + +test('format property change', function (array $filter = [], array $toSee = [], array $dontSee = []) { + foreach (array_merge($toSee, $dontSee) as $format => $name) { + Engagement::factory()->create([ + 'name' => $name, + 'format' => $format, + ]); + } + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['formats' => $filter]); + + foreach ($toSee as $engagementToSee) { + $engagements->assertSee($engagementToSee); + } + + foreach ($dontSee as $engagementDontSee) { + $engagements->assertDontSee($engagementDontSee); + } +})->with('browseEngagementsFormat'); + +test('seekings property change', function () { + $seekings = array_column(SeekingForEngagement::cases(), 'value'); + + Engagement::factory()->create([ + 'name->en' => SeekingForEngagement::Participants->value.' - Engagement', + 'recruitment' => 'open-call', + ]); + + Engagement::factory()->create([ + 'name->en' => SeekingForEngagement::Connectors->value.' - Engagement', + 'recruitment' => 'connector', + 'extra_attributes' => ['seeking_community_connector' => true], + ]); + + Engagement::factory()->create([ + 'name->en' => SeekingForEngagement::Organizations->value.' - Engagement', + 'recruitment' => 'connector', + 'who' => 'organization', + ]); + + // Ensure all engagements are shown when no seekings specified + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['seekings' => []]); + + foreach ($seekings as $seeking) { + $engagements->assertSee("{$seeking} - Engagement"); + } + + // Ensure only the engagement for the requested seeking is returned + foreach ($seekings as $seeking) { + $engagements->set('seekings', [$seeking]); + + $engagements->assertSee("{$seeking} - Engagement"); + + foreach ($seekings as $otherSeeking) { + if ($otherSeeking !== $seeking) { + $engagements->assertDontSee("{$otherSeeking} - Engagement"); + } + } + } + + // Ensure all engagements are shown when all seekings specified + $engagements->set('seekings', $seekings); + + foreach ($seekings as $seeking) { + $engagements->assertSee("{$seeking} - Engagement"); + } +}); + +test('initiators property change', function () { + foreach (ProjectInitiator::labels() as $initiator => $label) { + $initiator = 'App\Models\\'.Str::studly($initiator); + Engagement::factory() + ->for( + Project::factory() + ->for($initiator::factory(), 'projectable') + ) + ->create(['name->en' => $label.' - Engagement']); + } + + $communityOrganizationEngagementName = ProjectInitiator::labels()[ProjectInitiator::Organization->value].' - Engagement'; + $regulatedOrganizationEngagementName = ProjectInitiator::labels()[ProjectInitiator::RegulatedOrganization->value].' - Engagement'; + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['initiators' => []]); + $engagements->assertSee($communityOrganizationEngagementName); + $engagements->assertSee($regulatedOrganizationEngagementName); + + $engagements->set('initiators', [ProjectInitiator::Organization->value]); + $engagements->assertSee($communityOrganizationEngagementName); + $engagements->assertDontSee($regulatedOrganizationEngagementName); + + $engagements->set('initiators', [ProjectInitiator::RegulatedOrganization->value]); + $engagements->assertDontSee($communityOrganizationEngagementName); + $engagements->assertSee($regulatedOrganizationEngagementName); + + $engagements->set('initiators', array_column(ProjectInitiator::cases(), 'value')); + $engagements->assertSee($communityOrganizationEngagementName); + $engagements->assertSee($regulatedOrganizationEngagementName); +}); + +test('seekingGroups property change', function () { + $engagementSeekingDeafExperienceName = 'Engagement Seeking Deaf Experience'; + + $disabilityTypeDeafMatchingStrategy = MatchingStrategy::factory() + ->for(Engagement::factory()->state([ + 'name' => $engagementSeekingDeafExperienceName, + ]), 'matchable') + ->has(Identity::factory()->state([ + 'name' => [ + 'en' => 'Deaf', + 'fr' => __('Deaf', [], 'fr'), + ], + 'clusters' => ['disability-and-deaf'], + ]) + ) + ->create(); + + $engagementSeekingCognitiveDisabilityExperienceName = 'Engagement Seeking Cognitive Disability Experience'; + + $disabilityTypeCognitiveMatchingStrategy = MatchingStrategy::factory() + ->for(Engagement::factory()->state([ + 'name' => $engagementSeekingCognitiveDisabilityExperienceName, + ]), 'matchable') + ->has( + Identity::factory()->state([ + 'name' => [ + 'en' => 'Cognitive disabilities', + 'fr' => __('Cognitive disabilities', [], 'fr'), + ], + 'description' => [ + 'en' => 'Includes traumatic brain injury, memory difficulties, dementia', + 'fr' => __('Includes traumatic brain injury, memory difficulties, dementia', [], 'fr'), + ], + 'clusters' => ['disability-and-deaf'], + ]) + ) + ->create(); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['seekingGroups' => []]); + $engagements->assertSee($engagementSeekingDeafExperienceName); + $engagements->assertSee($engagementSeekingCognitiveDisabilityExperienceName); + + $engagements->set('seekingGroups', [$disabilityTypeDeafMatchingStrategy->identities()->first()->id]); + $engagements->assertSee($engagementSeekingDeafExperienceName); + $engagements->assertDontSee($engagementSeekingCognitiveDisabilityExperienceName); + + $engagements->set('seekingGroups', [$disabilityTypeCognitiveMatchingStrategy->identities()->first()->id]); + $engagements->assertDontSee($engagementSeekingDeafExperienceName); + $engagements->assertSee($engagementSeekingCognitiveDisabilityExperienceName); + + $engagements->set('seekingGroups', [$disabilityTypeDeafMatchingStrategy->identities()->first()->id, $disabilityTypeCognitiveMatchingStrategy->identities()->first()->id]); + $engagements->assertSee($engagementSeekingDeafExperienceName); + $engagements->assertSee($engagementSeekingCognitiveDisabilityExperienceName); +}); + +test('meetingTypes property change', function () { + $inPersonInterviewEngagementName = 'In person Interview'; + Engagement::factory()->create([ + 'name' => $inPersonInterviewEngagementName, + 'extra_attributes' => ['format' => 'interviews'], + 'meeting_types' => [MeetingType::InPerson->value], + ]); + + $virtualWorkshopEngagementName = 'Virtual Workshop'; + Engagement::factory() + ->has(Meeting::factory()->state([ + 'meeting_types' => [MeetingType::WebConference->value], + ])) + ->create([ + 'name' => $virtualWorkshopEngagementName, + 'extra_attributes' => ['format' => 'workshop'], + 'meeting_types' => null, + ]); + + $phoneFocusGroupEngagementName = 'Phone Focus Group'; + Engagement::factory() + ->has(Meeting::factory()->state([ + 'meeting_types' => [MeetingType::Phone->value], + ])) + ->create([ + 'name' => $phoneFocusGroupEngagementName, + 'extra_attributes' => ['format' => 'focus-group'], + 'meeting_types' => null, + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['meetingTypes' => []]); + $engagements->assertSee($inPersonInterviewEngagementName); + $engagements->assertSee($virtualWorkshopEngagementName); + $engagements->assertSee($phoneFocusGroupEngagementName); + + $engagements->set('meetingTypes', [MeetingType::InPerson->value]); + $engagements->assertSee($inPersonInterviewEngagementName); + $engagements->assertDontSee($virtualWorkshopEngagementName); + $engagements->assertDontSee($phoneFocusGroupEngagementName); + + $engagements->set('meetingTypes', [MeetingType::WebConference->value]); + $engagements->assertDontSee($inPersonInterviewEngagementName); + $engagements->assertSee($virtualWorkshopEngagementName); + $engagements->assertDontSee($phoneFocusGroupEngagementName); + + $engagements->set('meetingTypes', [MeetingType::Phone->value]); + $engagements->assertDontSee($inPersonInterviewEngagementName); + $engagements->assertDontSee($virtualWorkshopEngagementName); + $engagements->assertSee($phoneFocusGroupEngagementName); + + $engagements->set('meetingTypes', array_column(MeetingType::cases(), 'value')); + $engagements->assertSee($inPersonInterviewEngagementName); + $engagements->assertSee($virtualWorkshopEngagementName); + $engagements->assertSee($phoneFocusGroupEngagementName); +}); + +test('compensations property change', function () { + $paidEngagementName = 'Paid Engagement'; + Engagement::factory()->create([ + 'name' => $paidEngagementName, + 'paid' => true, + ]); + + $volunteerEngagementName = 'Volunteer Engagement'; + Engagement::factory()->create([ + 'name' => $volunteerEngagementName, + 'paid' => false, + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['compensations' => []]); + $engagements->assertSee($paidEngagementName); + $engagements->assertSee($volunteerEngagementName); + + $engagements->set('compensations', [Compensation::Paid->value]); + $engagements->assertSee($paidEngagementName); + $engagements->assertDontSee($volunteerEngagementName); + + $engagements->set('compensations', [Compensation::Volunteer->value]); + $engagements->assertDontSee($paidEngagementName); + $engagements->assertSee($volunteerEngagementName); + + $engagements->set('compensations', array_column(Compensation::cases(), 'value')); + $engagements->assertSee($paidEngagementName); + $engagements->assertSee($volunteerEngagementName); +}); + +test('sectors property change', function () { + $regulatedPrivateEngagementName = 'Regulated Private Sector Engagement'; + $private = RegulatedOrganization::factory() + ->hasSectors(1, [ + 'name' => [ + 'en' => 'Federally Regulated private sector', + 'fr' => __('Federally Regulated private sector', [], 'fr'), + ], + 'description' => [ + 'en' => 'Banks, federal transportation network (airlines, rail, road and marine transportation providers that cross provincial or international borders), atomic energy, postal and courier services, the broadcasting and telecommunications sectors', + 'fr' => __('Banks, federal transportation network (airlines, rail, road and marine transportation providers that cross provincial or international borders), atomic energy, postal and courier services, the broadcasting and telecommunications sectors', [], 'fr'), + ], + ]) + ->has(Project::factory()->hasEngagements(1, [ + 'name' => $regulatedPrivateEngagementName, + ])) + ->create(); + + $parliamentaryEngagementName = 'Parliamentary Engagement'; + $parliamentary = RegulatedOrganization::factory() + ->hasSectors(1, [ + 'name' => [ + 'en' => 'Parliamentary entities', + 'fr' => __('Parliamentary entities', [], 'fr'), + ], + 'description' => [ + 'en' => 'House of Commons, Senate, Library of Parliament, Parliamentary Protective Service', + 'fr' => __('House of Commons, Senate, Library of Parliament, Parliamentary Protective Service', [], 'fr'), + ], + ]) + ->has(Project::factory()->hasEngagements(1, [ + 'name' => $parliamentaryEngagementName, + ])) + ->create(); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['sectors' => []]); + $engagements->assertSee($regulatedPrivateEngagementName); + $engagements->assertSee($parliamentaryEngagementName); + + $engagements->set('sectors', [$private->sectors->first()->id]); + $engagements->assertSee($regulatedPrivateEngagementName); + $engagements->assertDontSee($parliamentaryEngagementName); + + $engagements->set('sectors', [$parliamentary->sectors()->first()->id]); + $engagements->assertDontSee($regulatedPrivateEngagementName); + $engagements->assertSee($parliamentaryEngagementName); + + $engagements->set('sectors', [$private->sectors->first()->id, $parliamentary->sectors()->first()->id]); + $engagements->assertSee($regulatedPrivateEngagementName); + $engagements->assertSee($parliamentaryEngagementName); +}); + +test('impacts property change', function () { + $employmentImpactEngagementName = 'Employment Impact Engagement'; + $employment = Project::factory() + ->hasAttached(Impact::factory()->state([ + 'name' => [ + 'en' => 'Employment', + 'fr' => __('Employment', [], 'fr'), + ], + ])) + ->hasEngagements(1, [ + 'name' => $employmentImpactEngagementName, + ]) + ->create(); + + $communicationImpactEngagementName = 'Communication Impact Engagement'; + $communication = Project::factory() + ->hasAttached(Impact::factory()->state([ + 'name' => [ + 'en' => 'Communications', + 'fr' => __('Communications', [], 'fr'), + ], + ])) + ->hasEngagements(1, [ + 'name' => $communicationImpactEngagementName, + ]) + ->create(); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['impacts' => []]); + $engagements->assertSee($employmentImpactEngagementName); + $engagements->assertSee($communicationImpactEngagementName); + + $engagements->set('impacts', [$employment->impacts->first()->id]); + $engagements->assertSee($employmentImpactEngagementName); + $engagements->assertDontSee($communicationImpactEngagementName); + + $engagements->set('impacts', [$communication->impacts->first()->id]); + $engagements->assertDontSee($employmentImpactEngagementName); + $engagements->assertSee($communicationImpactEngagementName); + + $engagements->set('impacts', [$employment->impacts->first()->id, $communication->impacts->first()->id]); + $engagements->assertSee($employmentImpactEngagementName); + $engagements->assertSee($communicationImpactEngagementName); +}); + +test('recruitmentMethods property change', function () { + $openCallEngagementName = 'Open Call Engagement'; + Engagement::factory()->create([ + 'name' => $openCallEngagementName, + 'recruitment' => EngagementRecruitment::OpenCall->value, + ]); + + $connectorEngagementName = 'Connector Engagement'; + Engagement::factory()->create([ + 'name' => $connectorEngagementName, + 'recruitment' => EngagementRecruitment::CommunityConnector->value, + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['recruitmentMethods' => []]); + $engagements->assertSee($openCallEngagementName); + $engagements->assertSee($connectorEngagementName); + + $engagements->set('recruitmentMethods', [EngagementRecruitment::OpenCall->value]); + $engagements->assertSee($openCallEngagementName); + $engagements->assertDontSee($connectorEngagementName); + + $engagements->set('recruitmentMethods', [EngagementRecruitment::CommunityConnector->value]); + $engagements->assertDontSee($openCallEngagementName); + $engagements->assertSee($connectorEngagementName); + + $engagements->set('recruitmentMethods', array_column(EngagementRecruitment::cases(), 'value')); + $engagements->assertSee($openCallEngagementName); + $engagements->assertSee($connectorEngagementName); +}); + +test('locations property change', function () { + $regionSpecificEngagementName = 'Region Specific Engagement'; + Engagement::factory()->create(['name' => $regionSpecificEngagementName]) + ->matchingStrategy->update([ + 'regions' => ['AB'], + ]); + + $locationSpecificEngagementName = 'Location Specific Engagement'; + Engagement::factory()->create(['name' => $locationSpecificEngagementName]) + ->matchingStrategy->update([ + 'locations' => [ + ['region' => 'AB', 'locality' => 'Edmonton'], + ['region' => 'ON', 'locality' => 'Toronto'], + ], + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['locations' => []]); + $engagements->assertSee($regionSpecificEngagementName); + $engagements->assertSee($locationSpecificEngagementName); + + $engagements->set('locations', ['AB']); + $engagements->assertSee($regionSpecificEngagementName); + $engagements->assertSee($locationSpecificEngagementName); + + $engagements->set('locations', ['ON']); + $engagements->assertDontSee($regionSpecificEngagementName); + $engagements->assertSee($locationSpecificEngagementName); + + $engagements->set('locations', ['AB', 'ON']); + $engagements->assertSee($regionSpecificEngagementName); + $engagements->assertSee($locationSpecificEngagementName); +}); + +test('selectNone', function () { + $closedEngagementName = 'Closed Engagement'; + Engagement::factory()->create([ + 'name->en' => $closedEngagementName, + 'signup_by_date' => now()->subDays(5), + 'recruitment' => EngagementRecruitment::CommunityConnector->value, + ]); + + $openCallEngagementName = 'Open Call Engagement'; + Engagement::factory()->create([ + 'name->en' => $openCallEngagementName, + 'signup_by_date' => now()->addDays(5), + 'recruitment' => EngagementRecruitment::OpenCall->value, + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['statuses' => [EngagementSignUpStatus::Closed->value], 'recruitmentMethods' => [EngagementRecruitment::CommunityConnector->value]]); + $engagements->assertSee($closedEngagementName); + $engagements->assertDontSee($openCallEngagementName); + + $engagements->call('selectNone'); + $engagements->assertSee($closedEngagementName); + $engagements->assertSee($openCallEngagementName); +}); + +test('no engagements found', function () { + $noEngagementsFound = __('No engagements found.'); + $noEngagementFoundCountMessage = '0 engagements match your applied filters.'; + $oneEngagementFoundCountMessage = '1 engagement matches your applied filters.'; + $foundEngagementName = 'Found Engagement'; + Engagement::factory()->create([ + 'name->en' => $foundEngagementName, + 'signup_by_date' => now()->subDays(5), + ]); + + $this->actingAs(User::factory()->create()); + $engagements = livewire(BrowseEngagements::class, ['statuses' => [EngagementSignUpStatus::Closed->value]]); + $engagements->assertSee($oneEngagementFoundCountMessage); + $engagements->assertDontSee($noEngagementFoundCountMessage); + $engagements->assertSee($foundEngagementName); + $engagements->assertDontSee($noEngagementsFound); + + $engagements->set('statuses', [EngagementSignUpStatus::Open->value]); + $engagements->assertSee($noEngagementFoundCountMessage); + $engagements->assertDontSee($oneEngagementFoundCountMessage); + $engagements->assertDontSee($foundEngagementName); + $engagements->assertSee($noEngagementsFound); +}); diff --git a/tests/Feature/Livewire/EstimatesAndAgreementsTest.php b/tests/Feature/Livewire/EstimatesAndAgreementsTest.php index 91bd7adef..488976dc8 100644 --- a/tests/Feature/Livewire/EstimatesAndAgreementsTest.php +++ b/tests/Feature/Livewire/EstimatesAndAgreementsTest.php @@ -60,10 +60,10 @@ livewire(AdminEstimatesAndAgreements::class) ->assertSee($project->name) ->call('markEstimateReturned', $project->id) - ->assertDontSee('Mark estimate as returned') + ->assertDontSee('Estimate and agreement have been sent') ->assertSee('Estimate returned') ->assertSee('Agreement pending') - ->assertSee('Mark agreement as received'); + ->assertSee('Agreement signed and received'); $notification = new EstimateReturned($project); $rendered = $notification->toMail($project)->render(); @@ -78,7 +78,7 @@ actingAs($projectManager)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertSee('Your estimate has been returned') + ->assertSee('Engagement estimate has been submitted for your approval') ->assertSee("Your estimate for <strong>{$projectName}</strong>, along with a project agreement for you to sign", false); }); @@ -104,7 +104,7 @@ ->assertSee('Agreement pending') ->call('markAgreementReceived', $project->id) ->assertDontSee('Agreement pending') - ->assertDontSee('Mark agreement as received') + ->assertDontSee('Agreement signed and received') ->assertSee('Agreement received'); $notification = new AgreementReceived($project); @@ -118,7 +118,7 @@ actingAs($projectManager)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertSee('Your agreement has been received') + ->assertSee('Your signed agreement has been received') ->assertSee("Your agreement has been received for <strong>{$projectName}</strong>", false); }); diff --git a/tests/Feature/NotificationsTest.php b/tests/Feature/NotificationsTest.php index 916261e48..0fe40f94e 100644 --- a/tests/Feature/NotificationsTest.php +++ b/tests/Feature/NotificationsTest.php @@ -38,7 +38,7 @@ actingAs($organizationAdministrator)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertSee('Your agreement has been received') + ->assertSee('Your signed agreement has been received') ->assertSee('Your organization has been invited as a Community Connector'); actingAs($organizationAdministrator); @@ -53,12 +53,12 @@ actingAs($organizationAdministrator)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertSee('Your agreement has been received') + ->assertSee('Your signed agreement has been received') ->assertDontSee('Your organization has been invited as a Community Connector'); actingAs($organizationAdministrator)->get(localized_route('dashboard.notifications-all')) ->assertOk() - ->assertSee('Your agreement has been received') + ->assertSee('Your signed agreement has been received') ->assertSee('Your organization has been invited as a Community Connector'); }); @@ -80,7 +80,7 @@ actingAs($regulatedOrganizationAdministrator)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertSee('Your agreement has been received'); + ->assertSee('Your signed agreement has been received'); actingAs($regulatedOrganizationAdministrator); @@ -94,9 +94,9 @@ actingAs($regulatedOrganizationAdministrator)->get(localized_route('dashboard.notifications')) ->assertOk() - ->assertDontSee('Your agreement has been received'); + ->assertDontSee('Your signed agreement has been received'); actingAs($regulatedOrganizationAdministrator)->get(localized_route('dashboard.notifications-all')) ->assertOk() - ->assertSee('Your agreement has been received'); + ->assertSee('Your signed agreement has been received'); }); diff --git a/tests/Feature/OrganizationTest.php b/tests/Feature/OrganizationTest.php index d030b7cd7..5e91bea04 100644 --- a/tests/Feature/OrganizationTest.php +++ b/tests/Feature/OrganizationTest.php @@ -1218,8 +1218,8 @@ expect($organization->publishedProjects)->toHaveCount(3); expect($organization->publishedProjects->modelKeys())->toContain($inProgressProject->id, $upcomingProject->id, $completedProject->id); - expect($organization->inProgressProjects)->toHaveCount(2); - expect($organization->inProgressProjects->modelKeys())->toContain($draftProject->id, $inProgressProject->id); + expect($organization->inProgressProjects)->toHaveCount(1); + expect($organization->inProgressProjects->modelKeys())->toContain($inProgressProject->id); expect($organization->upcomingProjects)->toHaveCount(1); expect($organization->upcomingProjects->modelKeys())->toContain($upcomingProject->id); diff --git a/tests/Feature/ProjectTest.php b/tests/Feature/ProjectTest.php index 868f5d609..d23884959 100644 --- a/tests/Feature/ProjectTest.php +++ b/tests/Feature/ProjectTest.php @@ -265,68 +265,36 @@ expect($project->isPublishable())->toBe($expected); })->with('projectIsPublishable'); -test('users can not view projects, if they are not oriented', function () { - $pendingUser = User::factory()->create(['oriented_at' => null]); - - actingAs($pendingUser)->get(localized_route('projects.my-projects'))->assertForbidden()->assertDontSee(__('Browse all projects')); - - actingAs($pendingUser)->get(localized_route('projects.my-contracted-projects'))->assertForbidden(); - - actingAs($pendingUser)->get(localized_route('projects.my-participating-projects'))->assertForbidden(); - - actingAs($pendingUser)->get(localized_route('projects.my-running-projects'))->assertForbidden(); - - actingAs($pendingUser)->get(localized_route('projects.all-projects'))->assertForbidden(); - - $pendingUser->update(['oriented_at' => now()]); - - actingAs($pendingUser)->get(localized_route('projects.my-projects'))->assertOk()->assertSee(__('Browse all projects')); - - actingAs($pendingUser)->get(localized_route('projects.all-projects'))->assertOk(); -}); - test('organization or regulated organization users can not view projects, other than their owned project, if they are not oriented', function () { $organizationUser = User::factory()->create(['context' => 'organization', 'oriented_at' => null]); $organization = Organization::factory()->hasAttached($organizationUser, ['role' => 'admin'])->create(['oriented_at' => null]); $organizationUser->refresh(); - actingAs($organizationUser)->get(localized_route('projects.my-projects'))->assertOk()->assertDontSee(__('Browse all projects')); - - actingAs($organizationUser)->get(localized_route('projects.my-contracted-projects'))->assertForbidden(); - - actingAs($organizationUser)->get(localized_route('projects.my-participating-projects'))->assertForbidden(); + actingAs($organizationUser)->get(localized_route('projects.my-projects'))->assertOk(); - actingAs($organizationUser)->get(localized_route('projects.my-running-projects'))->assertOk(); - - actingAs($organizationUser)->get(localized_route('projects.all-projects'))->assertForbidden(); + actingAs($organizationUser)->get(localized_route('engagements.index'))->assertForbidden(); $organization->update(['oriented_at' => now()]); $organizationUser->refresh(); - actingAs($organizationUser)->get(localized_route('projects.my-projects'))->assertOk()->assertSee(__('Browse all projects')); + actingAs($organizationUser)->get(localized_route('projects.my-projects'))->assertOk(); - actingAs($organizationUser)->get(localized_route('projects.all-projects'))->assertOk(); + actingAs($organizationUser)->get(localized_route('engagements.index'))->assertOk(); $regulatedOrganizationUser = User::factory()->create(['context' => 'regulated-organization', 'oriented_at' => null]); $regulatedOrganization = RegulatedOrganization::factory()->hasAttached($regulatedOrganizationUser, ['role' => 'admin'])->create(['oriented_at' => null]); $regulatedOrganizationUser->refresh(); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-projects'))->assertOk()->assertDontSee(__('Browse all projects')); - - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-contracted-projects'))->assertForbidden(); - - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-participating-projects'))->assertForbidden(); + actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-projects')); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-running-projects'))->assertOk(); - - actingAs($regulatedOrganizationUser)->get(localized_route('projects.all-projects'))->assertForbidden(); + actingAs($regulatedOrganizationUser)->get(localized_route('engagements.index'))->assertForbidden(); $regulatedOrganization->update(['oriented_at' => now()]); $regulatedOrganizationUser->refresh(); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-projects'))->assertOk()->assertSee(__('Browse all projects')); + actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-projects'))->assertOk(); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.all-projects'))->assertOk(); + actingAs($regulatedOrganizationUser)->get(localized_route('engagements.index'))->assertOk(); }); test('users can view projects', function () { @@ -346,7 +314,7 @@ 'preferred_contact_method' => $regulatedOrganization->preferred_contact_method, ]); - actingAs($user)->get(localized_route('projects.all-projects'))->assertOk(); + actingAs($user)->get(localized_route('engagements.index'))->assertOk(); actingAs($user)->get(localized_route('projects.show', $project))->assertOk(); @@ -445,27 +413,6 @@ expect($response['engagements']->modelKeys())->toContain($publishedEngagement->id); }); -test('incomplete users cannot view projects page', function ($context, $redirectRoute) { - $user = User::factory()->create(['context' => $context]); - - actingAs($user)->get(localized_route('projects.my-projects'))->assertRedirect(localized_route($redirectRoute)); - - actingAs($user)->get(localized_route('projects.my-contracted-projects'))->assertNotFound(); - - actingAs($user)->get(localized_route('projects.my-participating-projects'))->assertNotFound(); - - actingAs($user)->get(localized_route('projects.my-running-projects'))->assertNotFound(); -})->with([ - 'organization context' => [ - 'organization', - 'organizations.show-type-selection', - ], - 'regulated-organization context' => [ - 'regulated-organization', - 'regulated-organizations.show-type-selection', - ], -]); - test('notifications can be routed for projects', function () { $project = Project::factory()->create([ 'contact_person_name' => fake()->name(), @@ -484,10 +431,10 @@ 'projectable_id' => $regulatedOrganization->id, ]); - get(localized_route('projects.all-projects')) + get(localized_route('projects.show', $project)) ->assertRedirect(localized_route('login')); - get(localized_route('projects.show', $project)) + get(localized_route('engagements.index')) ->assertRedirect(localized_route('login')); }); @@ -889,41 +836,7 @@ expect($projectWithNullTrainings->team_trainings)->toBeEmpty(); }); -test('registered users can access my projects page', function () { - $individualUser = User::factory()->create(); - $individual = $individualUser->individual; - $individual->roles = ['participant']; - $individual->save(); - $individual = $individual->fresh(); - - actingAs($individualUser)->get(localized_route('projects.my-projects')) - ->assertOk() - ->assertDontSee('Involved in as a Community Connector') - ->assertDontSee('Involved in as a Consultation Participant'); - - actingAs($individualUser)->get(localized_route('projects.my-running-projects'))->assertNotFound(); - - actingAs($individualUser)->get(localized_route('projects.my-contracted-projects'))->assertNotFound(); - - $individual->roles = ['participant', 'consultant']; - $individual->save(); - $individualUser = $individualUser->fresh(); - - actingAs($individualUser)->get(localized_route('projects.my-projects')) - ->assertOk() - ->assertSee('Involved in as a Community Connector'); - - actingAs($individualUser)->get(localized_route('projects.my-contracted-projects'))->assertOk(); - - $individual->roles = ['consultant']; - $individual->save(); - $individualUser = $individualUser->fresh(); - - actingAs($individualUser)->get(localized_route('projects.my-projects')) - ->assertOk() - ->assertDontSee('Involved in as a Consultation Participant') - ->assertDontSee('Involved in as a Community Connector'); - +test('registered organization and regulate organization users can access my projects page', function () { $regulatedOrganizationUser = User::factory()->create(['context' => UserContext::RegulatedOrganization->value]); RegulatedOrganization::factory() ->hasAttached($regulatedOrganizationUser, ['role' => TeamRole::Administrator->value]) @@ -932,76 +845,52 @@ actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-projects')) ->assertOk() - ->assertSee('Projects I am running') - ->assertDontSee('Involved in as a Community Connector') - ->assertDontSee('Involved in as a Consultation Participant'); + ->assertSee('Projects my organization has created') + ->assertSee('Create new project'); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-contracted-projects'))->assertNotFound(); + $regulatedOrganizationMember = User::factory()->create(['context' => UserContext::RegulatedOrganization->value]); + RegulatedOrganization::factory() + ->hasAttached($regulatedOrganizationMember, ['role' => TeamRole::Member->value]) + ->create(); + $regulatedOrganizationMember = $regulatedOrganizationMember->fresh(); - actingAs($regulatedOrganizationUser)->get(localized_route('projects.my-participating-projects'))->assertNotFound(); + actingAs($regulatedOrganizationMember)->get(localized_route('projects.my-projects')) + ->assertOk() + ->assertSee('Projects my organization has created') + ->assertDontSee('Create new project'); $organizationUser = User::factory()->create(['context' => UserContext::Organization->value]); - $organization = Organization::factory() + Organization::factory() ->hasAttached($organizationUser, ['role' => TeamRole::Administrator->value]) ->create(); $organizationUser = $organizationUser->fresh(); actingAs($organizationUser)->get(localized_route('projects.my-projects')) ->assertOk() - ->assertSee('Projects I am running') - ->assertDontSee('Involved in as a Community Connector') - ->assertDontSee('Involved in as a Consultation Participant'); + ->assertSee('Projects my organization has created') + ->assertSee('Create new project'); - actingAs($organizationUser)->get(localized_route('projects.my-contracted-projects'))->assertNotFound(); - - actingAs($organizationUser)->get(localized_route('projects.my-participating-projects'))->assertNotFound(); - - actingAs($organizationUser)->get(localized_route('projects.my-running-projects'))->assertOk(); - - $organization->roles = ['connector']; - $organization->save(); - $organizationUser = $organizationUser->fresh(); - - actingAs($organizationUser)->get(localized_route('projects.my-projects')) - ->assertOk() - ->assertSee('Projects I am running') - ->assertSee('Involved in as a Community Connector') - ->assertDontSee('Involved in as a Consultation Participant'); - - actingAs($organizationUser)->get(localized_route('projects.my-participating-projects'))->assertNotFound(); - - actingAs($organizationUser)->get(localized_route('projects.my-contracted-projects'))->assertOk(); - - actingAs($organizationUser)->get(localized_route('projects.my-running-projects'))->assertOk(); - - $organization->roles = ['connector', 'participant']; - $organization->save(); - $organizationUser = $organizationUser->fresh(); + $organizationMember = User::factory()->create(['context' => UserContext::Organization->value]); + Organization::factory() + ->hasAttached($organizationMember, ['role' => TeamRole::Administrator->value]) + ->create(); + $organizationMember = $organizationMember->fresh(); - actingAs($organizationUser)->get(localized_route('projects.my-projects')) + actingAs($organizationMember)->get(localized_route('projects.my-projects')) ->assertOk() - ->assertSee('Projects I am running') - ->assertSee('Involved in as a Community Connector') - ->assertSee('Involved in as a Consultation Participant'); - - actingAs($organizationUser)->get(localized_route('projects.my-participating-projects'))->assertOk(); - - actingAs($organizationUser)->get(localized_route('projects.my-contracted-projects'))->assertOk(); - - actingAs($organizationUser)->get(localized_route('projects.my-running-projects'))->assertOk(); + ->assertSee('Projects my organization has created') + ->assertSee('Create new project'); +}); - $organization->roles = ['participant']; - $organization->save(); - $organizationUser = $organizationUser->fresh(); +test('non-organization users cannot access my projects page', function () { + $individualUser = User::factory()->create(); + actingAs($individualUser)->get(localized_route('projects.my-projects'))->assertNotFound(); - actingAs($organizationUser)->get(localized_route('projects.my-projects')) - ->assertOk() - ->assertSee('Projects I am running') - ->assertDontSee('Involved in as a Community Connector') - ->assertSee('Involved in as a Consultation Participant'); + $adminUser = User::factory()->create(['context' => UserContext::Administrator->value]); + actingAs($adminUser)->get(localized_route('projects.my-projects'))->assertNotFound(); $traineeUser = User::factory()->create(['context' => UserContext::TrainingParticipant->value]); - actingAs($traineeUser)->get(localized_route('projects.my-projects'))->assertForbidden(); + actingAs($traineeUser)->get(localized_route('projects.my-projects'))->assertNotFound(); }); test('guests can not access my projects page', function () { @@ -1009,6 +898,69 @@ ->assertRedirect(localized_route('login')); }); +test('my projects page displays projects by status', function ($userContext, $modelClass, $projectState, $toSee, $dontSee) { + $user = User::factory()->create(['context' => $userContext]); + $org = $modelClass::factory() + ->hasAttached($user, ['role' => TeamRole::Administrator->value]) + ->create(); + $user = $user->refresh(); + + $project = Project::factory()->for($org, 'projectable') + ->create($projectState); + + $response = actingAs($user)->get(localized_route('projects.my-projects')); + $response->assertOk() + ->assertSee('Projects my organization has created') + ->assertSee($project->name); + + foreach ($toSee as $item) { + $response->assertSee($item); + } + + foreach ($dontSee as $item) { + $response->assertDontSee($item); + } + +})->with([ + 'organization' => [ + 'userContext' => UserContext::Organization->value, + 'modelClass' => Organization::class, + ], + 'regulated organization' => [ + 'userContext' => UserContext::RegulatedOrganization->value, + 'modelClass' => RegulatedOrganization::class, + ], +])->with([ + 'draft' => [ + 'projectState' => [ + 'published_at' => null, + ], + 'toSee' => ['Draft'], + 'dontSee' => ['In progress', 'Upcoming', 'Completed'], + ], + 'in progress' => [ + 'projectState' => [], + 'toSee' => ['In progress'], + 'dontSee' => ['Draft', 'Upcoming', 'Completed'], + ], + 'upcoming' => [ + 'projectState' => [ + 'start_date' => now()->addMonth(), + 'end_date' => now()->addMonths(2), + ], + 'toSee' => ['Upcoming'], + 'dontSee' => ['Draft', 'In progress', 'Completed'], + ], + 'completed' => [ + 'projectState' => [ + 'start_date' => now()->subMonths(2), + 'end_date' => now()->subMonth(), + ], + 'toSee' => ['Completed'], + 'dontSee' => ['Draft', 'In progress', 'Upcoming'], + ], +]); + test('test project statuses scope', function () { $upcomingProject = Project::factory()->create([ 'start_date' => Carbon::now()->addDays(5), diff --git a/tests/Feature/RegulatedOrganizationTest.php b/tests/Feature/RegulatedOrganizationTest.php index 4f2cb187d..f916de126 100644 --- a/tests/Feature/RegulatedOrganizationTest.php +++ b/tests/Feature/RegulatedOrganizationTest.php @@ -728,6 +728,8 @@ actingAs($user)->get(localized_route('regulated-organizations.show', $regulatedOrganization))->assertOk(); actingAs($user)->get(localized_route('regulated-organizations.show-projects', $regulatedOrganization))->assertOk(); + + actingAs($user)->get(localized_route('regulated-organizations.show-contact-information', $regulatedOrganization))->assertOk(); }); test('guests can not view regulated organizations', function () { @@ -741,6 +743,9 @@ get(localized_route('regulated-organizations.show-projects', $regulatedOrganization)) ->assertRedirect(localized_route('login')); + + get(localized_route('regulated-organizations.show-contact-information', $regulatedOrganization)) + ->assertRedirect(localized_route('login')); }); test('user can view regulated organization in different languages', function () { @@ -847,8 +852,8 @@ expect($regulatedOrganization->publishedProjects)->toHaveCount(3); expect($regulatedOrganization->publishedProjects->modelKeys())->toContain($inProgressProject->id, $upcomingProject->id, $completedProject->id); - expect($regulatedOrganization->inProgressProjects)->toHaveCount(2); - expect($regulatedOrganization->inProgressProjects->modelKeys())->toContain($draftProject->id, $inProgressProject->id); + expect($regulatedOrganization->inProgressProjects)->toHaveCount(1); + expect($regulatedOrganization->inProgressProjects->modelKeys())->toContain($inProgressProject->id); expect($regulatedOrganization->upcomingProjects)->toHaveCount(1); expect($regulatedOrganization->upcomingProjects->modelKeys())->toContain($upcomingProject->id); diff --git a/tests/Feature/SuspensionTest.php b/tests/Feature/SuspensionTest.php index 3c5ac06eb..78e046d25 100644 --- a/tests/Feature/SuspensionTest.php +++ b/tests/Feature/SuspensionTest.php @@ -174,7 +174,7 @@ actingAs($this->suspendedUser)->get(localized_route('regulated-organizations.index')) ->assertForbidden(); - actingAs($this->suspendedUser)->get(localized_route('projects.all-projects')) + actingAs($this->suspendedUser)->get(localized_route('engagements.index')) ->assertForbidden(); }); diff --git a/tests/Feature/UserSettingsTest.php b/tests/Feature/UserSettingsTest.php index c8efbc9b3..c42490338 100644 --- a/tests/Feature/UserSettingsTest.php +++ b/tests/Feature/UserSettingsTest.php @@ -68,6 +68,44 @@ ->assertForbidden(); }); +test('other access need can be added and removed', function () { + seed(AccessSupportSeeder::class); + + $otherAccessNeed = 'Other access need'; + $user = User::factory()->create(['context' => 'individual']); + $individual = $user->individual; + + actingAs($user)->get(localized_route('settings.edit-access-needs')) + ->assertOk(); + + actingAs($user)->put(localized_route('settings.update-access-needs'), [ + 'other' => true, + 'other_access_need' => $otherAccessNeed, + ]) + ->assertSessionHasNoErrors() + ->assertRedirect(localized_route('settings.edit-access-needs')); + + $individual = $individual->fresh(); + expect($individual->other_access_need)->toBe($otherAccessNeed); + + actingAs($user)->get(localized_route('settings.edit-access-needs')) + ->assertOk() + ->assertSee($otherAccessNeed); + + actingAs($user)->put(localized_route('settings.update-access-needs'), [ + 'other' => false, + ]) + ->assertSessionHasNoErrors() + ->assertRedirect(localized_route('settings.edit-access-needs')); + + $individual = $individual->fresh(); + expect($individual->other_access_need)->toBe(''); + + actingAs($user)->get(localized_route('settings.edit-access-needs')) + ->assertOk() + ->assertDontSee($otherAccessNeed); +}); + test('access needs save redirect', function () { seed(AccessSupportSeeder::class); diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 121fa747c..6c8ab52a6 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -14,19 +14,18 @@ test('users can view the introduction', function () { $user = User::factory()->create(); - $user->update(['context' => 'individual']); actingAs($user)->get(localized_route('users.show-introduction')) ->assertOk() - ->assertSee('https://vimeo.com/850308866/22cf4718fc'); + ->assertSee(str_replace('"', '', json_encode('https://vimeo.com/850308866/22cf4718fc'))); actingAs($user) ->from(localized_route('users.show-introduction')) ->put(localized_route('users.update-introduction-status'), [ 'finished_introduction' => 1, ]) - ->assertRedirect(localized_route('individuals.show-role-selection')); + ->assertRedirect(localized_route('dashboard')); $user = $user->fresh(); @@ -36,7 +35,7 @@ actingAs($user)->get(localized_route('users.show-introduction')) ->assertOk() - ->assertSee('https://vimeo.com/850308900/39c5bb60a7'); + ->assertSee(str_replace('"', '', json_encode('https://vimeo.com/850308900/39c5bb60a7'))); actingAs($user) ->from(localized_route('users.show-introduction')) @@ -52,7 +51,7 @@ actingAs($user)->get(localized_route('users.show-introduction')) ->assertOk() - ->assertSee('https://vimeo.com/850308924/cab1e34418'); + ->assertSee(str_replace('"', '', json_encode('https://vimeo.com/850308924/cab1e34418'))); actingAs($user) ->from(localized_route('users.show-introduction')) diff --git a/tests/Feature/View/Components/InterpretationTest.php b/tests/Feature/View/Components/InterpretationTest.php index de4b4b1df..6a16decca 100644 --- a/tests/Feature/View/Components/InterpretationTest.php +++ b/tests/Feature/View/Components/InterpretationTest.php @@ -45,7 +45,7 @@ 'The Accessibility Exchange', '</h1>', 'id="'.Str::slug('The Accessibility Exchange'), - $interpretation->getTranslation('video', 'asl'), + str_replace('"', '', json_encode($interpretation->getTranslation('video', 'asl'))), ]; actingAs($user)->get(localized_route('welcome')) @@ -103,7 +103,7 @@ $localizedName, '</h1>', 'id="'.Str::slug($localizedName), - $interpretation->getTranslation('video', 'lsq'), + str_replace('"', '', json_encode($interpretation->getTranslation('video', 'lsq'))), ]; actingAs($user)->get(localized_route('welcome'))