mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 01:08:26 +00:00 
			
		
		
		
	Merge branch 'prepare-junie' into 'master'
Clean skeleton (and add Junie guidelines) See merge request Chill-Projet/chill-bundles!830
This commit is contained in:
		
							
								
								
									
										312
									
								
								.junie/guidelines.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										312
									
								
								.junie/guidelines.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,312 @@ | ||||
| # Project Guidelines for Junie | ||||
|  | ||||
| ## Project Overview | ||||
|  | ||||
| Chill is a comprehensive web application built as a set of Symfony bundles. It is a case management system, for social work. The project consists of multiple specialized bundles that provide different functionalities: | ||||
|  | ||||
| - **ChillMainBundle**: Core bundles that provide the foundation of the application | ||||
| - **ChillPersonBundle**: Core bundles that provide the foundation of the bundles associated to person (which is the case for all other bundles) | ||||
| - **ChillCalendarBundle**: Calendar and scheduling functionality | ||||
| - **ChillDocStoreBundle** and **ChillDocGeneratorBundle**: Document management and generation | ||||
| - **ChillActivityBundle**, **ChillEventBundle**, **ChillTaskBundle**: Activity and task tracking | ||||
| - **ChillBudgetBundle**: Financial management | ||||
| - **ChillThirdPartyBundle**: Integration with external systems | ||||
| - **ChillCustomFieldsBundle**: Extensibility through custom fields | ||||
| - **ChillReportBundle**: Save arbitrary reports about persons | ||||
| - **ChillTicketBundle**: Record and track issues about persons | ||||
|  | ||||
| - And several other specialized bundles | ||||
|  | ||||
| ## Technology Stack | ||||
|  | ||||
| - **Backend**: PHP 8.3+, Symfony 5.4 | ||||
| - **Frontend**: JavaScript/TypeScript, Vue.js 3, Bootstrap 5 | ||||
| - **Build Tools**: Webpack Encore, Yarn | ||||
| - **Database**: PostgreSQL with materialized views | ||||
| - **Other Services**: Redis, AMQP (RabbitMQ), SMTP | ||||
|  | ||||
| ## Project Structure | ||||
|  | ||||
| Note: This is a project which exists from a long time ago, and we found multiple structure inside each bundle. When having the choice, the developers should choose the new structure. | ||||
|  | ||||
| The project follows a standard Symfony bundle structure: | ||||
| - `/src/Bundle/`: Contains all the Chill bundles. The code is either at the root of the bundle directory, or within a `src/` directory (preferred). See psr4 mapping at the root's `composer.json`. | ||||
| - each bundle come with his own tests, either in the `Tests` directory (when the code is directly within the bundle directory (for instance `src/Bundle/ChillMainBundle/Tests`, `src/Bundle/ChillPersonBundle/Tests`)), or inside the `tests` directory, alongside to the `src/` sub-directory (example: `src/Bundle/ChillWopiBundle/tests`) (this is the preferred way). | ||||
| - `/docs/`: Contains project documentation | ||||
|  | ||||
| Each bundle typically has the following structure: | ||||
|  | ||||
| - `Controller/`: Contains controllers | ||||
| - `Entity/`: Contains Doctrine entities | ||||
| - `Repository/`: Contains Doctrine repositories | ||||
| - `Resources/`: Contains views, translations, and public assets | ||||
| - `DependencyInjection/`: Contains service configuration | ||||
| - `Export/`: Contains services related to exports | ||||
| - `Security/`: Contains services related to security. Most of the time, those are new voters, and so on. | ||||
|  | ||||
| ### A special word about TicketBundle | ||||
|  | ||||
| The ticket bundle is developed using a kind of "Command" pattern. The controller fill a "Command", and a "CommandHandler" handle this command. They are savec in the `src/Bundle/ChillTicketBundle/src/Action` directory. | ||||
|  | ||||
| ## Development Guidelines | ||||
|  | ||||
| ### Building and Configuration Instructions | ||||
|  | ||||
| All the command should be run through the `symfony` command, which will configure the required variables. | ||||
|  | ||||
| For assets, we must ensure that we use node at version `^20.0.0`. This is done using `nvm use 20`. | ||||
|  | ||||
| #### Initial Setup | ||||
|  | ||||
| 1. **Clone the Repository**: | ||||
|    ```bash | ||||
|    git clone <repository-url> | ||||
|    cd chill-bundles | ||||
|    ``` | ||||
|  | ||||
| 2. **Install PHP Dependencies**: | ||||
|    ```bash | ||||
|    composer install | ||||
|    ``` | ||||
|  | ||||
| 3. **Install JavaScript Dependencies**: | ||||
|    ```bash | ||||
|    nvm use 20 | ||||
|    yarn install | ||||
|    ``` | ||||
|  | ||||
| 4. **Configure Environment Variables**: | ||||
|  | ||||
|    - Create a `.env.local` file with minimal configuration | ||||
|    ```bash | ||||
|    echo "APP_ENV=dev" >> .env.local | ||||
|    ``` | ||||
|  | ||||
| 5. Start the associated services (database, and so on): | ||||
|    ```bash | ||||
|    docker compose up -d | ||||
|    ``` | ||||
|  | ||||
| 5. **Set Up the Database**: | ||||
|    ```bash | ||||
|    # Create the database | ||||
|    symfony console doctrine:database:create | ||||
|  | ||||
|    # Run migrations | ||||
|    symfony console doctrine:migrations:migrate | ||||
|  | ||||
|    # Load fixtures (optional) | ||||
|    symfony console doctrine:fixtures:load | ||||
|    ``` | ||||
|  | ||||
| 6. **Build Assets**: | ||||
|    ```bash | ||||
|    nvm use 20 | ||||
|    yarn run encore dev | ||||
|    ``` | ||||
|  | ||||
| 7. **Start the Development Server**: | ||||
|    ```bash | ||||
|    symfony server:start -d | ||||
|    ``` | ||||
|  | ||||
| #### Docker Setup | ||||
|  | ||||
| The project includes Docker configuration for easier development: | ||||
|  | ||||
| 1. **Start Docker Services**: | ||||
|    ```bash | ||||
|    docker-compose up -d | ||||
|    ``` | ||||
|  | ||||
| 2. **Access the Application**: | ||||
|    - The application will be available at `http://localhost:8000` | ||||
|    - PostgreSQL will be available at `localhost:5432` | ||||
|    - Redis will be available at `localhost:6379` | ||||
|  | ||||
| #### Building Assets | ||||
|  | ||||
| Before submitting any changes, you should build the project to ensure that all assets are properly compiled: | ||||
|  | ||||
| ```bash | ||||
| # For production | ||||
| yarn run encore production | ||||
|  | ||||
| # For development with hot-reloading | ||||
| yarn run encore dev --watch | ||||
|  | ||||
| # for development | ||||
| yarn run encore dev | ||||
| ``` | ||||
|  | ||||
| #### Configuration Files | ||||
|  | ||||
| Key configuration files: | ||||
|  | ||||
| - `config/packages/*.yaml`: Symfony bundle configurations | ||||
| - `webpack.config.js`: Webpack Encore configuration | ||||
| - `composer.json`: PHP dependencies and scripts | ||||
| - `package.json`: JavaScript dependencies and scripts | ||||
| - `.env`: Default environment variables. Must usually not be updated: use `.env.local` instead. | ||||
|  | ||||
| ### Testing Information | ||||
|  | ||||
| The project uses PHPUnit for testing. Each bundle has its own test suite, and there's also a global test suite at the root level. | ||||
|  | ||||
| For creating mock, we prefer using prophecy (library phpspec/prophecy). | ||||
|  | ||||
| #### Running Tests | ||||
|  | ||||
| ```bash | ||||
| # Run all tests | ||||
| vendor/bin/phpunit | ||||
|  | ||||
| # Run tests for a specific bundle | ||||
| vendor/bin/phpunit --testsuite NameBundle | ||||
|  | ||||
| # Run a specific test file | ||||
| vendor/bin/phpunit path/to/TestFile.php | ||||
|  | ||||
| # Run a specific test method | ||||
| vendor/bin/phpunit --filter methodName path/to/TestFile.php | ||||
| ``` | ||||
|  | ||||
| #### Test Structure | ||||
|  | ||||
| Tests are organized by bundle and follow the same structure as the bundle itself: | ||||
|  | ||||
| - Unit tests: Test individual components in isolation | ||||
| - Integration tests: Test components working together | ||||
| - Functional tests: Test the application from the user's perspective | ||||
|  | ||||
| #### Writing Tests | ||||
|  | ||||
| Tests should be placed in the appropriate bundle's test directory. For example, tests for the TicketBundle should be placed in `src/Bundle/ChillTicketBundle/tests/`. | ||||
|  | ||||
| Here's an example of a simple entity test: | ||||
|  | ||||
| ```php | ||||
| <?php | ||||
|  | ||||
| namespace Chill\TicketBundle\Tests\Entity; | ||||
|  | ||||
| use Chill\TicketBundle\Entity\Ticket; | ||||
| use PHPUnit\Framework\TestCase; | ||||
|  | ||||
| class TicketTest extends TestCase | ||||
| { | ||||
|     public function testGetAndSetExternalRef(): void | ||||
|     { | ||||
|         $ticket = new Ticket(); | ||||
|         $externalRef = 'REF-123'; | ||||
|  | ||||
|         // Set the external reference | ||||
|         $ticket->setExternalRef($externalRef); | ||||
|  | ||||
|         // Verify that getExternalRef returns the correct value | ||||
|         self::assertSame($externalRef, $ticket->getExternalRef()); | ||||
|  | ||||
|         // Change the external reference | ||||
|         $newExternalRef = 'REF-456'; | ||||
|         $ticket->setExternalRef($newExternalRef); | ||||
|  | ||||
|         // Verify that getExternalRef returns the updated value | ||||
|         self::assertSame($newExternalRef, $ticket->getExternalRef()); | ||||
|     } | ||||
| } | ||||
| ``` | ||||
|  | ||||
| #### Test Database | ||||
|  | ||||
| For tests that require a database, the project uses an in-memory SQLite database by default. You can configure a different database for testing in the `.env.test` file. | ||||
|  | ||||
| ### Code Quality Tools | ||||
|  | ||||
| The project uses several tools to maintain code quality: | ||||
|  | ||||
| #### PHP Code Style | ||||
|  | ||||
| The project uses PHP-CS-Fixer for code style. You can run it with: | ||||
|  | ||||
| ```bash | ||||
| # Using the composer script | ||||
| composer php-cs-fixer | ||||
|  | ||||
| # Or directly | ||||
| php-cs-fixer fix --config=./.php-cs-fixer.dist.php | ||||
| ``` | ||||
|  | ||||
| #### Static Analysis | ||||
|  | ||||
| The project uses PHPStan for static analysis. You can run it with: | ||||
|  | ||||
| ```bash | ||||
| # Using the composer script | ||||
| composer phpstan | ||||
|  | ||||
| # Or directly | ||||
| vendor/bin/phpstan analyse | ||||
| ``` | ||||
|  | ||||
| #### Automated Refactoring | ||||
|  | ||||
| The project uses Rector for automated refactoring. You can run it with: | ||||
|  | ||||
| ```bash | ||||
| # Using the composer script | ||||
| composer rector | ||||
|  | ||||
| # Or directly | ||||
| vendor/bin/rector | ||||
| ``` | ||||
|  | ||||
| #### JavaScript/TypeScript Linting | ||||
|  | ||||
| The project uses ESLint for JavaScript/TypeScript code quality. You can run it with: | ||||
|  | ||||
| ```bash | ||||
| yarn run eslint | ||||
| ``` | ||||
|  | ||||
| ## Deployment | ||||
|  | ||||
| The project can be deployed in a production environment following Symfony's deployment guidelines. The documentation provides detailed instructions for setting up a production environment. | ||||
|  | ||||
| ### Production Deployment Checklist | ||||
|  | ||||
| 1. Set environment variables for production | ||||
| 2. Optimize Composer autoloader: `composer install --no-dev --optimize-autoloader` | ||||
| 3. Compile assets for production: `yarn run encore production` | ||||
| 4. Clear and warm up the cache: `php bin/console cache:clear --env=prod` | ||||
| 5. Run database migrations: `php bin/console doctrine:migrations:migrate --env=prod` | ||||
|  | ||||
| ## Documentation | ||||
|  | ||||
| Comprehensive documentation is available in the `/docs/` directory, including installation instructions, configuration guides, and operational procedures. | ||||
|  | ||||
| ## Development Workflow | ||||
|  | ||||
| 1. **Create a Feature Branch**: Always create a new branch for your feature or bugfix | ||||
| 2. **Write Tests**: Write tests for your changes before implementing them | ||||
| 3. **Implement Changes**: Implement your changes following the project's coding standards | ||||
| 4. **Run Tests**: Make sure all tests pass | ||||
| 5. **Run Code Quality Tools**: Make sure your code passes all code quality checks | ||||
| 6. **Submit a Pull Request**: Submit a pull request for review | ||||
|  | ||||
| ## Debugging | ||||
|  | ||||
| The project includes several tools for debugging: | ||||
|  | ||||
| - **Symfony Profiler**: Available in development mode at `/_profiler` | ||||
| - **Xdebug**: Configure your IDE to use Xdebug for step-by-step debugging | ||||
| - **Symfony Debug Toolbar**: Available at the bottom of the page in development mode | ||||
|  | ||||
| ## Conclusion | ||||
|  | ||||
| When working with this project, Junie should: | ||||
|  | ||||
| 1. Understand the modular bundle structure and how the different components interact | ||||
| 2. Build the project before submitting changes to ensure assets are properly compiled | ||||
| 3. Run relevant tests to ensure changes don't break existing functionality | ||||
| 4. Follow the established code style and patterns | ||||
| 5. Use the provided tools for debugging and code quality | ||||
| @@ -1,14 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$records of method League\\\\Csv\\\\Writer\\:\\:insertAll\\(\\) expects iterable\\<array\\<float\\|int\\|string\\|Stringable\\|null\\>\\>, iterable\\<array\\<string, bool\\|int\\|string\\>\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/UserExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant ASC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Ascending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Entity/Workflow/EntityWorkflow.php | ||||
| @@ -1,58 +0,0 @@ | ||||
| # See https://github.com/doctrine/orm/issues/11313 for a follow-up | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant ASC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Ascending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Entity/CustomFieldsGroup.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant ASC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Ascending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Entity/Notification.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant DESC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Descending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant DESC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Descending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWorkEvaluation.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant DESC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Descending instead$# | ||||
| 			""" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Household/Household.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant DESC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Descending instead$# | ||||
| 			""" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Person.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Fetching deprecated class constant DESC of class Doctrine\\\\Common\\\\Collections\\\\Criteria\\: | ||||
| 				use Order\\:\\:Descending instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php | ||||
| @@ -1,301 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\ActivityBundle\\\\Entity\\\\Activity\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\MainBundle\\\\Entity\\\\Scope\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\PersonBundle\\\\Entity\\\\Person\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, DateTime\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\ActivityBundle\\\\Entity\\\\ActivityReasonCategory\\|null given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityReasonCategoryController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\ActivityBundle\\\\Entity\\\\ActivityReason\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityReasonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method DateTime\\:\\:setTimezone\\(\\) with incorrect case\\: setTimeZone$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in &&, Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\|null given on the right side\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, Chill\\\\AsideActivityBundle\\\\Entity\\\\AsideActivityCategory\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillAsideActivityBundle/src/Entity/AsideActivityCategory.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method DateTimeImmutable\\:\\:setTimezone\\(\\) with incorrect case\\: setTimeZone$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillAsideActivityBundle/src/Form/AsideActivityFormType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\MainBundle\\\\Entity\\\\Location\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Controller/CalendarController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, Symfony\\\\Component\\\\Validator\\\\ConstraintViolationListInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\CustomFieldsBundle\\\\Entity\\\\CustomFieldsGroup\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\CustomFieldsBundle\\\\Entity\\\\CustomField\\|null given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\CustomFieldsBundle\\\\Entity\\\\CustomFieldsGroup given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\CustomFieldsBundle\\\\Entity\\\\CustomFieldsGroup\\|null given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldsGroupController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/CustomFieldsGroupToIdTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getFirstName\\(\\) with incorrect case\\: getFirstname$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getLastName\\(\\) with incorrect case\\: getLastname$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getMobilenumber\\(\\) with incorrect case\\: getMobileNumber$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getPhonenumber\\(\\) with incorrect case\\: getPhoneNumber$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\Event given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\Event\\|null given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, int given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only numeric types are allowed in pre\\-increment, string given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\EventType\\|null given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventTypeController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\Participation\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/ParticipationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\Role\\|null given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/RoleController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\EventBundle\\\\Entity\\\\Status\\|null given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/StatusController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\Language\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, Chill\\\\MainBundle\\\\Entity\\\\Language\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, int given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\Center\\|null given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/CenterController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Redis\\:\\:setex\\(\\) with incorrect case\\: setEx$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\PermissionsGroup\\|null given\\.$#" | ||||
| 			count: 5 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\RoleScope\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PermissionsGroupController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\Scope\\|null given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ScopeController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\GroupCenter\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/UserController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\MainBundle\\\\Entity\\\\User\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/UserController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, int given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadPostalCodes.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only numeric types are allowed in pre\\-increment, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadsheetListFormatter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, int given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, string\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/PickUserLocationType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, int\\<0, max\\> given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillMainBundle/Search/SearchApiQuery.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\MainBundle\\\\Entity\\\\Address\\:\\:getPostcode\\(\\) with incorrect case\\: getPostCode$#" | ||||
| 			count: 6 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\ClassDiscriminatorMapping\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DoctrineExistingEntityNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Person.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriodParticipation\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Person.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getFirstName\\(\\) with incorrect case\\: getFirstname$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getLastName\\(\\) with incorrect case\\: getLastname$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/Type/PickPersonType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, int\\<0, max\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Search/SimilarPersonMatcher.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in &&, null given on the left side\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, Chill\\\\PersonBundle\\\\Entity\\\\Household\\\\Household\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, array\\<Chill\\\\PersonBundle\\\\Entity\\\\Person\\\\ResidentialAddress\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getDeathdate\\(\\) with incorrect case\\: getDeathDate$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Templating/Entity/PersonRender.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\PersonBundle\\\\Entity\\\\Person\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, Chill\\\\ReportBundle\\\\Entity\\\\Report given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Call to method Chill\\\\ThirdPartyBundle\\\\Entity\\\\ThirdParty\\:\\:setFirstname\\(\\) with incorrect case\\: setFirstName$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/EventListener/ThirdPartyEventListener.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Dynamic call to static method Chill\\\\ThirdPartyBundle\\\\ThirdPartyType\\\\ThirdPartyTypeProviderInterface\\:\\:getKey\\(\\)\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/ThirdPartyType/ThirdPartyTypeManager.php | ||||
| @@ -1,804 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\<Chill\\\\ActivityBundle\\\\Entity\\\\Activity\\>\\) of method Chill\\\\ActivityBundle\\\\Repository\\\\ActivityACLAwareRepository\\:\\:findByPerson\\(\\) should be covariant with return type \\(array\\<Chill\\\\ActivityBundle\\\\Repository\\\\Activity\\>\\) of method Chill\\\\ActivityBundle\\\\Repository\\\\ActivityACLAwareRepositoryInterface\\:\\:findByPerson\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\<Chill\\\\ActivityBundle\\\\Entity\\\\ActivityReason\\>\\) of method Chill\\\\ActivityBundle\\\\Repository\\\\ActivityReasonRepository\\:\\:findAll\\(\\) should be covariant with return type \\(array\\<int, object\\>\\) of method Doctrine\\\\ORM\\\\EntityRepository\\<object\\>\\:\\:findAll\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Repository/ActivityReasonRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\<array\\<string\\>\\>\\) of method Chill\\\\AsideActivityBundle\\\\Security\\\\AsideActivityVoter\\:\\:getRolesWithHierarchy\\(\\) should be covariant with return type \\(array\\<string, array\\<int, string\\>\\>\\) of method Chill\\\\MainBundle\\\\Security\\\\ProvideRoleHierarchyInterface\\:\\:getRolesWithHierarchy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillAsideActivityBundle/src/Security/AsideActivityVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$criteria \\(array\\<string, mixed\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$criteria \\(array\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepositoryInterface\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarDocRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$criteria \\(array\\<string, mixed\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepository\\:\\:findOneBy\\(\\) should be contravariant with parameter \\$criteria \\(array\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepositoryInterface\\:\\:findOneBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarDocRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$orderBy \\(array\\<string, 'ASC'\\|'asc'\\|'DESC'\\|'desc'\\>\\|null\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$orderBy \\(array\\|null\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepositoryInterface\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarDocRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\<object\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepository\\:\\:findAll\\(\\) should be covariant with return type \\(array\\<Chill\\\\CalendarBundle\\\\Entity\\\\CalendarDoc\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepositoryInterface\\:\\:findAll\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarDocRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\<object\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepository\\:\\:findBy\\(\\) should be covariant with return type \\(array\\<Chill\\\\CalendarBundle\\\\Entity\\\\CalendarDoc\\>\\) of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarDocRepositoryInterface\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarDocRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\CalendarBundle\\\\Entity\\\\CalendarDoc\\) of method Chill\\\\CalendarBundle\\\\Security\\\\Voter\\\\CalendarDocVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Security/Voter/CalendarDocVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\CalendarBundle\\\\Entity\\\\Invite\\) of method Chill\\\\CalendarBundle\\\\Security\\\\Voter\\\\InviteVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Security/Voter/InviteVoter.php | ||||
|  | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(int\\|void\\|null\\) of method Chill\\\\CustomFieldsBundle\\\\Command\\\\CreateFieldsOnGroupCommand\\:\\:execute\\(\\) should be covariant with return type \\(int\\) of method Symfony\\\\Component\\\\Console\\\\Command\\\\Command\\:\\:execute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$customFieldsGroup \\(Chill\\\\CustomFieldsBundle\\\\Entity\\\\CustomFieldsGroup\\|null\\) of method Chill\\\\CustomFieldsBundle\\\\Form\\\\DataTransformer\\\\CustomFieldsGroupToIdTransformer\\:\\:transform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:transform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/CustomFieldsGroupToIdTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$id \\(string\\) of method Chill\\\\CustomFieldsBundle\\\\Form\\\\DataTransformer\\\\CustomFieldsGroupToIdTransformer\\:\\:reverseTransform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:reverseTransform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Form/DataTransformer/CustomFieldsGroupToIdTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$query \\(Doctrine\\\\ORM\\\\QueryBuilder\\) of method Chill\\\\DocGeneratorBundle\\\\Controller\\\\AdminDocGeneratorTemplateController\\:\\:orderQuery\\(\\) should be contravariant with parameter \\$query \\(mixed\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:orderQuery\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Controller/AdminDocGeneratorTemplateController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Doctrine\\\\Common\\\\Collections\\\\Collection\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\CollectionDocGenNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\CollectionDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\CollectionDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|void\\|null\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\CollectionDocGenNormalizer\\:\\:normalize\\(\\) should be covariant with return type \\(array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/CollectionDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(Chill\\\\MainBundle\\\\Entity\\\\Scope\\|null\\) of method Chill\\\\DocStoreBundle\\\\Entity\\\\PersonDocument\\:\\:getScope\\(\\) should be covariant with return type \\(Chill\\\\MainBundle\\\\Entity\\\\Scope\\) of method Chill\\\\MainBundle\\\\Entity\\\\HasScopeInterface\\:\\:getScope\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Entity/PersonDocument.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\DocStoreBundle\\\\Entity\\\\PersonDocument\\) of method Chill\\\\DocStoreBundle\\\\Security\\\\Authorization\\\\PersonDocumentVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Security/Authorization/PersonDocumentVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\DocStoreBundle\\\\Serializer\\\\Normalizer\\\\StoredObjectDenormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\DocStoreBundle\\\\Serializer\\\\Normalizer\\\\StoredObjectDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Serializer/Normalizer/StoredObjectDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\DocStoreBundle\\\\Entity\\\\AccompanyingCourseDocument\\) of method Chill\\\\DocStoreBundle\\\\Workflow\\\\AccompanyingCourseDocumentWorkflowHandler\\:\\:getRelatedObjects\\(\\) should be contravariant with parameter \\$object \\(object\\) of method Chill\\\\MainBundle\\\\Workflow\\\\EntityWorkflowHandlerInterface\\:\\:getRelatedObjects\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Workflow/AccompanyingCourseDocumentWorkflowHandler.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(null\\) of method Chill\\\\EventBundle\\\\Form\\\\ChoiceLoader\\\\EventChoiceLoader\\:\\:loadChoiceList\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoiceList\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\EventBundle\\\\Form\\\\ChoiceLoader\\\\EventChoiceLoader\\:\\:loadChoicesForValues\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoicesForValues\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\EventBundle\\\\Form\\\\ChoiceLoader\\\\EventChoiceLoader\\:\\:loadValuesForChoices\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadValuesForChoices\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\EventBundle\\\\Entity\\\\Event\\) of method Chill\\\\EventBundle\\\\Security\\\\Authorization\\\\EventVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Security/Authorization/EventVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\EventBundle\\\\Entity\\\\Participation\\) of method Chill\\\\EventBundle\\\\Security\\\\Authorization\\\\ParticipationVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Security/Authorization/ParticipationVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entity \\(Chill\\\\EventBundle\\\\Entity\\\\Event\\) of method Chill\\\\EventBundle\\\\Timeline\\\\TimelineEventProvider\\:\\:getEntityTemplate\\(\\) should be contravariant with parameter \\$entity \\(Chill\\\\MainBundle\\\\Timeline\\\\type\\) of method Chill\\\\MainBundle\\\\Timeline\\\\TimelineProviderInterface\\:\\:getEntityTemplate\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Timeline/TimelineEventProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$type \\(null\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Routing\\\\CRUDRoutesLoader\\:\\:supports\\(\\) should be contravariant with parameter \\$type \\(string\\|null\\) of method Symfony\\\\Component\\\\Config\\\\Loader\\\\LoaderInterface\\:\\:supports\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Routing/CRUDRoutesLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$query \\(Doctrine\\\\ORM\\\\QueryBuilder\\) of method Chill\\\\MainBundle\\\\Controller\\\\LocationApiController\\:\\:orderQuery\\(\\) should be contravariant with parameter \\$query \\(mixed\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\AbstractCRUDController\\:\\:orderQuery\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/LocationApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$query \\(Doctrine\\\\ORM\\\\QueryBuilder\\) of method Chill\\\\MainBundle\\\\Controller\\\\UserApiController\\:\\:customizeQuery\\(\\) should be contravariant with parameter \\$query \\(mixed\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\AbstractCRUDController\\:\\:customizeQuery\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/UserApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(object\\|null\\) of method Chill\\\\MainBundle\\\\DependencyInjection\\\\ChillMainExtension\\:\\:getConfiguration\\(\\) should be covariant with return type \\(Symfony\\\\Component\\\\Config\\\\Definition\\\\ConfigurationInterface\\|null\\) of method Symfony\\\\Component\\\\DependencyInjection\\\\Extension\\\\ConfigurationExtensionInterface\\:\\:getConfiguration\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(object\\|null\\) of method Chill\\\\MainBundle\\\\DependencyInjection\\\\ChillMainExtension\\:\\:getConfiguration\\(\\) should be covariant with return type \\(Symfony\\\\Component\\\\Config\\\\Definition\\\\ConfigurationInterface\\|null\\) of method Symfony\\\\Component\\\\DependencyInjection\\\\Extension\\\\Extension\\:\\:getConfiguration\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/ChillMainExtension.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(null\\) of method Chill\\\\MainBundle\\\\Form\\\\ChoiceLoader\\\\PostalCodeChoiceLoader\\:\\:loadChoiceList\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoiceList\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\MainBundle\\\\Form\\\\ChoiceLoader\\\\PostalCodeChoiceLoader\\:\\:loadChoicesForValues\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoicesForValues\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\MainBundle\\\\Form\\\\ChoiceLoader\\\\PostalCodeChoiceLoader\\:\\:loadValuesForChoices\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadValuesForChoices\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$address \\(Chill\\\\MainBundle\\\\Entity\\\\Address\\) of method Chill\\\\MainBundle\\\\Form\\\\DataMapper\\\\AddressDataMapper\\:\\:mapDataToForms\\(\\) should be contravariant with parameter \\$viewData \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataMapperInterface\\:\\:mapDataToForms\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/AddressDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$forms \\(Iterator\\) of method Chill\\\\MainBundle\\\\Form\\\\DataMapper\\\\AddressDataMapper\\:\\:mapFormsToData\\(\\) should be contravariant with parameter \\$forms \\(iterable\\<Symfony\\\\Component\\\\Form\\\\FormInterface\\>&Traversable\\) of method Symfony\\\\Component\\\\Form\\\\DataMapperInterface\\:\\:mapFormsToData\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/AddressDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$address \\(Chill\\\\MainBundle\\\\Entity\\\\Address\\) of method Chill\\\\MainBundle\\\\Form\\\\DataMapper\\\\AddressDataMapper\\:\\:mapFormsToData\\(\\) should be contravariant with parameter \\$viewData \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataMapperInterface\\:\\:mapFormsToData\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/AddressDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$forms \\(Iterator\\) of method Chill\\\\MainBundle\\\\Form\\\\DataMapper\\\\AddressDataMapper\\:\\:mapDataToForms\\(\\) should be contravariant with parameter \\$forms \\(iterable\\<Symfony\\\\Component\\\\Form\\\\FormInterface\\>&Traversable\\) of method Symfony\\\\Component\\\\Form\\\\DataMapperInterface\\:\\:mapDataToForms\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/AddressDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(string\\) of method Chill\\\\MainBundle\\\\Form\\\\DataTransformer\\\\IdToEntityDataTransformer\\:\\:reverseTransform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:reverseTransform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataTransformer/IdToEntityDataTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(array\\<Chill\\\\MainBundle\\\\Entity\\\\User\\>\\|Chill\\\\MainBundle\\\\Entity\\\\User\\) of method Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\EntityToJsonTransformer\\:\\:transform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:transform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/EntityToJsonTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$array \\(array\\) of method Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\MultipleObjectsToIdTransformer\\:\\:transform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:transform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/MultipleObjectsToIdTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$id \\(string\\) of method Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\ObjectToIdTransformer\\:\\:reverseTransform\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataTransformerInterface\\:\\:reverseTransform\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/ObjectToIdTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\) of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\EntityWorkflowVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/EntityWorkflowVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entity \\(Chill\\\\MainBundle\\\\Entity\\\\HasCenterInterface\\) of method Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\DefaultCenterResolver\\:\\:resolveCenter\\(\\) should be contravariant with parameter \\$entity \\(object\\) of method Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverInterface\\:\\:resolveCenter\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Resolver/DefaultCenterResolver.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entity \\(Chill\\\\MainBundle\\\\Entity\\\\HasScopeInterface\\|Chill\\\\MainBundle\\\\Entity\\\\HasScopesInterface\\) of method Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\DefaultScopeResolver\\:\\:resolveScope\\(\\) should be contravariant with parameter \\$entity \\(mixed\\) of method Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\ScopeResolverInterface\\:\\:resolveScope\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Resolver/DefaultScopeResolver.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$address \\(Chill\\\\MainBundle\\\\Entity\\\\Address\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\AddressNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\AddressNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\AddressNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/AddressNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CenterNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CenterNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CenterNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CenterNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CenterNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$collection \\(Chill\\\\MainBundle\\\\Serializer\\\\Model\\\\Collection\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CollectionNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CollectionNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CollectionNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CollectionNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\MainBundle\\\\Entity\\\\Embeddable\\\\CommentEmbeddable\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\CommentEmbeddableDocGenNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/CommentEmbeddableDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DateNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DateNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DateNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DateNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DateNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DateNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DiscriminatedObjectDenormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DiscriminatedObjectDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DiscriminatedObjectDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareDenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DiscriminatedObjectDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DiscriminatedObjectDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DiscriminatedObjectDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DoctrineExistingEntityNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DoctrineExistingEntityNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\DoctrineExistingEntityNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/DoctrineExistingEntityNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\EntityWorkflowNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/EntityWorkflowNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflowStep\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\EntityWorkflowStepNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/EntityWorkflowStepNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\MainBundle\\\\Entity\\\\Notification\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\NotificationNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/NotificationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|void\\|null\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\NotificationNormalizer\\:\\:normalize\\(\\) should be covariant with return type \\(array\\|ArrayObject\\|bool\\|float\\|int\\|string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/NotificationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$data \\(string\\|null\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\PhonenumberNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$data \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\PhonenumberNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PhonenumberNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\PointNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PointNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\PointNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PointNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\PrivateCommentEmbeddableNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PrivateCommentEmbeddableNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\UserNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\UserNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\MainBundle\\\\Serializer\\\\Normalizer\\\\UserNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php | ||||
|  | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(string\\) of method Chill\\\\MainBundle\\\\Validation\\\\Validator\\\\ValidPhonenumber\\:\\:validate\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Validation/Validator/ValidPhonenumber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$constraint \\(Chill\\\\MainBundle\\\\Validation\\\\Constraint\\\\PhonenumberConstraint\\) of method Chill\\\\MainBundle\\\\Validation\\\\Validator\\\\ValidPhonenumber\\:\\:validate\\(\\) should be contravariant with parameter \\$constraint \\(Symfony\\\\Component\\\\Validator\\\\Constraint\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Validation/Validator/ValidPhonenumber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(object\\) of method Chill\\\\MainBundle\\\\Validator\\\\Constraints\\\\Entity\\\\UserCircleConsistencyValidator\\:\\:validate\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Validator/Constraints/Entity/UserCircleConsistencyValidator.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$constraint \\(Chill\\\\MainBundle\\\\Validator\\\\Constraints\\\\Entity\\\\UserCircleConsistency\\) of method Chill\\\\MainBundle\\\\Validator\\\\Constraints\\\\Entity\\\\UserCircleConsistencyValidator\\:\\:validate\\(\\) should be contravariant with parameter \\$constraint \\(Symfony\\\\Component\\\\Validator\\\\Constraint\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Validator/Constraints/Entity/UserCircleConsistencyValidator.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\) of method Chill\\\\MainBundle\\\\Workflow\\\\Validator\\\\EntityWorkflowCreationValidator\\:\\:validate\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Workflow/Validator/EntityWorkflowCreationValidator.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflowStep\\) of method Chill\\\\MainBundle\\\\Workflow\\\\Validator\\\\StepDestValidValidator\\:\\:validate\\(\\) should be contravariant with parameter \\$value \\(mixed\\) of method Symfony\\\\Component\\\\Validator\\\\ConstraintValidatorInterface\\:\\:validate\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Workflow/Validator/StepDestValidValidator.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$query \\(Doctrine\\\\ORM\\\\QueryBuilder\\) of method Chill\\\\PersonBundle\\\\Controller\\\\HouseholdCompositionTypeApiController\\:\\:customizeQuery\\(\\) should be contravariant with parameter \\$query \\(mixed\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\AbstractCRUDController\\:\\:customizeQuery\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/HouseholdCompositionTypeApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(Doctrine\\\\Common\\\\Collections\\\\Collection\\) of method Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\:\\:getScopes\\(\\) should be covariant with return type \\(iterable\\<Chill\\\\MainBundle\\\\Entity\\\\Scope\\>\\) of method Chill\\\\MainBundle\\\\Entity\\\\HasScopesInterface\\:\\:getScopes\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(Chill\\\\MainBundle\\\\Entity\\\\Center\\|null\\) of method Chill\\\\PersonBundle\\\\Entity\\\\Person\\:\\:getCenter\\(\\) should be covariant with return type \\(Chill\\\\MainBundle\\\\Entity\\\\Center\\) of method Chill\\\\MainBundle\\\\Entity\\\\HasCenterInterface\\:\\:getCenter\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Person.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value \\(null\\) of method Chill\\\\PersonBundle\\\\Form\\\\ChoiceLoader\\\\PersonChoiceLoader\\:\\:loadChoiceList\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoiceList\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\PersonBundle\\\\Form\\\\ChoiceLoader\\\\PersonChoiceLoader\\:\\:loadChoicesForValues\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadChoicesForValues\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$value \\(null\\) of method Chill\\\\PersonBundle\\\\Form\\\\ChoiceLoader\\\\PersonChoiceLoader\\:\\:loadValuesForChoices\\(\\) should be contravariant with parameter \\$value \\(\\(callable\\(\\)\\: mixed\\)\\|null\\) of method Symfony\\\\Component\\\\Form\\\\ChoiceList\\\\Loader\\\\ChoiceLoaderInterface\\:\\:loadValuesForChoices\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$viewData \\(Doctrine\\\\Common\\\\Collections\\\\Collection\\) of method Chill\\\\PersonBundle\\\\Form\\\\DataMapper\\\\PersonAltNameDataMapper\\:\\:mapFormsToData\\(\\) should be contravariant with parameter \\$viewData \\(mixed\\) of method Symfony\\\\Component\\\\Form\\\\DataMapperInterface\\:\\:mapFormsToData\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/DataMapper/PersonAltNameDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$limit \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$limit \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$offset \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$offset \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$limit \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\Household\\\\HouseholdCompositionRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$limit \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/Household/HouseholdCompositionRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$offset \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\Household\\\\HouseholdCompositionRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$offset \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/Household/HouseholdCompositionRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$limit \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\Household\\\\HouseholdCompositionRepositoryInterface\\:\\:findBy\\(\\) should be contravariant with parameter \\$limit \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/Household/HouseholdCompositionRepositoryInterface.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$offset \\(int\\) of method Chill\\\\PersonBundle\\\\Repository\\\\Household\\\\HouseholdCompositionRepositoryInterface\\:\\:findBy\\(\\) should be contravariant with parameter \\$offset \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/Household/HouseholdCompositionRepositoryInterface.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\EvaluationRepository\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/EvaluationRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\EvaluationRepositoryInterface\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/EvaluationRepositoryInterface.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\GoalRepository\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/GoalRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\ResultRepository\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/ResultRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\SocialActionRepository\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/SocialActionRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(class\\-string\\) of method Chill\\\\PersonBundle\\\\Repository\\\\SocialWork\\\\SocialIssueRepository\\:\\:getClassName\\(\\) should be covariant with return type \\(class\\-string\\<object\\>\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:getClassName\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/SocialWork/SocialIssueRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationDocument\\) of method Chill\\\\PersonBundle\\\\Security\\\\Authorization\\\\AccompanyingPeriodWorkEvaluationDocumentVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Security/Authorization/AccompanyingPeriodWorkEvaluationDocumentVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluation\\) of method Chill\\\\PersonBundle\\\\Security\\\\Authorization\\\\AccompanyingPeriodWorkEvaluationVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Security/Authorization/AccompanyingPeriodWorkEvaluationVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWork\\) of method Chill\\\\PersonBundle\\\\Security\\\\Authorization\\\\AccompanyingPeriodWorkVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Security/Authorization/AccompanyingPeriodWorkVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$period \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\|null\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodDocGenNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$origin \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\Origin\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodOriginNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodOriginNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodOriginNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodOriginNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$participation \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriodParticipation\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodParticipationNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodParticipationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodParticipationNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodParticipationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodResourceNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodResourceNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodResourceNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodResourceNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkDenormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareDenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkEvaluationDenormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkEvaluationDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareDenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkEvaluationDenormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationDenormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluation\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkEvaluationNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkEvaluationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWork\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\AccompanyingPeriodWorkNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/AccompanyingPeriodWorkNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\MembersEditorNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\MembersEditorNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/MembersEditorNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonDocGenNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$person \\(Chill\\\\PersonBundle\\\\Entity\\\\Person\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonJsonNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonJsonNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonJsonNormalizer\\:\\:denormalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:denormalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\PersonJsonNormalizer\\:\\:supportsDenormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\DenormalizerInterface\\:\\:supportsDenormalization\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonJsonNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$relation \\(Chill\\\\PersonBundle\\\\Entity\\\\Relationships\\\\Relationship\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\RelationshipDocGenNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/RelationshipDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\RelationshipDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/RelationshipDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\RelationshipDocGenNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/RelationshipDocGenNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\SocialActionNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\SocialActionNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialActionNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\SocialIssueNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\SocialIssueNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\ContextAwareNormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$format \\(string\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\SocialIssueNormalizer\\:\\:supportsNormalization\\(\\) should be contravariant with parameter \\$format \\(string\\|null\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:supportsNormalization\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\) of method Chill\\\\PersonBundle\\\\Serializer\\\\Normalizer\\\\WorkflowNormalizer\\:\\:normalize\\(\\) should be contravariant with parameter \\$object \\(mixed\\) of method Symfony\\\\Component\\\\Serializer\\\\Normalizer\\\\NormalizerInterface\\:\\:normalize\\(\\)$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Serializer/Normalizer/WorkflowNormalizer.php | ||||
|  | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationDocument\\) of method Chill\\\\PersonBundle\\\\Workflow\\\\AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler\\:\\:getRelatedObjects\\(\\) should be contravariant with parameter \\$object \\(object\\) of method Chill\\\\MainBundle\\\\Workflow\\\\EntityWorkflowHandlerInterface\\:\\:getRelatedObjects\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluation\\) of method Chill\\\\PersonBundle\\\\Workflow\\\\AccompanyingPeriodWorkEvaluationWorkflowHandler\\:\\:getRelatedObjects\\(\\) should be contravariant with parameter \\$object \\(object\\) of method Chill\\\\MainBundle\\\\Workflow\\\\EntityWorkflowHandlerInterface\\:\\:getRelatedObjects\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkEvaluationWorkflowHandler.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object \\(Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodWork\\) of method Chill\\\\PersonBundle\\\\Workflow\\\\AccompanyingPeriodWorkWorkflowHandler\\:\\:getRelatedObjects\\(\\) should be contravariant with parameter \\$object \\(object\\) of method Chill\\\\MainBundle\\\\Workflow\\\\EntityWorkflowHandlerInterface\\:\\:getRelatedObjects\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Workflow/AccompanyingPeriodWorkWorkflowHandler.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(Chill\\\\MainBundle\\\\Entity\\\\Center\\|null\\) of method Chill\\\\TaskBundle\\\\Entity\\\\AbstractTask\\:\\:getCenter\\(\\) should be covariant with return type \\(Chill\\\\MainBundle\\\\Entity\\\\Center\\) of method Chill\\\\MainBundle\\\\Entity\\\\HasCenterInterface\\:\\:getCenter\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Entity/AbstractTask.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Return type \\(Chill\\\\MainBundle\\\\Entity\\\\Scope\\|null\\) of method Chill\\\\TaskBundle\\\\Entity\\\\AbstractTask\\:\\:getScope\\(\\) should be covariant with return type \\(Chill\\\\MainBundle\\\\Entity\\\\Scope\\) of method Chill\\\\MainBundle\\\\Entity\\\\HasScopeInterface\\:\\:getScope\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Entity/AbstractTask.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$entity \\(Chill\\\\ThirdPartyBundle\\\\Entity\\\\ThirdParty\\) of method Chill\\\\ThirdPartyBundle\\\\Controller\\\\ThirdPartyController\\:\\:onPostFetchEntity\\(\\) should be contravariant with parameter \\$entity \\(mixed\\) of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:onPostFetchEntity\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Controller/ThirdPartyController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$createdAt \\(DateTimeImmutable\\) of method Chill\\\\ThirdPartyBundle\\\\Entity\\\\ThirdParty\\:\\:setCreatedAt\\(\\) should be contravariant with parameter \\$datetime \\(DateTimeInterface\\) of method Chill\\\\MainBundle\\\\Doctrine\\\\Model\\\\TrackCreationInterface\\:\\:setCreatedAt\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$updatedAt \\(DateTimeImmutable\\) of method Chill\\\\ThirdPartyBundle\\\\Entity\\\\ThirdParty\\:\\:setUpdatedAt\\(\\) should be contravariant with parameter \\$datetime \\(DateTimeInterface\\) of method Chill\\\\MainBundle\\\\Doctrine\\\\Model\\\\TrackUpdateInterface\\:\\:setUpdatedAt\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Entity/ThirdParty.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$limit \\(null\\) of method Chill\\\\ThirdPartyBundle\\\\Repository\\\\ThirdPartyRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$limit \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$offset \\(null\\) of method Chill\\\\ThirdPartyBundle\\\\Repository\\\\ThirdPartyRepository\\:\\:findBy\\(\\) should be contravariant with parameter \\$offset \\(int\\|null\\) of method Doctrine\\\\Persistence\\\\ObjectRepository\\<object\\>\\:\\:findBy\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Repository/ThirdPartyRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject \\(Chill\\\\ThirdPartyBundle\\\\Entity\\\\ThirdParty\\|null\\) of method Chill\\\\ThirdPartyBundle\\\\Security\\\\Voter\\\\ThirdPartyVoter\\:\\:voteOnAttribute\\(\\) should be contravariant with parameter \\$subject \\(mixed\\) of method Symfony\\\\Component\\\\Security\\\\Core\\\\Authorization\\\\Voter\\\\Voter\\:\\:voteOnAttribute\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Security/Voter/ThirdPartyVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$document \\(Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject\\) of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:getBasename\\(\\) should be contravariant with parameter \\$document \\(ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document\\) of method ChampsLibres\\\\WopiLib\\\\Contract\\\\Service\\\\DocumentManagerInterface\\:\\:getBasename\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$document \\(Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject\\) of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:getCreationDate\\(\\) should be contravariant with parameter \\$document \\(ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document\\) of method ChampsLibres\\\\WopiLib\\\\Contract\\\\Service\\\\DocumentManagerInterface\\:\\:getCreationDate\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$document \\(Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject\\) of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:getDocumentId\\(\\) should be contravariant with parameter \\$document \\(ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document\\) of method ChampsLibres\\\\WopiLib\\\\Contract\\\\Service\\\\DocumentManagerInterface\\:\\:getDocumentId\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$document \\(Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject\\) of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:getLastModifiedDate\\(\\) should be contravariant with parameter \\$document \\(ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document\\) of method ChampsLibres\\\\WopiLib\\\\Contract\\\\Service\\\\DocumentManagerInterface\\:\\:getLastModifiedDate\\(\\)$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,676 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Controller/ActivityController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$context of method Chill\\\\ActivityBundle\\\\Timeline\\\\TimelineActivityProvider\\:\\:checkContext\\(\\) expects string, Chill\\\\MainBundle\\\\Timeline\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Timeline/TimelineActivityProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$callback of function array_map expects \\(callable\\(Chill\\\\BudgetBundle\\\\Repository\\\\ChargeType\\)\\: mixed\\)\\|null, Closure\\(Chill\\\\BudgetBundle\\\\Entity\\\\ChargeKind\\)\\: int\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$callback of function array_map expects \\(callable\\(Chill\\\\BudgetBundle\\\\Repository\\\\ResourceType\\)\\: mixed\\)\\|null, Closure\\(Chill\\\\BudgetBundle\\\\Entity\\\\ResourceKind\\)\\: int\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillBudgetBundle/Service/Summary/SummaryBudget.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$byUser of class Chill\\\\CalendarBundle\\\\Messenger\\\\Message\\\\InviteUpdateMessage constructor expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Controller/InviteApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$byUser of class Chill\\\\CalendarBundle\\\\Messenger\\\\Message\\\\CalendarRemovedMessage constructor expects Chill\\\\MainBundle\\\\Entity\\\\User\\|null, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarEntityListener.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$byUser of class Chill\\\\CalendarBundle\\\\Messenger\\\\Message\\\\CalendarMessage constructor expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarEntityListener.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$byUser of class Chill\\\\CalendarBundle\\\\Messenger\\\\Message\\\\CalendarRangeRemovedMessage constructor expects Chill\\\\MainBundle\\\\Entity\\\\User\\|null, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$byUser of class Chill\\\\CalendarBundle\\\\Messenger\\\\Message\\\\CalendarRangeMessage constructor expects Chill\\\\MainBundle\\\\Entity\\\\User\\|null, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Messenger/Doctrine/CalendarRangeEntityListener.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$token of method Chill\\\\CalendarBundle\\\\RemoteCalendar\\\\Connector\\\\MSGraph\\\\OnBehalfOfUserTokenStorage\\:\\:setToken\\(\\) expects TheNetworg\\\\OAuth2\\\\Client\\\\Token\\\\AccessToken, League\\\\OAuth2\\\\Client\\\\Token\\\\AccessTokenInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraph/OnBehalfOfUserTokenStorage.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$code of class Exception constructor expects int, array\\<string, int\\|string\\|null\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/RemoteCalendar/Connector/MSGraphRemoteCalendarConnector.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$offset of method Chill\\\\CalendarBundle\\\\Repository\\\\CalendarRepository\\:\\:findBy\\(\\) expects int\\|null, array\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCalendarBundle/Repository/CalendarRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$prefix of function uniqid expects string, int\\<0, max\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Form/Type/ChoicesListType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$callback of function array_filter expects callable\\(Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadataInterface\\)\\: mixed, Closure\\(Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadata\\)\\: bool given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$metadata of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:normalizeNullData\\(\\) expects Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\ClassMetadata, Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\ClassMetadataInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$attributes of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:normalizeNullData\\(\\) expects array\\<Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadata\\>, array\\<Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadataInterface\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#5 \\$metadata of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:normalizeObject\\(\\) expects Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\ClassMetadata, Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\ClassMetadataInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#6 \\$attributes of method Chill\\\\DocGeneratorBundle\\\\Serializer\\\\Normalizer\\\\DocGenObjectNormalizer\\:\\:normalizeObject\\(\\) expects array\\<Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadata\\>, array\\<Symfony\\\\Component\\\\Serializer\\\\Mapping\\\\AttributeMetadataInterface\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocGeneratorBundle/Serializer/Normalizer/DocGenObjectNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Controller/DocumentPersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$value of function count expects array\\|Countable, Chill\\\\MainBundle\\\\Entity\\\\Center given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/EventController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$participations of method Chill\\\\EventBundle\\\\Controller\\\\ParticipationController\\:\\:createEditFormMultiple\\(\\) expects ArrayIterator, Traversable given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillEventBundle/Controller/ParticipationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$callback of function call_user_func expects callable\\(\\)\\: mixed, null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$previous of class Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\BadRequestHttpException constructor expects Throwable\\|null, int given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$code of class Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\BadRequestHttpException constructor expects int, Symfony\\\\Component\\\\Serializer\\\\Exception\\\\NotEncodableValueException given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$code of class Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\BadRequestHttpException constructor expects int, Symfony\\\\Component\\\\Serializer\\\\Exception\\\\UnexpectedValueException given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$formClass of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:createFormFor\\(\\) expects string\\|null, Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\type\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$scope of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\Scope\\|null, Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\Scope\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$name of method Chill\\\\MainBundle\\\\Entity\\\\Country\\:\\:setName\\(\\) expects string, array\\<int\\|string, string\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, Chill\\\\MainBundle\\\\Entity\\\\the given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$alias of method Chill\\\\MainBundle\\\\Export\\\\ExportManager\\:\\:getExport\\(\\) expects string, Symfony\\\\Component\\\\HttpFoundation\\\\Request given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$alias of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:exportFormStep\\(\\) expects string, Symfony\\\\Component\\\\HttpFoundation\\\\Request given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$alias of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:formatterFormStep\\(\\) expects string, Symfony\\\\Component\\\\HttpFoundation\\\\Request given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$alias of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:forwardToGenerate\\(\\) expects string, Symfony\\\\Component\\\\HttpFoundation\\\\Request given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$alias of method Chill\\\\MainBundle\\\\Controller\\\\ExportController\\:\\:selectCentersStep\\(\\) expects string, Symfony\\\\Component\\\\HttpFoundation\\\\Request given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/ExportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:countUnreadByUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:findUnreadByUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$addressee of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:countAllForAttendee\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$addressee of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:findAllForAttendee\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$sender of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:countAllForSender\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$sender of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:findAllForSender\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:countUnreadByUserWhereAddressee\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Repository\\\\NotificationRepository\\:\\:countUnreadByUserWhereSender\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/NotificationController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PasswordController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$token of class Chill\\\\MainBundle\\\\Security\\\\PasswordRecover\\\\PasswordRecoverEvent constructor expects Chill\\\\MainBundle\\\\Security\\\\PasswordRecover\\\\type\\|null, string given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PasswordController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$ip of class Chill\\\\MainBundle\\\\Security\\\\PasswordRecover\\\\PasswordRecoverEvent constructor expects Chill\\\\MainBundle\\\\Security\\\\PasswordRecover\\\\type\\|null, string\\|null given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PasswordController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$context of method Chill\\\\MainBundle\\\\Timeline\\\\TimelineBuilder\\:\\:countItems\\(\\) expects Chill\\\\MainBundle\\\\Timeline\\\\unknown, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/TimelineCenterController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:addSubscriberToFinal\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:addSubscriberToStep\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:isUserSubscribedToFinal\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:isUserSubscribedToStep\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:removeSubscriberToFinal\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflow\\:\\:removeSubscriberToStep\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/WorkflowApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$place of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Configuration\\:\\:filterWidgetByPlace\\(\\) expects string, Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$place of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Configuration\\:\\:getWidgetAliasesbyPlace\\(\\) expects Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\type, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$array of function implode expects array\\|null, Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Configuration.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$place of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\WidgetFactoryInterface\\:\\:createDefinition\\(\\) expects Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\type, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$order of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\WidgetFactoryInterface\\:\\:createDefinition\\(\\) expects Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\type, float given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$place of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\WidgetFactoryInterface\\:\\:getServiceId\\(\\) expects string, Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$order of method Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\WidgetFactoryInterface\\:\\:getServiceId\\(\\) expects float, Chill\\\\MainBundle\\\\DependencyInjection\\\\Widget\\\\Factory\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Widget/Factory/AbstractWidgetFactory.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$iterator of function iterator_to_array expects Traversable, array\\<Chill\\\\MainBundle\\\\Export\\\\AggregatorInterface\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Export/ExportManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$nbAggregators of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\CSVFormatter\\:\\:appendAggregatorForm\\(\\) expects string, int\\<0, max\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Export/Formatter/CSVFormatter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$array of function array_map expects array, Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$nbAggregators of method Chill\\\\MainBundle\\\\Export\\\\Formatter\\\\SpreadSheetFormatter\\:\\:appendAggregatorForm\\(\\) expects string, int\\<0, max\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Export/Formatter/SpreadSheetFormatter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$callback of function call_user_func expects callable\\(\\)\\: mixed, null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Embeddable\\\\PrivateCommentEmbeddable\\:\\:getCommentForUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/PrivateCommentDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$em of class Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\ObjectToIdTransformer constructor expects Doctrine\\\\ORM\\\\EntityManagerInterface, Doctrine\\\\Persistence\\\\ObjectManager given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/Select2CountryType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$em of class Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\MultipleObjectsToIdTransformer constructor expects Doctrine\\\\ORM\\\\EntityManagerInterface, Doctrine\\\\Persistence\\\\ObjectManager given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$translatableStrings of method Chill\\\\MainBundle\\\\Templating\\\\TranslatableStringHelper\\:\\:localize\\(\\) expects array, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/Select2LanguageType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$datetime of class DateTime constructor expects string, Chill\\\\MainBundle\\\\Search\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Search/AbstractSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$paginator of method Chill\\\\MainBundle\\\\Search\\\\SearchApi\\:\\:fetchRawResult\\(\\) expects Chill\\\\MainBundle\\\\Pagination\\\\Paginator, Chill\\\\MainBundle\\\\Pagination\\\\PaginatorInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Search/SearchApi.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$callback of function uasort expects callable\\(Chill\\\\MainBundle\\\\Search\\\\HasAdvancedSearchForm, Chill\\\\MainBundle\\\\Search\\\\HasAdvancedSearchForm\\)\\: int, Closure\\(Chill\\\\MainBundle\\\\Search\\\\SearchInterface, Chill\\\\MainBundle\\\\Search\\\\SearchInterface\\)\\: \\-1\\|0\\|1 given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Search/SearchProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$subject of function preg_match_all expects string, Chill\\\\MainBundle\\\\Search\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Search/SearchProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object of function get_class expects object, array\\<Chill\\\\MainBundle\\\\Entity\\\\Center\\> given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/AuthorizationHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Notification\\:\\:isReadBy\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/NotificationNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Entity\\\\Embeddable\\\\PrivateCommentEmbeddable\\:\\:setCommentForUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/PrivateCommentEmbeddableNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Templating/Widget/WidgetRenderingTwig.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$context of method Chill\\\\MainBundle\\\\Timeline\\\\TimelineBuilder\\:\\:buildUnionQuery\\(\\) expects string, Chill\\\\MainBundle\\\\Timeline\\\\unknown given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$context of method Chill\\\\MainBundle\\\\Timeline\\\\TimelineProviderInterface\\:\\:getEntityTemplate\\(\\) expects Chill\\\\MainBundle\\\\Timeline\\\\type, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$phoneNumber of method Chill\\\\MainBundle\\\\Phonenumber\\\\PhoneNumberHelperInterface\\:\\:format\\(\\) expects libphonenumber\\\\PhoneNumber\\|null, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Validation/Validator/ValidPhonenumber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$transitionBy of method Chill\\\\MainBundle\\\\Entity\\\\Workflow\\\\EntityWorkflowStep\\:\\:setTransitionBy\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User\\|null, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Workflow/EventSubscriber/EntityWorkflowTransitionEventSubscriber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Actions/Remove/PersonMove.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$callback of function usort expects callable\\(mixed, mixed\\)\\: int, Closure\\(mixed, mixed\\)\\: bool given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationRepository\\:\\:countNearMaxDateByUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkEvaluationApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriod\\\\AccompanyingPeriodWorkEvaluationRepository\\:\\:findNearMaxDateByUser\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkEvaluationApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$object of static method DateTimeImmutable\\:\\:createFromMutable\\(\\) expects DateTime, DateTimeInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/HouseholdApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$callback of function usort expects callable\\(mixed, mixed\\)\\: int, Closure\\(mixed, mixed\\)\\: bool given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/HouseholdController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$previous of class Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\BadRequestHttpException constructor expects Throwable\\|null, int given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$code of class Symfony\\\\Component\\\\HttpKernel\\\\Exception\\\\BadRequestHttpException constructor expects int, Symfony\\\\Component\\\\Serializer\\\\Exception\\\\InvalidArgumentException\\|Symfony\\\\Component\\\\Serializer\\\\Exception\\\\UnexpectedValueException given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/HouseholdMemberController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$form of method Chill\\\\PersonBundle\\\\Controller\\\\PersonController\\:\\:isLastPostDataChanges\\(\\) expects Symfony\\\\Component\\\\Form\\\\Form, Symfony\\\\Component\\\\Form\\\\FormInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$precision of method Chill\\\\PersonBundle\\\\Search\\\\SimilarPersonMatcher\\:\\:matchPerson\\(\\) expects float, Chill\\\\PersonBundle\\\\Repository\\\\PersonNotDuplicateRepository given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$orderBy of method Chill\\\\PersonBundle\\\\Search\\\\SimilarPersonMatcher\\:\\:matchPerson\\(\\) expects string, float given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#4 \\$addYearComparison of method Chill\\\\PersonBundle\\\\Search\\\\SimilarPersonMatcher\\:\\:matchPerson\\(\\) expects bool, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonDuplicateController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$context of method Chill\\\\MainBundle\\\\Timeline\\\\TimelineBuilder\\:\\:countItems\\(\\) expects Chill\\\\MainBundle\\\\Timeline\\\\unknown, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/TimelinePersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$period of method Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod\\\\AccompanyingPeriodLocationHistory\\:\\:setPeriod\\(\\) expects Chill\\\\PersonBundle\\\\Entity\\\\AccompanyingPeriod, null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$now of method Chill\\\\PersonBundle\\\\Entity\\\\Household\\\\Household\\:\\:getCurrentMembers\\(\\) expects DateTimeImmutable\\|null, DateTimeInterface\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Household/Household.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$now of method Chill\\\\PersonBundle\\\\Entity\\\\Household\\\\Household\\:\\:getNonCurrentMembers\\(\\) expects DateTimeImmutable\\|null, DateTimeInterface\\|null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Household/Household.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$key of method Doctrine\\\\Common\\\\Collections\\\\Collection\\<\\(int\\|string\\),mixed\\>\\:\\:remove\\(\\) expects \\(int\\|string\\), Chill\\\\PersonBundle\\\\Entity\\\\SocialWork\\\\SocialAction given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/SocialWork/Evaluation.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$translatableStrings of method Chill\\\\MainBundle\\\\Templating\\\\TranslatableStringHelper\\:\\:localize\\(\\) expects array, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Export/Helper/ListPersonHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$callback of function call_user_func expects callable\\(\\)\\: mixed, null given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entityName of method Doctrine\\\\ORM\\\\EntityManager\\:\\:getRepository\\(\\) expects class\\-string\\<ChillPersonBundle\\:AccompanyingPeriod\\>, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Timeline/AbstractTimelineAccompanyingPeriod.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$user of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:filterReachableCenters\\(\\) expects Chill\\\\MainBundle\\\\Entity\\\\User, Symfony\\\\Component\\\\Security\\\\Core\\\\User\\\\UserInterface\\|null given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Timeline/AbstractTimelineAccompanyingPeriod.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$context of method Chill\\\\PersonBundle\\\\Timeline\\\\AbstractTimelineAccompanyingPeriod\\:\\:getBasicEntityTemplate\\(\\) expects string, Chill\\\\MainBundle\\\\Timeline\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Timeline/TimelineAccompanyingPeriodClosing.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#3 \\$context of method Chill\\\\PersonBundle\\\\Timeline\\\\AbstractTimelineAccompanyingPeriod\\:\\:getBasicEntityTemplate\\(\\) expects string, Chill\\\\MainBundle\\\\Timeline\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Timeline/TimelineAccompanyingPeriodOpening.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelperInterface\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Widget/PersonListWidget.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$className of method Doctrine\\\\Persistence\\\\ObjectManager\\:\\:getRepository\\(\\) expects class\\-string\\<ChillReportBundle\\:Report\\>, string given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entity of method Chill\\\\ReportBundle\\\\Controller\\\\ReportController\\:\\:createEditForm\\(\\) expects Chill\\\\ReportBundle\\\\Entity\\\\Report, ChillReportBundle\\:Report given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableScopes\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$em of class Chill\\\\MainBundle\\\\Form\\\\Type\\\\DataTransformer\\\\ScopeTransformer constructor expects Doctrine\\\\ORM\\\\EntityManagerInterface, Doctrine\\\\Persistence\\\\ObjectManager given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Form/ReportType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableScopes\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Form/ReportType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Search/ReportSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableScopes\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Search/ReportSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$context of method Chill\\\\ReportBundle\\\\Timeline\\\\TimelineReportProvider\\:\\:checkContext\\(\\) expects string, Chill\\\\MainBundle\\\\Timeline\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entity of method Chill\\\\ReportBundle\\\\Timeline\\\\TimelineReportProvider\\:\\:getFieldsToRender\\(\\) expects Chill\\\\ReportBundle\\\\Entity\\\\Report, Chill\\\\MainBundle\\\\Timeline\\\\type given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$entityName of method Doctrine\\\\ORM\\\\EntityManager\\:\\:getRepository\\(\\) expects class\\-string\\<ChillReportBundle\\:Report\\>, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Timeline/TimelineReportProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 6 | ||||
| 			path: src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Controller/TaskController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$keys of function array_fill_keys expects array, Chill\\\\TaskBundle\\\\Entity\\\\json given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Entity/AbstractTask.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$task of method Chill\\\\TaskBundle\\\\Entity\\\\Task\\\\SingleTaskPlaceEvent\\:\\:setTask\\(\\) expects Chill\\\\TaskBundle\\\\Entity\\\\SingleTask, Chill\\\\TaskBundle\\\\Entity\\\\AbstractTask given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Event/Lifecycle/TaskLifecycleEvent.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$repository of class Chill\\\\PersonBundle\\\\Form\\\\DataTransformer\\\\PersonToIdTransformer constructor expects Chill\\\\PersonBundle\\\\Repository\\\\PersonRepository, Doctrine\\\\ORM\\\\EntityManagerInterface given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$extras of method Knp\\\\Menu\\\\MenuItem\\:\\:setExtras\\(\\) expects array\\<string, mixed\\>, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Menu/MenuBuilder.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$event of method Symfony\\\\Contracts\\\\EventDispatcher\\\\EventDispatcherInterface\\:\\:dispatch\\(\\) expects object, string given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Security/Authorization/TaskVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#2 \\$role of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:getReachableCenters\\(\\) expects string, Symfony\\\\Component\\\\Security\\\\Core\\\\Role\\\\Role given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$storedObject of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:getContent\\(\\) expects Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject, ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$storedObject of method Chill\\\\WopiBundle\\\\Service\\\\Wopi\\\\ChillDocumentManager\\:\\:setContent\\(\\) expects Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject, ChampsLibres\\\\WopiLib\\\\Contract\\\\Entity\\\\Document given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\#1 \\$type of method Chill\\\\DocStoreBundle\\\\Entity\\\\StoredObject\\:\\:setType\\(\\) expects string\\|null, false given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillWopiBundle/src/Service/Wopi/ChillDocumentManager.php | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,6 +0,0 @@ | ||||
| parameters: | ||||
|     ignoreErrors: | ||||
|         - | ||||
|             message: "#^Call to an undefined method Chill\\\\MainBundle\\\\Controller\\\\UserController\\:\\:createEditForm\\(\\)\\.$#" | ||||
|             count: 1 | ||||
|             path: src/Bundle/ChillMainBundle/Controller/UserController.php | ||||
| @@ -1,153 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Controller/CustomFieldsGroupController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/AbstractCRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/ApiController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillUserSendRenewPasswordCodeCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Encoder\\\\EncoderFactory\\: | ||||
| 				since Symfony 5\\.3, use \\{@link PasswordHasherFactory\\} instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/SetPasswordCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/MenuController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/SearchController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/UserController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Instantiation of deprecated class Symfony\\\\Component\\\\Security\\\\Core\\\\Encoder\\\\EncoderFactory\\: | ||||
| 				since Symfony 5\\.3, use \\{@link PasswordHasherFactory\\} instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DataFixtures/ORM/LoadUsers.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/AuthorizationHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/Validation/Validator/UserUniqueEmailAndUsername.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Validator/Constraints/Entity/UserCircleConsistencyValidator.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 13 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/PersonController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method get\\(\\) of class Symfony\\\\Bundle\\\\FrameworkBundle\\\\Controller\\\\AbstractController\\: | ||||
| 				since Symfony 5\\.4, use method or constructor injection in your controller instead$# | ||||
| 			""" | ||||
| 			count: 7 | ||||
| 			path: src/Bundle/ChillReportBundle/Controller/ReportController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getUsername\\(\\) of class Chill\\\\MainBundle\\\\Entity\\\\User\\: | ||||
| 				since Symfony 5\\.3, use getUserIdentifier\\(\\) instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php | ||||
| @@ -1,91 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\ActivityBundle\\\\Repository\\\\ActivityACLAwareRepository\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Repository/ActivityACLAwareRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Entity/ActivityReasonCategory.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\AuthorizationHelper\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/AuthorizationHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\DefaultVoterHelper\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/DefaultVoterHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\DefaultVoterHelperFactory\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/DefaultVoterHelperFactory.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\MainBundle\\\\Security\\\\Authorization\\\\DefaultVoterHelperGenerator\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Authorization/DefaultVoterHelperGenerator.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Class Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcher implements deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/Resolver/CenterResolverDispatcher.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Call to deprecated method getCurrentAccompanyingPeriod\\(\\) of class Chill\\\\PersonBundle\\\\Entity\\\\Person\\: | ||||
| 				since 1\\.1 use `getOpenedAccompanyingPeriod instead$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Access to deprecated property \\$proxyAccompanyingPeriodOpenState of class Chill\\\\PersonBundle\\\\Entity\\\\Person\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillPersonBundle/Entity/Person.php | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\PersonBundle\\\\Repository\\\\AccompanyingPeriodACLAwareRepository\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriodACLAwareRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\TaskBundle\\\\Controller\\\\SingleTaskController\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php | ||||
|  | ||||
| 		- | ||||
| 			message: """ | ||||
| 				#^Parameter \\$centerResolverDispatcher of method Chill\\\\TaskBundle\\\\Form\\\\SingleTaskType\\:\\:__construct\\(\\) has typehint with deprecated interface Chill\\\\MainBundle\\\\Security\\\\Resolver\\\\CenterResolverDispatcherInterface\\: | ||||
| 				Use CenterResolverManager and its interface CenterResolverManagerInterface$# | ||||
| 			""" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Form/SingleTaskType.php | ||||
| @@ -1,387 +0,0 @@ | ||||
| parameters: | ||||
| 	ignoreErrors: | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Entity/ActivityReason.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Entity/ActivityReasonCategory.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillActivityBundle/Form/ActivityType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillBudgetBundle/Form/ChargeType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillBudgetBundle/Form/ResourceType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Command/CreateFieldsOnGroupCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/AbstractCustomField.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 4 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldChoice\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldChoice.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldDate.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldDate\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldDate.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldLongChoice\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldLongChoice.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldNumber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldNumber\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldNumber.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldText\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldText.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\CustomFieldsBundle\\\\CustomFields\\\\CustomFieldTitle\\:\\:buildForm\\(\\) should return Symfony\\\\Component\\\\Form\\\\FormTypeInterface but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/CustomFields/CustomFieldTitle.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Entity/CustomField.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Entity/CustomFieldsGroup.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillCustomFieldsBundle/Form/CustomFieldType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillDocStoreBundle/Entity/DocumentCategory.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/ChoiceLoader/EventChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\$resolver of method Chill\\\\EventBundle\\\\Form\\\\EventTypeType\\:\\:setDefaultOptions\\(\\) has invalid type Symfony\\\\Component\\\\OptionsResolver\\\\OptionsResolverInterface\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/EventTypeType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\$resolver of method Chill\\\\EventBundle\\\\Form\\\\RoleType\\:\\:setDefaultOptions\\(\\) has invalid type Symfony\\\\Component\\\\OptionsResolver\\\\OptionsResolverInterface\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/RoleType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\$resolver of method Chill\\\\EventBundle\\\\Form\\\\StatusType\\:\\:setDefaultOptions\\(\\) has invalid type Symfony\\\\Component\\\\OptionsResolver\\\\OptionsResolverInterface\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Form/StatusType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillEventBundle/Search/EventSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\EventBundle\\\\Search\\\\EventSearch\\:\\:renderResult\\(\\) should return string but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillEventBundle/Search/EventSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Casting to string something that's already string\\.$#" | ||||
| 			count: 5 | ||||
| 			path: src/Bundle/ChillFamilyMembersBundle/Entity/AbstractFamilyMember.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillFamilyMembersBundle/Form/FamilyMemberType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Parameter \\$scope of method Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\CRUDController\\:\\:getReachableCenters\\(\\) has invalid type Chill\\\\MainBundle\\\\CRUD\\\\Controller\\\\Scope\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Controller/CRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Resolver/Resolver.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\CRUD\\\\Resolver\\\\Resolver\\:\\:getConfigValue\\(\\) should return string but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/CRUD/Resolver/Resolver.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\ChillImportUsersCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillImportUsersCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillUserSendRenewPasswordCodeCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\ChillUserSendRenewPasswordCodeCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/ChillUserSendRenewPasswordCodeCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\LoadAndUpdateLanguagesCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadAndUpdateLanguagesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\LoadCountriesCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadCountriesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\LoadPostalCodesCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/LoadPostalCodesCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Command\\\\SetPasswordCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Command/SetPasswordCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PasswordController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Controller/PostalCodeController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/DependencyInjection/Widget/AbstractWidgetsCompilerPass.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Entity/Address.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Entity/User.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/ChoiceLoader/PostalCodeChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/DataMapper/AddressDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/AddressType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/AddressType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a negated boolean, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/ChillTextareaType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillMainBundle/Form/Type/DataTransformer/DateIntervalTransformer.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillMainBundle/Phonenumber/PhonenumberHelper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/PasswordRecover/PasswordRecoverEvent.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Security/PasswordRecover/TokenManager.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\MainBundle\\\\Timeline\\\\TimelineBuilder\\:\\:getTemplateData\\(\\) should return array but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillMainBundle/Timeline/TimelineBuilder.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Actions/Remove/PersonMove.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/CRUD/Controller/OneToOneEntityPersonCRUDController.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Command/ChillPersonMoveCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\PersonBundle\\\\Command\\\\ChillPersonMoveCommand\\:\\:execute\\(\\) should return int but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Command/ChillPersonMoveCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Command/ChillPersonMoveCommand.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/ChoiceLoader/PersonChoiceLoader.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/DataMapper/PersonAltNameDataMapper.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in a ternary operator condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/Type/PersonAltNameType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Form/Type/PersonPhoneType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\PersonBundle\\\\Search\\\\PersonSearch\\:\\:renderResult\\(\\) should return string but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillPersonBundle/Search/PersonSearch.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\ReportBundle\\\\DataFixtures\\\\ORM\\\\LoadReports\\:\\:getRandomChoice\\(\\) should return array\\<string\\>\\|string but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/DataFixtures/ORM/LoadReports.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillReportBundle/Export/Export/ReportList.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\ReportBundle\\\\Security\\\\Authorization\\\\ReportVoter\\:\\:supports\\(\\) should return bool but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillReportBundle/Security/Authorization/ReportVoter.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Casting to string something that's already string\\.$#" | ||||
| 			count: 3 | ||||
| 			path: src/Bundle/ChillTaskBundle/Entity/AbstractTask.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Only booleans are allowed in an if condition, mixed given\\.$#" | ||||
| 			count: 2 | ||||
| 			path: src/Bundle/ChillTaskBundle/Form/SingleTaskListType.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Repository/SingleTaskAclAwareRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Construct empty\\(\\) is not allowed\\. Use more strict comparison\\.$#" | ||||
| 			count: 5 | ||||
| 			path: src/Bundle/ChillTaskBundle/Repository/SingleTaskRepository.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\TaskBundle\\\\Timeline\\\\SingleTaskTaskLifeCycleEventTimelineProvider\\:\\:getTransitionByName\\(\\) should return Symfony\\\\Component\\\\Workflow\\\\Transition but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Timeline/SingleTaskTaskLifeCycleEventTimelineProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\TaskBundle\\\\Timeline\\\\TaskLifeCycleEventTimelineProvider\\:\\:getTransitionByName\\(\\) should return Symfony\\\\Component\\\\Workflow\\\\Transition but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillTaskBundle/Timeline/TaskLifeCycleEventTimelineProvider.php | ||||
|  | ||||
| 		- | ||||
| 			message: "#^Method Chill\\\\ThirdPartyBundle\\\\Search\\\\ThirdPartySearch\\:\\:renderResult\\(\\) should return string but return statement is missing\\.$#" | ||||
| 			count: 1 | ||||
| 			path: src/Bundle/ChillThirdPartyBundle/Search/ThirdPartySearch.php | ||||
|  | ||||
| @@ -24,14 +24,4 @@ parameters: | ||||
|  | ||||
| includes: | ||||
|     - phpstan-baseline.neon | ||||
|     - phpstan-critical.neon | ||||
|     - phpstan-deprecations.neon | ||||
|     - phpstan-types.neon | ||||
|     - phpstan-baseline-level-2.neon | ||||
|     - phpstan-baseline-level-3.neon | ||||
|     - phpstan-baseline-level-4.neon | ||||
|     - phpstan-baseline-level-5.neon | ||||
|     - phpstan-deprecations-sf54.neon | ||||
|     - phpstan-baseline-deprecations-doctrine-orm.neon | ||||
|     - phpstan-baseline-2024-05.neon | ||||
|  | ||||
|   | ||||
							
								
								
									
										1523
									
								
								psalm-baseline.xml
									
									
									
									
									
								
							
							
						
						
									
										1523
									
								
								psalm-baseline.xml
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										47
									
								
								psalm.xml
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								psalm.xml
									
									
									
									
									
								
							| @@ -1,47 +0,0 @@ | ||||
| <?xml version="1.0"?> | ||||
| <psalm | ||||
|     errorLevel="7" | ||||
|     resolveFromConfigFile="true" | ||||
|     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|     xmlns="https://getpsalm.org/schema/config" | ||||
|     xsi:schemaLocation="https://getpsalm.org/schema/config tests/app/vendor/vimeo/psalm/config.xsd" | ||||
|     errorBaseline="psalm-baseline.xml" | ||||
|     cacheDirectory="./.psalm" | ||||
| > | ||||
|     <projectFiles> | ||||
|         <directory name="src"/> | ||||
|         <ignoreFiles> | ||||
|             <directory name="./tests/"/> | ||||
|             <directory name="./node_modules/"/> | ||||
|         </ignoreFiles> | ||||
|     </projectFiles> | ||||
|  | ||||
|     <!-- suppress error around parameter bags - see https://github.com/symfony/symfony/issues/45609#issuecomment-1056816975 --> | ||||
|     <!-- maybe to desactivate with php 8.1 ? --> | ||||
|     <issueHandlers> | ||||
|         <UndefinedDocblockClass> | ||||
|             <errorLevel type="suppress"> | ||||
|                 <referencedClass name="UnitEnum"/> | ||||
|             </errorLevel> | ||||
|         </UndefinedDocblockClass> | ||||
|     </issueHandlers> | ||||
|  | ||||
|     <!-- | ||||
|     <fileExtensions> | ||||
|         <extension name=".php"/> | ||||
|         <extension name=".twig" checker="tests/app/vendor/psalm/plugin-symfony/src/Twig/TemplateFileAnalyzer.php" /> | ||||
|     </fileExtensions> | ||||
|     --> | ||||
|  | ||||
|     <plugins> | ||||
|         <pluginClass class="Psalm\PhpUnitPlugin\Plugin"/> | ||||
|         <!-- | ||||
|         <pluginClass class="Psalm\SymfonyPsalmPlugin\Plugin"> | ||||
|             <containerXml>tests/app/var/cache/dev/srcApp_KernelDevDebugContainer.xml</containerXml> | ||||
|             <stubs> | ||||
|                 <file name="vendor/symfony/dependency-injection/Loader/Configurator/ContainerConfigurator.php" /> | ||||
|             </stubs> | ||||
|         </pluginClass> | ||||
|         --> | ||||
|     </plugins> | ||||
| </psalm> | ||||
| @@ -1,64 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|     services: | ||||
|        - chill/database:latest | ||||
|       | ||||
|     before_script: | ||||
|        - composer config github-oauth.github.com $GITHUB_TOKEN | ||||
|        - php -d memory_limit=-1 /usr/local/bin/composer install --no-interaction | ||||
|        - cp  Resources/test/Fixtures/App/app/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/app/config/parameters.yml | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:fixtures:load --env=test --no-interaction | ||||
|  | ||||
| stages: | ||||
|     - deploy | ||||
|     - test | ||||
|     - build-doc | ||||
|     - deploy-doc | ||||
|  | ||||
| test:php-7.2: | ||||
|     stage: test | ||||
|     image: chill/ci-image:php-7.2 | ||||
|     <<: *test_definition | ||||
|     script: php vendor/bin/phpunit | ||||
|  | ||||
| deploy-packagist:     | ||||
|     stage: deploy     | ||||
|     image: chill/ci-image:php-7.2 | ||||
|     before_script:         | ||||
|         # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set         | ||||
|         - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi         | ||||
|         - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi     | ||||
|     script:         | ||||
|         - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}")         | ||||
|         - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
|          | ||||
| # deploy documentation | ||||
| api-doc-build: | ||||
|    stage: build-doc | ||||
|    environment: api-doc | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    before_script: | ||||
|       - mkdir api-doc | ||||
|    script: apigen generate --destination api-doc/$CI_BUILD_REF_NAME/$CI_PROJECT_NAME | ||||
|    artifacts: | ||||
|       paths: | ||||
|          - "api-doc/" | ||||
|       name: api | ||||
|       expire_in: '2h' | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|  | ||||
| api-doc-deploy: | ||||
|    stage: deploy-doc | ||||
|    image: pallet/swiftclient:latest | ||||
|    before_script: | ||||
|         # test that CONTAINER_API variable is set         | ||||
|         - if [ -z ${CONTAINER_API+x} ]; then echo "Please set CONTAINER_API variable"; exit -1;  fi | ||||
|         # go to api-doc to have and url with PROJECT/BUILD | ||||
|         - cd api-doc | ||||
|         # upload, and keep files during 1 year | ||||
|    script: "swift upload --header \"X-Delete-After: 31536000\"  $CONTAINER_API $CI_BUILD_REF_NAME/$CI_PROJECT_NAME" | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
| @@ -1,31 +0,0 @@ | ||||
|  | ||||
| Version 1.5.1 | ||||
| ============= | ||||
|  | ||||
| - [report activity count] fix error: do not show centers which are not selected in results. | ||||
|  | ||||
| Version 1.5.2 | ||||
| ============= | ||||
|  | ||||
| - [aggregate by activity type] fix translation in aggregate activity type | ||||
| - fix some translation in export | ||||
| - fix error when persons not loaded by other aggregators / filters | ||||
| - add "filter by activity type" filter | ||||
|  | ||||
| Version 1.5.3 | ||||
| ============= | ||||
|  | ||||
| - add privacy events to activity list / show / edit | ||||
|  | ||||
| Version 1.5.4 | ||||
| ============= | ||||
|  | ||||
| - [report activity]: add aggregator for activity users | ||||
| - fix bug: error when extracting activities without filter / aggregators selecting persons | ||||
|  | ||||
| Version 1.5.5 | ||||
| ============= | ||||
|  | ||||
| - [activity] replace dropdown for selecting reasons and use chillEntity for reason rendering | ||||
| - fix bug: error when trying to edit activity of which the type has been deactivated | ||||
|  | ||||
| @@ -1,10 +0,0 @@ | ||||
| # configuration for apigen  | ||||
|  | ||||
| source:     | ||||
|     - .  | ||||
|      | ||||
| exclude:     | ||||
|     - vendor/*     | ||||
|     - Test*  | ||||
|      | ||||
| title: Chill Activity Bundle | ||||
| @@ -1,40 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/activity", | ||||
|     "description": "This bundle extend chill for recording the different activities of the user", | ||||
|     "type": "symfony-bundle", | ||||
|     "license": "AGPL-3.0", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "https://github.com/Chill-project/Activity", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\ActivityBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "post-install-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ], | ||||
|         "post-update-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ] | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations", | ||||
|         "symfony-app-dir": "Test/Fixtures/App/app/" | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true | ||||
| } | ||||
| @@ -1,23 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | ||||
| <phpunit bootstrap="./Resources/test/Fixtures/App/app/autoload.php" colors="true"> | ||||
|     <testsuites> | ||||
|         <testsuite name="ChillActivityBundle test suite"> | ||||
|             <directory suffix="Test.php">./Tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <filter> | ||||
|         <whitelist> | ||||
|             <directory>./</directory> | ||||
|             <exclude> | ||||
|                 <directory>./Resources</directory> | ||||
|                 <directory>./Tests</directory> | ||||
|                 <directory>./vendor</directory> | ||||
|             </exclude> | ||||
|        </whitelist> | ||||
|     </filter> | ||||
|     <php> | ||||
|         <server name="KERNEL_DIR" value="Resources/test/Fixtures/App/app/" /> | ||||
|         <env name="SYMFONY_DEPRECATIONS_HELPER" value="weak" /> | ||||
|     </php>   | ||||
| </phpunit> | ||||
| @@ -1,30 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/budget", | ||||
|     "description": "This bundle extend chill for recording element of a budget for peoples", | ||||
|     "type": "symfony-bundle", | ||||
|     "license": "AGPL-3.0", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "https://framagit.org/Chill-project/BudgetBundle", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\BudgetBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations", | ||||
|         "symfony-app-dir": "Test/Fixtures/App/app/" | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true | ||||
| } | ||||
							
								
								
									
										11
									
								
								src/Bundle/ChillCalendarBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								src/Bundle/ChillCalendarBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,11 +0,0 @@ | ||||
| composer.lock | ||||
| vendor/* | ||||
| parameters.yml | ||||
| *~ | ||||
| *.DS_Store | ||||
| *.sass-cache | ||||
| Resources/node_modules/ | ||||
| Tests/Fixtures/App/app/config/parameters.yml | ||||
| /nbproject/private/ | ||||
| Resources/test/Fixtures/App/bootstrap.php.cache | ||||
|  | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,30 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/calendar", | ||||
|     "description": "This bundle extends chill for managing a calendar", | ||||
|     "type": "symfony-bundle", | ||||
|     "license": "AGPL-3.0-or-later", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "hhttps://gitlab.com/Chill-Projet/chill-bundles/", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\CalendarBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations", | ||||
|         "symfony-app-dir": "Test/Fixtures/App/app/" | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true | ||||
| } | ||||
							
								
								
									
										32
									
								
								src/Bundle/ChillCustomFieldsBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										32
									
								
								src/Bundle/ChillCustomFieldsBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,32 +0,0 @@ | ||||
| /web/bundles/ | ||||
| /app/cache/* | ||||
| !/app/cache/dev/security/nonces/index | ||||
| !/app/cache/prod/security/nonces/index | ||||
| /app/logs/* | ||||
| /vendor/ | ||||
| /app/config/parameters.ini | ||||
| /app/config/parameters.yml | ||||
| /app/bootstrap* | ||||
| /src/Acme/ | ||||
| /output/ | ||||
| /web/uploads/images/* | ||||
| !/web/uploads/images/index.html | ||||
| /src/Progracqteur/WikipedaleBundle/DataFixtures/ORM/Files/* | ||||
| .gitignore~ | ||||
| *~ | ||||
| composer.phar | ||||
| composer.lock | ||||
| /nbproject/private/ | ||||
| parameters.yml | ||||
| app/config/parameters.yml | ||||
| Tests/Fixtures/App/app/config/parameters.yml | ||||
| .DS_Store | ||||
| *bower_components | ||||
| bin/* | ||||
| /tmp/* | ||||
| src/Chill/CustomFieldsBundle/vendor/* | ||||
| bootstrap.php.cache | ||||
| #the file created by composer to store creds | ||||
| auth.json | ||||
| Tests/Fixtures/App/app/config/parameters.yml | ||||
|  | ||||
| @@ -1,68 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|     services: | ||||
|        - chill/database:latest | ||||
|       | ||||
|     before_script: | ||||
|        - echo "PHP version is $(php --version)" | ||||
|        - composer config github-oauth.github.com $GITHUB_TOKEN | ||||
|        - if [ $CI_BUILD_REF_NAME = "1.0" ] ; then export COMPOSER_ROOT_VERSION="1.0-dev"; else export COMPOSER_ROOT_VERSION="dev-master"; fi | ||||
|        - php -d memory_limit=-1 /usr/local/bin/composer install --no-interaction  | ||||
|        - cp  Resources/test/Fixtures/App/app/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/app/config/parameters.yml | ||||
|        - php Resources/test/Fixtures/App/app/console --env=test cache:warmup | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:fixtures:load --env=test --no-interaction | ||||
|         | ||||
| stages: | ||||
|    - deploy | ||||
|    - test | ||||
|    - build-doc | ||||
|    - deploy-doc | ||||
|     | ||||
| test:php-7.2: | ||||
|    stage: test | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    <<: *test_definition | ||||
|    script: vendor/bin/phpunit | ||||
|  | ||||
| deploy-packagist:     | ||||
|     stage: deploy     | ||||
|     image: chill/ci-image:php-7.2    | ||||
|     before_script:         | ||||
|         # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set         | ||||
|         - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi         | ||||
|         - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi     | ||||
|     script:         | ||||
|         - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}")         | ||||
|         - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
|          | ||||
| # deploy documentation | ||||
| api-doc-build: | ||||
|    stage: build-doc | ||||
|    environment: api-doc | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    before_script: | ||||
|       - mkdir api-doc | ||||
|    script: apigen generate --destination api-doc/$CI_BUILD_REF_NAME/$CI_PROJECT_NAME | ||||
|    artifacts: | ||||
|       paths: | ||||
|          - "api-doc/" | ||||
|       name: api | ||||
|       expire_in: '2h' | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|  | ||||
| api-doc-deploy: | ||||
|    stage: deploy-doc | ||||
|    image: pallet/swiftclient:latest | ||||
|    before_script: | ||||
|         # test that CONTAINER_API variable is set         | ||||
|         - if [ -z ${CONTAINER_API+x} ]; then echo "Please set CONTAINER_API variable"; exit -1;  fi | ||||
|         # go to api-doc to have and url with PROJECT/BUILD | ||||
|         - cd api-doc | ||||
|         # upload, and keep files during 1 year | ||||
|    script: "swift upload --header \"X-Delete-After: 31536000\"  $CONTAINER_API $CI_BUILD_REF_NAME/$CI_PROJECT_NAME" | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|        | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,15 +0,0 @@ | ||||
| # configuration for apigen | ||||
|  | ||||
|  | ||||
| source: | ||||
|    - . | ||||
|  | ||||
| accessLevels: ["public", "protected"] | ||||
|  | ||||
| exclude: | ||||
|    - vendor/* | ||||
|    - Resources/test/* | ||||
|    - Tests/Fixtures/* | ||||
|  | ||||
| title: Chill CustomFields Bundle | ||||
|  | ||||
| @@ -1,41 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/custom-fields", | ||||
|     "license": "AGPL-3.0", | ||||
|     "type": "symfony-bundle", | ||||
|     "description": "This bundle allow to add custom fields on entities.", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "https://github.com/Chill-project/CustomFields", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\CustomFieldsBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors" : [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop", | ||||
|             "homepage": "http://www.champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true, | ||||
|     "scripts": { | ||||
|         "post-install-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ], | ||||
|         "post-update-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ] | ||||
|     }, | ||||
|     "extra": { | ||||
|         "symfony-app-dir": "Tests/Fixtures/App/app", | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations" | ||||
|     } | ||||
| } | ||||
| @@ -1,24 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | ||||
| <phpunit bootstrap="./Resources/test/Fixtures/App/app/autoload.php" colors="true"> | ||||
|     <!-- the file "./Tests/boostrap.php" will be created on the next step --> | ||||
|     <testsuites> | ||||
|         <testsuite name="ChillCustomField test suite"> | ||||
|             <directory suffix="Test.php">./Tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <filter> | ||||
|         <whitelist> | ||||
|             <directory>./</directory> | ||||
|             <exclude> | ||||
|                 <directory>./Resources</directory> | ||||
|                 <directory>./Tests</directory> | ||||
|                 <directory>./vendor</directory> | ||||
|             </exclude> | ||||
|        </whitelist> | ||||
|     </filter> | ||||
|     <php> | ||||
|         <server name="KERNEL_DIR" value="Resources/test/Fixtures/App/app/" /> | ||||
|         <ini name="error_reporting" value="-16385"/> | ||||
|     </php>   | ||||
| </phpunit> | ||||
| @@ -1 +0,0 @@ | ||||
| php Tests/Fixtures/App/app/console.php server:run  --docroot=Tests/Fixtures/App/web/ | ||||
							
								
								
									
										11
									
								
								src/Bundle/ChillDocGeneratorBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								src/Bundle/ChillDocGeneratorBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,11 +0,0 @@ | ||||
| composer.lock | ||||
| vendor/* | ||||
| parameters.yml | ||||
| *~ | ||||
| *.DS_Store | ||||
| *.sass-cache | ||||
| Resources/node_modules/ | ||||
| Tests/Fixtures/App/app/config/parameters.yml | ||||
| /nbproject/private/ | ||||
| Resources/test/Fixtures/App/bootstrap.php.cache | ||||
|  | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,31 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/docgen", | ||||
|     "description": "This bundle extends chill for generation of documents", | ||||
|     "type": "symfony-bundle", | ||||
|     "license": "AGPL-3.0-or-later", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "hhttps://gitlab.com/Chill-Projet/chill-bundles/", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\DocGeneratorBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|         "spomky-labs/base64url": "^2" | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations", | ||||
|         "symfony-app-dir": "Test/Fixtures/App/app/" | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true | ||||
| } | ||||
							
								
								
									
										1
									
								
								src/Bundle/ChillDocStoreBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/Bundle/ChillDocStoreBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| /vendor/ | ||||
| @@ -1,25 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|     services: | ||||
|         - chill/database:latest | ||||
|     before_script: | ||||
|         - composer config github-oauth.github.com $GITHUB_TOKEN | ||||
|         - composer install | ||||
|         - cp  Resources/test/Fixtures/App/app/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/app/config/parameters.yml | ||||
|         - php Resources/test/Fixtures/App/app/console --env=test cache:warmup | ||||
|         - php Resources/test/Fixtures/App/app/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|         - php Resources/test/Fixtures/App/app/console doctrine:fixtures:load --env=test --no-interaction | ||||
|      | ||||
|  | ||||
| stages: | ||||
|    - deploy | ||||
|        | ||||
| deploy-packagist:     | ||||
|     stage: deploy     | ||||
|     image: chill/ci-image:php-7.2     | ||||
|     before_script:         | ||||
|         # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set         | ||||
|         - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi         | ||||
|         - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi     | ||||
|     script:         | ||||
|         - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}")         | ||||
|         - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
| @@ -1,39 +0,0 @@ | ||||
|  | ||||
| Version 1.5.1 | ||||
| ============= | ||||
|  | ||||
| - adding .gitlab-ci to upgrade automatically packagist | ||||
| - adding fixtures for ACL and DocumentCategory | ||||
|  | ||||
| Version 1.5.2 | ||||
| ============= | ||||
|  | ||||
| - fix some missing translations on update / create document and "any document" in list | ||||
| - use dropzone to upload a document with a better UI | ||||
|  | ||||
| You must add `"dropzone": "^5.5.1"` to your dependencies in `packages.json` at the root project. | ||||
|  | ||||
| Version 1.5.3 | ||||
| ============= | ||||
|  | ||||
| - the javascript for uploading a file now works within collections, listening to collection events. | ||||
|  | ||||
| Version 1.5.4 | ||||
| ============= | ||||
|  | ||||
| - replace default message on download button below dropzone ; | ||||
| - launch event when dropzone is initialized, to allow to customize events on dropzone; | ||||
| - add privacy events to document index / show | ||||
| - add privacy events to document edit / update | ||||
| - remove dump message | ||||
|  | ||||
| Version 1.5.5 | ||||
| ============= | ||||
|  | ||||
| - add button to remove existing document in form, and improve UI in this part | ||||
| - fix error when document is removed in form | ||||
|  | ||||
| Master branch | ||||
| ============= | ||||
|  | ||||
| - fix capitalization of person document pages | ||||
| @@ -1,15 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/chill-doc-store", | ||||
|     "description": "A Chill bundle to store documents", | ||||
|     "type": "symfony-bundle", | ||||
|     "autoload": { | ||||
|         "psr-4": { | ||||
|             "Chill\\DocStoreBundle\\": "" | ||||
|         } | ||||
|     }, | ||||
|     "require": { | ||||
|         "symfony/mime": "^4 || ^5", | ||||
|         "symfony/http-foundation": "^4" | ||||
|     }, | ||||
|     "license": "AGPL-3.0" | ||||
| } | ||||
							
								
								
									
										24
									
								
								src/Bundle/ChillEventBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										24
									
								
								src/Bundle/ChillEventBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,24 +0,0 @@ | ||||
| *~ | ||||
| # MacOS | ||||
| .DS_Store | ||||
|  | ||||
| # Bootstrap | ||||
| app/bootstrap* | ||||
|  | ||||
| # Symfony directories | ||||
| vendor/* | ||||
| */logs/* | ||||
| */cache/* | ||||
| web/uploads/* | ||||
| web/bundles/* | ||||
|  | ||||
| # Configuration files | ||||
| app/config/parameters.ini | ||||
| app/config/parameters.yml | ||||
| Tests/Fixtures/App/config/parameters.yml | ||||
|  | ||||
| # fixtures | ||||
| Resources/test/Fixtures/App/DoctrineMigrations/ | ||||
|  | ||||
| #composer | ||||
| composer.lock | ||||
| @@ -1,75 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|     services: | ||||
|         - chill/database:latest | ||||
|     before_script: | ||||
|         - composer config github-oauth.github.com $GITHUB_TOKEN | ||||
|         - php -d memory_limit=-1 /usr/local/bin/composer install | ||||
|         - cp  Resources/test/Fixtures/App/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/config/parameters.yml | ||||
|         - php Resources/test/Fixtures/App/console --env=test cache:warmup | ||||
|         - php Resources/test/Fixtures/App/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|         - php Resources/test/Fixtures/App/console doctrine:fixtures:load --env=test --no-interaction | ||||
|      | ||||
|  | ||||
| stages: | ||||
|    - test | ||||
|    - deploy | ||||
|    - build-doc | ||||
|    - deploy-doc | ||||
|  | ||||
|   | ||||
|  | ||||
|  | ||||
| test:php-5.6: | ||||
|     stage: test | ||||
|     <<: *test_definition | ||||
|     image: chill/ci-image:php-5.6 | ||||
|     script: phpunit | ||||
|      | ||||
| test:php-7: | ||||
|     stage: test | ||||
|     <<: *test_definition | ||||
|     image: chill/ci-image:php-7 | ||||
|     script: phpunit | ||||
|  | ||||
|        | ||||
| deploy-packagist:     | ||||
|     stage: deploy     | ||||
|     image: chill/ci-image:php-7     | ||||
|     before_script:         | ||||
|         # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set         | ||||
|         - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi         | ||||
|         - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi     | ||||
|     script:         | ||||
|         - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}")         | ||||
|         - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
|  | ||||
| # deploy documentation | ||||
| api-doc-build: | ||||
|    stage: build-doc | ||||
|    environment: api-doc | ||||
|    image: chill/ci-image:php-7 | ||||
|    before_script: | ||||
|       - mkdir api-doc | ||||
|    script: apigen generate --destination api-doc/$CI_BUILD_REF_NAME/$CI_PROJECT_NAME | ||||
|    artifacts: | ||||
|       paths: | ||||
|          - "api-doc/" | ||||
|       name: api | ||||
|       expire_in: '2h' | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|  | ||||
| api-doc-deploy: | ||||
|    stage: deploy-doc | ||||
|    image: pallet/swiftclient:latest | ||||
|    before_script: | ||||
|         # test that CONTAINER_API variable is set         | ||||
|         - if [ -z ${CONTAINER_API+x} ]; then echo "Please set CONTAINER_API variable"; exit -1;  fi | ||||
|         # go to api-doc to have and url with PROJECT/BUILD | ||||
|         - cd api-doc | ||||
|         # upload, and keep files during 1 year | ||||
|    script: "swift upload --header \"X-Delete-After: 31536000\"  $CONTAINER_API $CI_BUILD_REF_NAME/$CI_PROJECT_NAME" | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
| @@ -1,25 +0,0 @@ | ||||
|  | ||||
| Branch sf3 | ||||
| ========== | ||||
|  | ||||
| - fix symfony3 php depreciations ; | ||||
| - add time to event dates ; | ||||
| - add new moderator field on events ; | ||||
| - misc improvements form styles ; | ||||
| - adapt webpack config for styles sheets ; | ||||
| - add a new page 'events participation' in menu person, that list all events participation for a person ; | ||||
| - subscribe a person to an event from person context ; | ||||
| - improve message translation ; | ||||
| - add a first step to pick center in new event form ; | ||||
| - add events in history timeline ; | ||||
| - export participations list for an event ; | ||||
| - add event administration pages ; | ||||
| - add remove participation and remove event feature ; | ||||
| - fix the way the bundle compile assets ; | ||||
|     This modification will require to update Chill-Standard to the latest version. | ||||
|     At least, the file `webpack.config.js` should be upgrade [to the last  | ||||
|     version](https://framagit.org/Chill-project/Chill-Standard/-/blob/c7a7de68ec49d97c9e1481b72c1f848f9b5cb2d7/webpack.config.js) | ||||
| - fix redirection when only one participation edit ; | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,12 +0,0 @@ | ||||
| # configuration for apigen | ||||
|  | ||||
|  | ||||
| source: | ||||
|    - . | ||||
|  | ||||
| exclude: | ||||
|    - vendor/* | ||||
|    - Resources/test/* | ||||
|  | ||||
| title: Chill EventBundle | ||||
|  | ||||
| @@ -1,43 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/event", | ||||
|     "description": "This bundle extend chill software. This bundle allow to define event and participation to those events.", | ||||
|     "type": "symfony-bundle", | ||||
|     "license": "AGPL-3.0-only", | ||||
|     "keywords" : ["chill", "social work"], | ||||
|     "homepage" : "https://git.framasoft.org/Chill-project/Chill-Group", | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\EventBundle\\": "" } | ||||
|     }, | ||||
|     "support": { | ||||
|         "issues": "https://git.framasoft.org/Chill-project/Chill-Event/issues", | ||||
|         "source": "https://git.framasoft.org/Chill-project/Chill-Event", | ||||
|         "docs" :  "http://docs.chill.social", | ||||
|         "email":  "dev@listes.chill.social" | ||||
|     }, | ||||
|     "authors": [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "suggest" : { | ||||
|         "chill-project/group": "dev-master@dev" | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "post-install-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations" | ||||
|         ], | ||||
|         "post-update-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations" | ||||
|         ] | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/DoctrineMigrations" | ||||
|     }, | ||||
|     "minimum-stability": "dev", | ||||
|     "prefer-stable": true | ||||
| } | ||||
| @@ -1,23 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | ||||
| <phpunit bootstrap="./Resources/test/bootstrap.php" colors="true"> | ||||
|     <testsuites> | ||||
|         <testsuite name="ChillEventBundle test suite"> | ||||
|             <directory suffix="Test.php">./Tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <filter> | ||||
|         <whitelist> | ||||
|             <directory>./</directory> | ||||
|             <exclude> | ||||
|                 <directory>./Resources</directory> | ||||
|                 <directory>./Tests</directory> | ||||
|                 <directory>./vendor</directory> | ||||
|             </exclude> | ||||
|         </whitelist> | ||||
|     </filter> | ||||
|     <php> | ||||
|         <server name="KERNEL_DIR" value="./Resources/test/Fixtures/App/" /> | ||||
|         <env name="SYMFONY_DEPRECATIONS_HELPER" value="weak" /> | ||||
|     </php> | ||||
| </phpunit> | ||||
							
								
								
									
										34
									
								
								src/Bundle/ChillMainBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								src/Bundle/ChillMainBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,34 +0,0 @@ | ||||
| # MacOS | ||||
| .DS_Store | ||||
|  | ||||
| # Bootstrap | ||||
| app/bootstrap* | ||||
|  | ||||
| # Symfony directories | ||||
| vendor/* | ||||
| */logs/* | ||||
| */cache/* | ||||
| web/uploads/* | ||||
| web/bundles/* | ||||
|  | ||||
| # Configuration files | ||||
| app/config/parameters.ini | ||||
| app/config/parameters.yml | ||||
| Tests/Fixtures/App/config/parameters.yml | ||||
|  | ||||
| #composer | ||||
| composer.lock | ||||
| #sass-cache | ||||
| Resources/assets/gumpy/.sass-cache | ||||
| Resources/public/stylesheets/sass | ||||
| *~ | ||||
|  | ||||
| Resources/.sass-cache/ | ||||
| Resources/bower_components/ | ||||
| Resources/node_modules/ | ||||
|  | ||||
| /nbproject/private/ | ||||
|  | ||||
| # Yarn lock | ||||
| Resources/package-lock.json | ||||
| Resources/yarn.lock | ||||
| @@ -1,65 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|     services: | ||||
|         - chill/database:latest | ||||
|     before_script: | ||||
|         - composer config github-oauth.github.com $GITHUB_TOKEN | ||||
|         - composer install | ||||
|         - cp  Resources/test/Fixtures/App/app/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/app/config/parameters.yml | ||||
|         - php Resources/test/Fixtures/App/app/console --env=test cache:warmup | ||||
|         - php Resources/test/Fixtures/App/app/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|         - php Resources/test/Fixtures/App/app/console doctrine:fixtures:load --env=test --no-interaction | ||||
|      | ||||
|  | ||||
| stages: | ||||
|    - deploy | ||||
|    - test | ||||
|    - build-doc | ||||
|    - deploy-doc | ||||
|   | ||||
| test:php-7.2: | ||||
|     stage: test | ||||
|     <<: *test_definition | ||||
|     image: chill/ci-image:php-7.2 | ||||
|     script: APP_ENV=test vendor/bin/phpunit | ||||
|  | ||||
| # deploy documentation | ||||
| api-doc-build: | ||||
|    stage: build-doc | ||||
|    environment: api-doc | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    before_script: | ||||
|       - mkdir api-doc | ||||
|    script: apigen generate --destination api-doc/$CI_BUILD_REF_NAME/$CI_PROJECT_NAME | ||||
|    artifacts: | ||||
|       paths: | ||||
|          - "api-doc/" | ||||
|       name: api | ||||
|       expire_in: '2h' | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|  | ||||
| api-doc-deploy: | ||||
|    stage: deploy-doc | ||||
|    image: pallet/swiftclient:latest | ||||
|    before_script: | ||||
|         # test that CONTAINER_API variable is set         | ||||
|         - if [ -z ${CONTAINER_API+x} ]; then echo "Please set CONTAINER_API variable"; exit -1;  fi | ||||
|         # go to api-doc to have and url with PROJECT/BUILD | ||||
|         - cd api-doc | ||||
|         # upload, and keep files during 1 year | ||||
|    script: "swift upload --header \"X-Delete-After: 31536000\"  $CONTAINER_API $CI_BUILD_REF_NAME/$CI_PROJECT_NAME" | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|        | ||||
| deploy-packagist:     | ||||
|     stage: deploy     | ||||
|     image: chill/ci-image:php-7.2     | ||||
|     before_script:         | ||||
|         # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set         | ||||
|         - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi         | ||||
|         - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi     | ||||
|     script:         | ||||
|         - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}")         | ||||
|         - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
| @@ -1,158 +0,0 @@ | ||||
|  | ||||
|  | ||||
| Version 1.5.1 | ||||
| ============= | ||||
|  | ||||
| - add email to users on fixtures ; | ||||
| - spare ressource with recursive trigger on inserting user ; | ||||
| - fix error when no flags are used during edit and creation of permission group ; | ||||
|  | ||||
| Version 1.5.2 | ||||
| ============= | ||||
|  | ||||
| - allow to filters users shown by `UserPickerType` based on flags. This flags do an additional filter based on the flags assigned in permissions groups; | ||||
| - add a method to filters users by permissions groups flags in `UserRepository` | ||||
|  | ||||
| Version 1.5.3 | ||||
| ============= | ||||
|  | ||||
| - fix error when interval is hour only | ||||
|  | ||||
| Version 1.5.4 | ||||
| ============= | ||||
|  | ||||
| - layout of page "list exports" | ||||
| - create function "SIMILARITY" (see [posgtgresql documentation](https://www.postgresql.org/docs/9.6/static/pgtrgm.html))  | ||||
| - create function "OVERLAPSI", which will detect period of date overlapping, replacing NULL date by infinity or -infinity (see [postgresql page for date time function and operators](https://www.postgresql.org/docs/9.6/static/functions-datetime.html)) | ||||
| - add repository for Center class | ||||
|  | ||||
| Version 1.5.5 | ||||
| ============= | ||||
|  | ||||
| - add margin of 0.5rem beyond buttons ; | ||||
| - add a spreadsheet formatter (format xlsx, ods, csv) for lists | ||||
| - add possibility to generate DirectExport: exports without formatters, filters and aggregators ; | ||||
| - add api for grouping centers ; | ||||
| - select centers as grouped on step "pick centers" in exports ; | ||||
|  | ||||
| Version 1.5.6 | ||||
| ============= | ||||
|  | ||||
| - fix long url in report download. The exports parameters are now stored in redis. | ||||
| - add an option to allow address to be empty if street or postcode is not set. Used for embedding address in another form, when address is not required. | ||||
|  | ||||
| Version 1.5.7 | ||||
| ============= | ||||
|  | ||||
| - insert the title of the export inside the "download" page ; | ||||
| - add twig helper "print_or_message" ; | ||||
| - add twig helper for routing ; | ||||
| - add css layout for boxes ; | ||||
| - collect supplementary query parameters in SearchController ; | ||||
|  | ||||
| Version 1.5.8 | ||||
| ============= | ||||
|  | ||||
| - allow to remove interval units from DateInterval | ||||
|  | ||||
| Version 1.5.9 | ||||
| ============= | ||||
|  | ||||
| - add optionnal impersonate feature (if firewall option switch_user is true) ; | ||||
|  | ||||
| Version 1.5.10 | ||||
| ============== | ||||
|  | ||||
| - allow to group export in UI | ||||
|  | ||||
| Version 1.5.11 | ||||
| ============== | ||||
|  | ||||
| - improve return path functions and filters ; | ||||
|  | ||||
| Version 1.5.12  | ||||
| ============== | ||||
|  | ||||
| - make the redirection to admin temporarily: some admin experienced cache problems (403 error)  when they switched from one admin account to a non-admin one ; | ||||
|  | ||||
| Version 1.5.13 | ||||
| ============== | ||||
|  | ||||
| - allow to customize logo on login screen and main layout ; | ||||
| - remove desert background image on page, handle it from cache in login screen;  | ||||
|  | ||||
| Version 1.5.14 | ||||
| ============== | ||||
|  | ||||
| - fix errors in pagination | ||||
| - fix search: usage of parenthesis | ||||
| - add DQL function REPLACE for replacing in strings: "REPLACE(string, 'from', 'to')" | ||||
| - add function to format phonenumber | ||||
| - improve `chill_print_or_message` to support date time; | ||||
| - add a module `show_hide` for javascript; | ||||
| - load assets using functions ;  | ||||
| - load a `runtime.js` assets for objects shared by webpack ; | ||||
|  | ||||
| Version 1.5.15 | ||||
| ============== | ||||
|  | ||||
| - create an api for rendering entities | ||||
| - css: render the placeholder in expanded choice item as italic (the "no specified" choice") | ||||
| - css: add an extra space around choices expanded widget | ||||
| - add Tabs parametric feature to easily render tabs panels | ||||
| - css: add a margin on the button "delete entry" in collection | ||||
| - module `show_hide`: add the possibility to launch a show hide manually and not on page loading. Useful when show/hide occurs in collection. | ||||
| - module `show_hide`: add events to module | ||||
| - [phonenumber validation] allow to validate against mobile **or** landline/voip phonenumbers; | ||||
| - [phonenumber validation & format] format and validation does not make the app fail when network is not available; | ||||
|  | ||||
| Version 1.5.16 | ||||
| ============== | ||||
|  | ||||
| - [translation] in french, replace "Modifier" by "Enregistrer" in the edit form | ||||
| - [entity render] do not throw an exception when null element are passed to `chill_entity_render_box` and `chill_entity_render_string` | ||||
|  | ||||
| Version 1.5.17 | ||||
| ============== | ||||
|  | ||||
| - [chill entity render] fix error when fallback to default entity render (usage of `__toString()`) | ||||
| - [CRUD] add step delete | ||||
| - [CRUD] check that action exists before inserting them in edit and view template | ||||
| - [CRUD] fix error when no crud are created | ||||
|  | ||||
| Version 1.5.18 | ||||
| ============== | ||||
|  | ||||
| - [webpack] add namespace for import sass ; | ||||
| - [activity] move activity.scss to own bundle ; | ||||
|  | ||||
| Version 1.5.19 | ||||
| ============== | ||||
|  | ||||
| - [address] add a "homeless" characteristic to addresses ; | ||||
|  | ||||
| Version 1.5.20 | ||||
| ============== | ||||
|  | ||||
| - [CRUD] make index query more abstract. | ||||
|  | ||||
|     Improve build and count query in default index action to be customized  | ||||
|     in one dedicated method. | ||||
|  | ||||
| Version 1.5.21 | ||||
| ============== | ||||
|  | ||||
| - [Export list] improve alignment of last line | ||||
| - [CRUD] Forward query parameters when pushing button "save and new" in "create" page; | ||||
| - [Show/hide] Take selects input into account; | ||||
|  | ||||
| Version 1.5.23 | ||||
| ============== | ||||
|  | ||||
| - [address] allow to add custom fields to addresses | ||||
|  | ||||
| Version 1.5.24 | ||||
| ============== | ||||
|  | ||||
| - [bugfix] add missing migration files | ||||
|  | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,13 +0,0 @@ | ||||
| # configuration for apigen | ||||
|  | ||||
|  | ||||
| source: | ||||
|    - . | ||||
|  | ||||
| exclude: | ||||
|    - vendor/* | ||||
|    - Tests/* | ||||
|    - Resource/tests/* | ||||
|  | ||||
| title: Chill MainBundle | ||||
|  | ||||
| @@ -1,49 +0,0 @@ | ||||
| { | ||||
|     "name": "chill-project/main", | ||||
|     "license": "AGPL-3.0", | ||||
|     "type": "symfony-bundle", | ||||
|     "description": "The main bundle for the Chill App", | ||||
|     "keywords" : ["chill", "social work", "software for social service"], | ||||
|     "homepage" : "http://chill.social", | ||||
|     "support": { | ||||
|         "email": "dev@lists.chill.social", | ||||
|         "issues": "https://git.framasoft.org/Chill-project/Chill-Main/issues", | ||||
|         "sources": "https://git.framasoft.org/Chill-project/Chill-Main", | ||||
|         "docs": "http://docs.chill.social" | ||||
|     }, | ||||
|     "autoload": { | ||||
|         "psr-4": { "Chill\\MainBundle\\": "" } | ||||
|     }, | ||||
|     "autoload-dev": { | ||||
|         "classmap": [ "Resources/test/Fixtures/App/app/AppKernel.php" ] | ||||
|     }, | ||||
|     "authors" : [ | ||||
|         { | ||||
|             "name": "Champs-Libres", | ||||
|             "email": "info@champs-libres.coop", | ||||
|             "homepage": "http://www.champs-libres.coop" | ||||
|         } | ||||
|     ], | ||||
|     "require": { | ||||
|         "league/csv": "^9.6", | ||||
|         "phpoffice/phpspreadsheet": "~1.2", | ||||
|         "odolbeau/phone-number-bundle": "^3.6" | ||||
|     }, | ||||
|     "require-dev": { | ||||
|     }, | ||||
|     "scripts": { | ||||
|         "post-install-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ], | ||||
|         "post-update-cmd": [ | ||||
|             "ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations", | ||||
|             "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" | ||||
|         ] | ||||
|     }, | ||||
|     "extra": { | ||||
|         "app-migrations-dir": "Resources/test/Fixtures/App/app/DoctrineMigrations", | ||||
|         "symfony-app-dir": "Tests/Fixtures/App/" | ||||
|     }, | ||||
|     "prefer-stable": true | ||||
| } | ||||
| @@ -1,14 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8" ?> | ||||
| <phpdoc> | ||||
|   <parser> | ||||
|     <target>data/output</target> | ||||
|     <default-package-name>Chill\MainBundle</default-package-name> | ||||
|   </parser> | ||||
|   <transformer> | ||||
|     <target>data/output</target> | ||||
|   </transformer> | ||||
|   <files> | ||||
|     <directory>.</directory> | ||||
|     <ignore>Tests/Fixtures/App/AppKernel.php</ignore> | ||||
|   </files> | ||||
| </phpdoc> | ||||
| @@ -1,24 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
|  | ||||
| <phpunit bootstrap="./vendor/autoload.php" colors="true"> | ||||
|     <testsuites> | ||||
|         <testsuite name="ChillMain test suite"> | ||||
|             <directory suffix="Test.php">./Tests</directory> | ||||
|         </testsuite> | ||||
|     </testsuites> | ||||
|     <filter> | ||||
|         <whitelist> | ||||
|             <directory>./</directory> | ||||
|             <exclude> | ||||
|                 <directory>./Resources</directory> | ||||
|                 <directory>./Tests</directory> | ||||
|                 <directory>./vendor</directory> | ||||
|             </exclude> | ||||
|         </whitelist> | ||||
|     </filter> | ||||
|     <php> | ||||
|         <server name="KERNEL_DIR" value="./Resources/test/Fixtures/App/app" /> | ||||
|         <env name="SYMFONY_DEPRECATIONS_HELPER" value="weak" /> | ||||
|         <env name="APP_ENV" value="test" /> | ||||
|     </php> | ||||
| </phpunit> | ||||
| @@ -1,19 +0,0 @@ | ||||
| ; top-most EditorConfig file | ||||
| root = true | ||||
|  | ||||
| ; Unix-style newlines | ||||
| [*] | ||||
| charset = utf-8 | ||||
| end_of_line = LF | ||||
| insert_final_newline = true | ||||
| trim_trailing_whitespace = true | ||||
|  | ||||
| [*.{php,html,twig}] | ||||
| indent_style = space | ||||
| indent_size = 4 | ||||
|  | ||||
| [*.md] | ||||
| max_line_length = 80 | ||||
|  | ||||
| [COMMIT_EDITMSG] | ||||
| max_line_length = 0 | ||||
							
								
								
									
										11
									
								
								src/Bundle/ChillPersonBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								src/Bundle/ChillPersonBundle/.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,11 +0,0 @@ | ||||
| composer.lock | ||||
| vendor/* | ||||
| parameters.yml | ||||
| *~ | ||||
| *.DS_Store | ||||
| *.sass-cache | ||||
| Resources/node_modules/ | ||||
| Tests/Fixtures/App/app/config/parameters.yml | ||||
| /nbproject/private/ | ||||
| Resources/test/Fixtures/App/bootstrap.php.cache | ||||
|  | ||||
| @@ -1,64 +0,0 @@ | ||||
| .test_definition: &test_definition | ||||
|    services: | ||||
|        - chill/database:latest | ||||
|    before_script:  | ||||
|        - if [ -z ${GITHUB_TOKEN+x} ]; then composer config github-oauth.github.com $GITHUB_TOKEN; fi | ||||
|        - php -d memory_limit=-1 /usr/local/bin/composer install --no-interaction  | ||||
|        - cp  Resources/test/Fixtures/App/app/config/parameters.gitlab-ci.yml Resources/test/Fixtures/App/app/config/parameters.yml | ||||
|        - php Resources/test/Fixtures/App/app/console --env=test cache:warmup | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:migrations:migrate --env=test --no-interaction | ||||
|        - php Resources/test/Fixtures/App/app/console doctrine:fixtures:load --env=test --no-interaction | ||||
|  | ||||
| stages: | ||||
|    - deploy | ||||
|    - test | ||||
|    - build-doc | ||||
|    - deploy-doc | ||||
|  | ||||
| test:php-7.2: | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    stage: test | ||||
|    <<: *test_definition | ||||
|    script: APP_ENV=test php vendor/bin/phpunit | ||||
|  | ||||
| deploy-packagist: | ||||
|    stage: deploy | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    before_script:  | ||||
|        # test that PACKAGIST USERNAME and PACKAGIST_TOKEN variable are set | ||||
|        - if [ -z ${PACKAGIST_USERNAME+x} ]; then echo "Please set PACKAGIST_USERNAME variable"; exit -1;  fi | ||||
|        - if [ -z ${PACKAGIST_TOKEN+x} ]; then echo "Please set PACKAGIST_TOKEN variable";  exit -1; fi | ||||
|    script: | ||||
|        - STATUSCODE=$(curl -XPOST -H'content-type:application/json' "https://packagist.org/api/update-package?username=$PACKAGIST_USERNAME&apiToken=$PACKAGIST_TOKEN" -d"{\"repository\":{\"url\":\"$CI_PROJECT_URL.git\"}}" --silent --output /dev/stderr --write-out "%{http_code}") | ||||
|        - if [ $STATUSCODE = "202" ]; then exit 0; else exit $STATUSCODE; fi | ||||
|         | ||||
| # deploy documentation | ||||
| api-doc-build: | ||||
|    stage: build-doc | ||||
|    environment: api-doc | ||||
|    image: chill/ci-image:php-7.2 | ||||
|    before_script: | ||||
|       - mkdir api-doc | ||||
|    script: apigen generate --destination api-doc/$CI_BUILD_REF_NAME/$CI_PROJECT_NAME | ||||
|    artifacts: | ||||
|       paths: | ||||
|          - "api-doc/" | ||||
|       name: api | ||||
|       expire_in: '2h' | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
|  | ||||
| api-doc-deploy: | ||||
|    stage: deploy-doc | ||||
|    image: pallet/swiftclient:latest | ||||
|    before_script: | ||||
|         # test that CONTAINER_API variable is set         | ||||
|         - if [ -z ${CONTAINER_API+x} ]; then echo "Please set CONTAINER_API variable"; exit -1;  fi | ||||
|         # go to api-doc to have and url with PROJECT/BUILD | ||||
|         - cd api-doc | ||||
|         # upload, and keep files during 1 year | ||||
|    script: "swift upload --header \"X-Delete-After: 31536000\"  $CONTAINER_API $CI_BUILD_REF_NAME/$CI_PROJECT_NAME" | ||||
|    only: | ||||
|       - master | ||||
|       - tags | ||||
| @@ -1,117 +0,0 @@ | ||||
|  | ||||
| Version 1.5.1 | ||||
| ============= | ||||
|  | ||||
| - Improve import of person to allow multiple centers by file ; | ||||
| - Launch an event on person import ; | ||||
| - Allow person to have a `null` gender ; | ||||
| - Allow filters and aggregator to handle null gender ; | ||||
| - remove inexistant `person.css` file | ||||
| - fix bug in accompanying person validation | ||||
|  | ||||
| Version 1.5.2 | ||||
| ============== | ||||
|  | ||||
| - Add an column with fullname canonical (lowercase and unaccent) to persons entity ; | ||||
| - Add a trigram index on fullname canonical ; | ||||
| - Add a "similar person matcher", which allow to detect person with similar names when adding a person ; | ||||
| - Add a research of persons by fuzzy name, returning result with a similarity of 0.15 ; | ||||
|  | ||||
| Thanks to @matla :-) | ||||
|  | ||||
| Version 1.5.3 | ||||
| ============= | ||||
|  | ||||
| - add filtering on accompanying period  | ||||
| - fix problems in gender filter | ||||
|  | ||||
| Version 1.5.4 | ||||
| ============= | ||||
|  | ||||
| - add filenumber in person header | ||||
|  | ||||
| Version 1.5.5 | ||||
| ============= | ||||
|  | ||||
| - Fix bug in accompanying period filter | ||||
|  | ||||
| Version 1.5.6 | ||||
| ============= | ||||
|  | ||||
| - Update address validation | ||||
| - Add command to move person and all data of a person to a new one, and delete the old one. | ||||
|  | ||||
| Version 1.5.7 | ||||
| ============= | ||||
|  | ||||
| - fix error on macro renderPerson / withLink not taken into account | ||||
| - add a link between accompanying person and user | ||||
| - add an icon when the file is opened / closed in result list, and in person rendering macro | ||||
| - improve command to move person and all data: allow to delete some entities during move and add events | ||||
|  | ||||
| Version 1.5.8 | ||||
| ============= | ||||
|  | ||||
| -  add search by phonenumber, with a custom SearchInterface | ||||
|     | ||||
|    This can be activated or desactivated by config: | ||||
|  | ||||
|    ``` | ||||
|    chill_person: | ||||
|        enabled:              true | ||||
|        search: | ||||
|            enabled:              true | ||||
|  | ||||
|            # enable search by phone. 'always' show the result on every result. 'on-domain' will show the result only if the domain is given in the search box. 'never' disable this feature | ||||
|            search_by_phone:      on-domain # One of "always"; "on-domain"; "never" | ||||
|    ``` | ||||
| -  format phonenumber using twilio (if available) ; | ||||
| -  add `record_actions` in person search result list: users can click on a little eye to open person page ; | ||||
| -  add new fields (email, mobilenumber, gender) into importPeopleFromCSV command | ||||
| - configure asset using a function | ||||
|  | ||||
|  | ||||
| Version 1.5.9 | ||||
| ============= | ||||
|  | ||||
| - create CRUD  | ||||
| - add the ability to add alt names to persons  | ||||
| - [UI] set action button bottom of edit form according to crud template | ||||
| - [closing motive] add an hierarchy for closing motives ; | ||||
| - [closing motive] Add an admin section for closing motives ; | ||||
|  | ||||
| <<<<<<< HEAD | ||||
| Version 1.5.10 | ||||
| ============== | ||||
|  | ||||
| - [closing motive] display closing motive in remark | ||||
|  | ||||
| Version 1.5.11 | ||||
| ============== | ||||
|  | ||||
| - Fix versioning constraint to chill main | ||||
|  | ||||
| Version 1.5.12 | ||||
| ============== | ||||
|  | ||||
| - [addresses] add a homeless to person's addresses, and this information into  | ||||
|     person list | ||||
|  | ||||
| Version 1.5.13 | ||||
| ============== | ||||
|  | ||||
| - [CRUD] add step delete | ||||
| - [CRUD] improve index view in person CRUD | ||||
| - [CRUD] filter by basis on person by default in EntityPersonCRUDController | ||||
| - [CRUD] override relevant part of the main CRUD template | ||||
| - [CRUD] fix redirection on person view: add a `person_id` to every page redirected. | ||||
|  | ||||
| Version 1.5.14 | ||||
| ============== | ||||
|  | ||||
| - [Accompanying period list] Fix period label in list | ||||
| - [Accompanying period list] Fix label of closing motive | ||||
| - [Person details] Add an "empty" statement on place of birth | ||||
| - [Person list] Add a lock/unlock icon instead of open/closed folder in result list; | ||||
| - [Admin closing motive] Remove links to Closing motive View; | ||||
| - [Admin closing motive] Improve icons for active in list of closing motive; | ||||
| @@ -1,661 +0,0 @@ | ||||
|                     GNU AFFERO GENERAL PUBLIC LICENSE | ||||
|                        Version 3, 19 November 2007 | ||||
|  | ||||
|  Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
|  | ||||
|                             Preamble | ||||
|  | ||||
|   The GNU Affero General Public License is a free, copyleft license for | ||||
| software and other kinds of works, specifically designed to ensure | ||||
| cooperation with the community in the case of network server software. | ||||
|  | ||||
|   The licenses for most software and other practical works are designed | ||||
| to take away your freedom to share and change the works.  By contrast, | ||||
| our General Public Licenses are intended to guarantee your freedom to | ||||
| share and change all versions of a program--to make sure it remains free | ||||
| software for all its users. | ||||
|  | ||||
|   When we speak of free software, we are referring to freedom, not | ||||
| price.  Our General Public Licenses are designed to make sure that you | ||||
| have the freedom to distribute copies of free software (and charge for | ||||
| them if you wish), that you receive source code or can get it if you | ||||
| want it, that you can change the software or use pieces of it in new | ||||
| free programs, and that you know you can do these things. | ||||
|  | ||||
|   Developers that use our General Public Licenses protect your rights | ||||
| with two steps: (1) assert copyright on the software, and (2) offer | ||||
| you this License which gives you legal permission to copy, distribute | ||||
| and/or modify the software. | ||||
|  | ||||
|   A secondary benefit of defending all users' freedom is that | ||||
| improvements made in alternate versions of the program, if they | ||||
| receive widespread use, become available for other developers to | ||||
| incorporate.  Many developers of free software are heartened and | ||||
| encouraged by the resulting cooperation.  However, in the case of | ||||
| software used on network servers, this result may fail to come about. | ||||
| The GNU General Public License permits making a modified version and | ||||
| letting the public access it on a server without ever releasing its | ||||
| source code to the public. | ||||
|  | ||||
|   The GNU Affero General Public License is designed specifically to | ||||
| ensure that, in such cases, the modified source code becomes available | ||||
| to the community.  It requires the operator of a network server to | ||||
| provide the source code of the modified version running there to the | ||||
| users of that server.  Therefore, public use of a modified version, on | ||||
| a publicly accessible server, gives the public access to the source | ||||
| code of the modified version. | ||||
|  | ||||
|   An older license, called the Affero General Public License and | ||||
| published by Affero, was designed to accomplish similar goals.  This is | ||||
| a different license, not a version of the Affero GPL, but Affero has | ||||
| released a new version of the Affero GPL which permits relicensing under | ||||
| this license. | ||||
|  | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow. | ||||
|  | ||||
|                        TERMS AND CONDITIONS | ||||
|  | ||||
|   0. Definitions. | ||||
|  | ||||
|   "This License" refers to version 3 of the GNU Affero General Public License. | ||||
|  | ||||
|   "Copyright" also means copyright-like laws that apply to other kinds of | ||||
| works, such as semiconductor masks. | ||||
|  | ||||
|   "The Program" refers to any copyrightable work licensed under this | ||||
| License.  Each licensee is addressed as "you".  "Licensees" and | ||||
| "recipients" may be individuals or organizations. | ||||
|  | ||||
|   To "modify" a work means to copy from or adapt all or part of the work | ||||
| in a fashion requiring copyright permission, other than the making of an | ||||
| exact copy.  The resulting work is called a "modified version" of the | ||||
| earlier work or a work "based on" the earlier work. | ||||
|  | ||||
|   A "covered work" means either the unmodified Program or a work based | ||||
| on the Program. | ||||
|  | ||||
|   To "propagate" a work means to do anything with it that, without | ||||
| permission, would make you directly or secondarily liable for | ||||
| infringement under applicable copyright law, except executing it on a | ||||
| computer or modifying a private copy.  Propagation includes copying, | ||||
| distribution (with or without modification), making available to the | ||||
| public, and in some countries other activities as well. | ||||
|  | ||||
|   To "convey" a work means any kind of propagation that enables other | ||||
| parties to make or receive copies.  Mere interaction with a user through | ||||
| a computer network, with no transfer of a copy, is not conveying. | ||||
|  | ||||
|   An interactive user interface displays "Appropriate Legal Notices" | ||||
| to the extent that it includes a convenient and prominently visible | ||||
| feature that (1) displays an appropriate copyright notice, and (2) | ||||
| tells the user that there is no warranty for the work (except to the | ||||
| extent that warranties are provided), that licensees may convey the | ||||
| work under this License, and how to view a copy of this License.  If | ||||
| the interface presents a list of user commands or options, such as a | ||||
| menu, a prominent item in the list meets this criterion. | ||||
|  | ||||
|   1. Source Code. | ||||
|  | ||||
|   The "source code" for a work means the preferred form of the work | ||||
| for making modifications to it.  "Object code" means any non-source | ||||
| form of a work. | ||||
|  | ||||
|   A "Standard Interface" means an interface that either is an official | ||||
| standard defined by a recognized standards body, or, in the case of | ||||
| interfaces specified for a particular programming language, one that | ||||
| is widely used among developers working in that language. | ||||
|  | ||||
|   The "System Libraries" of an executable work include anything, other | ||||
| than the work as a whole, that (a) is included in the normal form of | ||||
| packaging a Major Component, but which is not part of that Major | ||||
| Component, and (b) serves only to enable use of the work with that | ||||
| Major Component, or to implement a Standard Interface for which an | ||||
| implementation is available to the public in source code form.  A | ||||
| "Major Component", in this context, means a major essential component | ||||
| (kernel, window system, and so on) of the specific operating system | ||||
| (if any) on which the executable work runs, or a compiler used to | ||||
| produce the work, or an object code interpreter used to run it. | ||||
|  | ||||
|   The "Corresponding Source" for a work in object code form means all | ||||
| the source code needed to generate, install, and (for an executable | ||||
| work) run the object code and to modify the work, including scripts to | ||||
| control those activities.  However, it does not include the work's | ||||
| System Libraries, or general-purpose tools or generally available free | ||||
| programs which are used unmodified in performing those activities but | ||||
| which are not part of the work.  For example, Corresponding Source | ||||
| includes interface definition files associated with source files for | ||||
| the work, and the source code for shared libraries and dynamically | ||||
| linked subprograms that the work is specifically designed to require, | ||||
| such as by intimate data communication or control flow between those | ||||
| subprograms and other parts of the work. | ||||
|  | ||||
|   The Corresponding Source need not include anything that users | ||||
| can regenerate automatically from other parts of the Corresponding | ||||
| Source. | ||||
|  | ||||
|   The Corresponding Source for a work in source code form is that | ||||
| same work. | ||||
|  | ||||
|   2. Basic Permissions. | ||||
|  | ||||
|   All rights granted under this License are granted for the term of | ||||
| copyright on the Program, and are irrevocable provided the stated | ||||
| conditions are met.  This License explicitly affirms your unlimited | ||||
| permission to run the unmodified Program.  The output from running a | ||||
| covered work is covered by this License only if the output, given its | ||||
| content, constitutes a covered work.  This License acknowledges your | ||||
| rights of fair use or other equivalent, as provided by copyright law. | ||||
|  | ||||
|   You may make, run and propagate covered works that you do not | ||||
| convey, without conditions so long as your license otherwise remains | ||||
| in force.  You may convey covered works to others for the sole purpose | ||||
| of having them make modifications exclusively for you, or provide you | ||||
| with facilities for running those works, provided that you comply with | ||||
| the terms of this License in conveying all material for which you do | ||||
| not control copyright.  Those thus making or running the covered works | ||||
| for you must do so exclusively on your behalf, under your direction | ||||
| and control, on terms that prohibit them from making any copies of | ||||
| your copyrighted material outside their relationship with you. | ||||
|  | ||||
|   Conveying under any other circumstances is permitted solely under | ||||
| the conditions stated below.  Sublicensing is not allowed; section 10 | ||||
| makes it unnecessary. | ||||
|  | ||||
|   3. Protecting Users' Legal Rights From Anti-Circumvention Law. | ||||
|  | ||||
|   No covered work shall be deemed part of an effective technological | ||||
| measure under any applicable law fulfilling obligations under article | ||||
| 11 of the WIPO copyright treaty adopted on 20 December 1996, or | ||||
| similar laws prohibiting or restricting circumvention of such | ||||
| measures. | ||||
|  | ||||
|   When you convey a covered work, you waive any legal power to forbid | ||||
| circumvention of technological measures to the extent such circumvention | ||||
| is effected by exercising rights under this License with respect to | ||||
| the covered work, and you disclaim any intention to limit operation or | ||||
| modification of the work as a means of enforcing, against the work's | ||||
| users, your or third parties' legal rights to forbid circumvention of | ||||
| technological measures. | ||||
|  | ||||
|   4. Conveying Verbatim Copies. | ||||
|  | ||||
|   You may convey verbatim copies of the Program's source code as you | ||||
| receive it, in any medium, provided that you conspicuously and | ||||
| appropriately publish on each copy an appropriate copyright notice; | ||||
| keep intact all notices stating that this License and any | ||||
| non-permissive terms added in accord with section 7 apply to the code; | ||||
| keep intact all notices of the absence of any warranty; and give all | ||||
| recipients a copy of this License along with the Program. | ||||
|  | ||||
|   You may charge any price or no price for each copy that you convey, | ||||
| and you may offer support or warranty protection for a fee. | ||||
|  | ||||
|   5. Conveying Modified Source Versions. | ||||
|  | ||||
|   You may convey a work based on the Program, or the modifications to | ||||
| produce it from the Program, in the form of source code under the | ||||
| terms of section 4, provided that you also meet all of these conditions: | ||||
|  | ||||
|     a) The work must carry prominent notices stating that you modified | ||||
|     it, and giving a relevant date. | ||||
|  | ||||
|     b) The work must carry prominent notices stating that it is | ||||
|     released under this License and any conditions added under section | ||||
|     7.  This requirement modifies the requirement in section 4 to | ||||
|     "keep intact all notices". | ||||
|  | ||||
|     c) You must license the entire work, as a whole, under this | ||||
|     License to anyone who comes into possession of a copy.  This | ||||
|     License will therefore apply, along with any applicable section 7 | ||||
|     additional terms, to the whole of the work, and all its parts, | ||||
|     regardless of how they are packaged.  This License gives no | ||||
|     permission to license the work in any other way, but it does not | ||||
|     invalidate such permission if you have separately received it. | ||||
|  | ||||
|     d) If the work has interactive user interfaces, each must display | ||||
|     Appropriate Legal Notices; however, if the Program has interactive | ||||
|     interfaces that do not display Appropriate Legal Notices, your | ||||
|     work need not make them do so. | ||||
|  | ||||
|   A compilation of a covered work with other separate and independent | ||||
| works, which are not by their nature extensions of the covered work, | ||||
| and which are not combined with it such as to form a larger program, | ||||
| in or on a volume of a storage or distribution medium, is called an | ||||
| "aggregate" if the compilation and its resulting copyright are not | ||||
| used to limit the access or legal rights of the compilation's users | ||||
| beyond what the individual works permit.  Inclusion of a covered work | ||||
| in an aggregate does not cause this License to apply to the other | ||||
| parts of the aggregate. | ||||
|  | ||||
|   6. Conveying Non-Source Forms. | ||||
|  | ||||
|   You may convey a covered work in object code form under the terms | ||||
| of sections 4 and 5, provided that you also convey the | ||||
| machine-readable Corresponding Source under the terms of this License, | ||||
| in one of these ways: | ||||
|  | ||||
|     a) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by the | ||||
|     Corresponding Source fixed on a durable physical medium | ||||
|     customarily used for software interchange. | ||||
|  | ||||
|     b) Convey the object code in, or embodied in, a physical product | ||||
|     (including a physical distribution medium), accompanied by a | ||||
|     written offer, valid for at least three years and valid for as | ||||
|     long as you offer spare parts or customer support for that product | ||||
|     model, to give anyone who possesses the object code either (1) a | ||||
|     copy of the Corresponding Source for all the software in the | ||||
|     product that is covered by this License, on a durable physical | ||||
|     medium customarily used for software interchange, for a price no | ||||
|     more than your reasonable cost of physically performing this | ||||
|     conveying of source, or (2) access to copy the | ||||
|     Corresponding Source from a network server at no charge. | ||||
|  | ||||
|     c) Convey individual copies of the object code with a copy of the | ||||
|     written offer to provide the Corresponding Source.  This | ||||
|     alternative is allowed only occasionally and noncommercially, and | ||||
|     only if you received the object code with such an offer, in accord | ||||
|     with subsection 6b. | ||||
|  | ||||
|     d) Convey the object code by offering access from a designated | ||||
|     place (gratis or for a charge), and offer equivalent access to the | ||||
|     Corresponding Source in the same way through the same place at no | ||||
|     further charge.  You need not require recipients to copy the | ||||
|     Corresponding Source along with the object code.  If the place to | ||||
|     copy the object code is a network server, the Corresponding Source | ||||
|     may be on a different server (operated by you or a third party) | ||||
|     that supports equivalent copying facilities, provided you maintain | ||||
|     clear directions next to the object code saying where to find the | ||||
|     Corresponding Source.  Regardless of what server hosts the | ||||
|     Corresponding Source, you remain obligated to ensure that it is | ||||
|     available for as long as needed to satisfy these requirements. | ||||
|  | ||||
|     e) Convey the object code using peer-to-peer transmission, provided | ||||
|     you inform other peers where the object code and Corresponding | ||||
|     Source of the work are being offered to the general public at no | ||||
|     charge under subsection 6d. | ||||
|  | ||||
|   A separable portion of the object code, whose source code is excluded | ||||
| from the Corresponding Source as a System Library, need not be | ||||
| included in conveying the object code work. | ||||
|  | ||||
|   A "User Product" is either (1) a "consumer product", which means any | ||||
| tangible personal property which is normally used for personal, family, | ||||
| or household purposes, or (2) anything designed or sold for incorporation | ||||
| into a dwelling.  In determining whether a product is a consumer product, | ||||
| doubtful cases shall be resolved in favor of coverage.  For a particular | ||||
| product received by a particular user, "normally used" refers to a | ||||
| typical or common use of that class of product, regardless of the status | ||||
| of the particular user or of the way in which the particular user | ||||
| actually uses, or expects or is expected to use, the product.  A product | ||||
| is a consumer product regardless of whether the product has substantial | ||||
| commercial, industrial or non-consumer uses, unless such uses represent | ||||
| the only significant mode of use of the product. | ||||
|  | ||||
|   "Installation Information" for a User Product means any methods, | ||||
| procedures, authorization keys, or other information required to install | ||||
| and execute modified versions of a covered work in that User Product from | ||||
| a modified version of its Corresponding Source.  The information must | ||||
| suffice to ensure that the continued functioning of the modified object | ||||
| code is in no case prevented or interfered with solely because | ||||
| modification has been made. | ||||
|  | ||||
|   If you convey an object code work under this section in, or with, or | ||||
| specifically for use in, a User Product, and the conveying occurs as | ||||
| part of a transaction in which the right of possession and use of the | ||||
| User Product is transferred to the recipient in perpetuity or for a | ||||
| fixed term (regardless of how the transaction is characterized), the | ||||
| Corresponding Source conveyed under this section must be accompanied | ||||
| by the Installation Information.  But this requirement does not apply | ||||
| if neither you nor any third party retains the ability to install | ||||
| modified object code on the User Product (for example, the work has | ||||
| been installed in ROM). | ||||
|  | ||||
|   The requirement to provide Installation Information does not include a | ||||
| requirement to continue to provide support service, warranty, or updates | ||||
| for a work that has been modified or installed by the recipient, or for | ||||
| the User Product in which it has been modified or installed.  Access to a | ||||
| network may be denied when the modification itself materially and | ||||
| adversely affects the operation of the network or violates the rules and | ||||
| protocols for communication across the network. | ||||
|  | ||||
|   Corresponding Source conveyed, and Installation Information provided, | ||||
| in accord with this section must be in a format that is publicly | ||||
| documented (and with an implementation available to the public in | ||||
| source code form), and must require no special password or key for | ||||
| unpacking, reading or copying. | ||||
|  | ||||
|   7. Additional Terms. | ||||
|  | ||||
|   "Additional permissions" are terms that supplement the terms of this | ||||
| License by making exceptions from one or more of its conditions. | ||||
| Additional permissions that are applicable to the entire Program shall | ||||
| be treated as though they were included in this License, to the extent | ||||
| that they are valid under applicable law.  If additional permissions | ||||
| apply only to part of the Program, that part may be used separately | ||||
| under those permissions, but the entire Program remains governed by | ||||
| this License without regard to the additional permissions. | ||||
|  | ||||
|   When you convey a copy of a covered work, you may at your option | ||||
| remove any additional permissions from that copy, or from any part of | ||||
| it.  (Additional permissions may be written to require their own | ||||
| removal in certain cases when you modify the work.)  You may place | ||||
| additional permissions on material, added by you to a covered work, | ||||
| for which you have or can give appropriate copyright permission. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, for material you | ||||
| add to a covered work, you may (if authorized by the copyright holders of | ||||
| that material) supplement the terms of this License with terms: | ||||
|  | ||||
|     a) Disclaiming warranty or limiting liability differently from the | ||||
|     terms of sections 15 and 16 of this License; or | ||||
|  | ||||
|     b) Requiring preservation of specified reasonable legal notices or | ||||
|     author attributions in that material or in the Appropriate Legal | ||||
|     Notices displayed by works containing it; or | ||||
|  | ||||
|     c) Prohibiting misrepresentation of the origin of that material, or | ||||
|     requiring that modified versions of such material be marked in | ||||
|     reasonable ways as different from the original version; or | ||||
|  | ||||
|     d) Limiting the use for publicity purposes of names of licensors or | ||||
|     authors of the material; or | ||||
|  | ||||
|     e) Declining to grant rights under trademark law for use of some | ||||
|     trade names, trademarks, or service marks; or | ||||
|  | ||||
|     f) Requiring indemnification of licensors and authors of that | ||||
|     material by anyone who conveys the material (or modified versions of | ||||
|     it) with contractual assumptions of liability to the recipient, for | ||||
|     any liability that these contractual assumptions directly impose on | ||||
|     those licensors and authors. | ||||
|  | ||||
|   All other non-permissive additional terms are considered "further | ||||
| restrictions" within the meaning of section 10.  If the Program as you | ||||
| received it, or any part of it, contains a notice stating that it is | ||||
| governed by this License along with a term that is a further | ||||
| restriction, you may remove that term.  If a license document contains | ||||
| a further restriction but permits relicensing or conveying under this | ||||
| License, you may add to a covered work material governed by the terms | ||||
| of that license document, provided that the further restriction does | ||||
| not survive such relicensing or conveying. | ||||
|  | ||||
|   If you add terms to a covered work in accord with this section, you | ||||
| must place, in the relevant source files, a statement of the | ||||
| additional terms that apply to those files, or a notice indicating | ||||
| where to find the applicable terms. | ||||
|  | ||||
|   Additional terms, permissive or non-permissive, may be stated in the | ||||
| form of a separately written license, or stated as exceptions; | ||||
| the above requirements apply either way. | ||||
|  | ||||
|   8. Termination. | ||||
|  | ||||
|   You may not propagate or modify a covered work except as expressly | ||||
| provided under this License.  Any attempt otherwise to propagate or | ||||
| modify it is void, and will automatically terminate your rights under | ||||
| this License (including any patent licenses granted under the third | ||||
| paragraph of section 11). | ||||
|  | ||||
|   However, if you cease all violation of this License, then your | ||||
| license from a particular copyright holder is reinstated (a) | ||||
| provisionally, unless and until the copyright holder explicitly and | ||||
| finally terminates your license, and (b) permanently, if the copyright | ||||
| holder fails to notify you of the violation by some reasonable means | ||||
| prior to 60 days after the cessation. | ||||
|  | ||||
|   Moreover, your license from a particular copyright holder is | ||||
| reinstated permanently if the copyright holder notifies you of the | ||||
| violation by some reasonable means, this is the first time you have | ||||
| received notice of violation of this License (for any work) from that | ||||
| copyright holder, and you cure the violation prior to 30 days after | ||||
| your receipt of the notice. | ||||
|  | ||||
|   Termination of your rights under this section does not terminate the | ||||
| licenses of parties who have received copies or rights from you under | ||||
| this License.  If your rights have been terminated and not permanently | ||||
| reinstated, you do not qualify to receive new licenses for the same | ||||
| material under section 10. | ||||
|  | ||||
|   9. Acceptance Not Required for Having Copies. | ||||
|  | ||||
|   You are not required to accept this License in order to receive or | ||||
| run a copy of the Program.  Ancillary propagation of a covered work | ||||
| occurring solely as a consequence of using peer-to-peer transmission | ||||
| to receive a copy likewise does not require acceptance.  However, | ||||
| nothing other than this License grants you permission to propagate or | ||||
| modify any covered work.  These actions infringe copyright if you do | ||||
| not accept this License.  Therefore, by modifying or propagating a | ||||
| covered work, you indicate your acceptance of this License to do so. | ||||
|  | ||||
|   10. Automatic Licensing of Downstream Recipients. | ||||
|  | ||||
|   Each time you convey a covered work, the recipient automatically | ||||
| receives a license from the original licensors, to run, modify and | ||||
| propagate that work, subject to this License.  You are not responsible | ||||
| for enforcing compliance by third parties with this License. | ||||
|  | ||||
|   An "entity transaction" is a transaction transferring control of an | ||||
| organization, or substantially all assets of one, or subdividing an | ||||
| organization, or merging organizations.  If propagation of a covered | ||||
| work results from an entity transaction, each party to that | ||||
| transaction who receives a copy of the work also receives whatever | ||||
| licenses to the work the party's predecessor in interest had or could | ||||
| give under the previous paragraph, plus a right to possession of the | ||||
| Corresponding Source of the work from the predecessor in interest, if | ||||
| the predecessor has it or can get it with reasonable efforts. | ||||
|  | ||||
|   You may not impose any further restrictions on the exercise of the | ||||
| rights granted or affirmed under this License.  For example, you may | ||||
| not impose a license fee, royalty, or other charge for exercise of | ||||
| rights granted under this License, and you may not initiate litigation | ||||
| (including a cross-claim or counterclaim in a lawsuit) alleging that | ||||
| any patent claim is infringed by making, using, selling, offering for | ||||
| sale, or importing the Program or any portion of it. | ||||
|  | ||||
|   11. Patents. | ||||
|  | ||||
|   A "contributor" is a copyright holder who authorizes use under this | ||||
| License of the Program or a work on which the Program is based.  The | ||||
| work thus licensed is called the contributor's "contributor version". | ||||
|  | ||||
|   A contributor's "essential patent claims" are all patent claims | ||||
| owned or controlled by the contributor, whether already acquired or | ||||
| hereafter acquired, that would be infringed by some manner, permitted | ||||
| by this License, of making, using, or selling its contributor version, | ||||
| but do not include claims that would be infringed only as a | ||||
| consequence of further modification of the contributor version.  For | ||||
| purposes of this definition, "control" includes the right to grant | ||||
| patent sublicenses in a manner consistent with the requirements of | ||||
| this License. | ||||
|  | ||||
|   Each contributor grants you a non-exclusive, worldwide, royalty-free | ||||
| patent license under the contributor's essential patent claims, to | ||||
| make, use, sell, offer for sale, import and otherwise run, modify and | ||||
| propagate the contents of its contributor version. | ||||
|  | ||||
|   In the following three paragraphs, a "patent license" is any express | ||||
| agreement or commitment, however denominated, not to enforce a patent | ||||
| (such as an express permission to practice a patent or covenant not to | ||||
| sue for patent infringement).  To "grant" such a patent license to a | ||||
| party means to make such an agreement or commitment not to enforce a | ||||
| patent against the party. | ||||
|  | ||||
|   If you convey a covered work, knowingly relying on a patent license, | ||||
| and the Corresponding Source of the work is not available for anyone | ||||
| to copy, free of charge and under the terms of this License, through a | ||||
| publicly available network server or other readily accessible means, | ||||
| then you must either (1) cause the Corresponding Source to be so | ||||
| available, or (2) arrange to deprive yourself of the benefit of the | ||||
| patent license for this particular work, or (3) arrange, in a manner | ||||
| consistent with the requirements of this License, to extend the patent | ||||
| license to downstream recipients.  "Knowingly relying" means you have | ||||
| actual knowledge that, but for the patent license, your conveying the | ||||
| covered work in a country, or your recipient's use of the covered work | ||||
| in a country, would infringe one or more identifiable patents in that | ||||
| country that you have reason to believe are valid. | ||||
|  | ||||
|   If, pursuant to or in connection with a single transaction or | ||||
| arrangement, you convey, or propagate by procuring conveyance of, a | ||||
| covered work, and grant a patent license to some of the parties | ||||
| receiving the covered work authorizing them to use, propagate, modify | ||||
| or convey a specific copy of the covered work, then the patent license | ||||
| you grant is automatically extended to all recipients of the covered | ||||
| work and works based on it. | ||||
|  | ||||
|   A patent license is "discriminatory" if it does not include within | ||||
| the scope of its coverage, prohibits the exercise of, or is | ||||
| conditioned on the non-exercise of one or more of the rights that are | ||||
| specifically granted under this License.  You may not convey a covered | ||||
| work if you are a party to an arrangement with a third party that is | ||||
| in the business of distributing software, under which you make payment | ||||
| to the third party based on the extent of your activity of conveying | ||||
| the work, and under which the third party grants, to any of the | ||||
| parties who would receive the covered work from you, a discriminatory | ||||
| patent license (a) in connection with copies of the covered work | ||||
| conveyed by you (or copies made from those copies), or (b) primarily | ||||
| for and in connection with specific products or compilations that | ||||
| contain the covered work, unless you entered into that arrangement, | ||||
| or that patent license was granted, prior to 28 March 2007. | ||||
|  | ||||
|   Nothing in this License shall be construed as excluding or limiting | ||||
| any implied license or other defenses to infringement that may | ||||
| otherwise be available to you under applicable patent law. | ||||
|  | ||||
|   12. No Surrender of Others' Freedom. | ||||
|  | ||||
|   If conditions are imposed on you (whether by court order, agreement or | ||||
| otherwise) that contradict the conditions of this License, they do not | ||||
| excuse you from the conditions of this License.  If you cannot convey a | ||||
| covered work so as to satisfy simultaneously your obligations under this | ||||
| License and any other pertinent obligations, then as a consequence you may | ||||
| not convey it at all.  For example, if you agree to terms that obligate you | ||||
| to collect a royalty for further conveying from those to whom you convey | ||||
| the Program, the only way you could satisfy both those terms and this | ||||
| License would be to refrain entirely from conveying the Program. | ||||
|  | ||||
|   13. Remote Network Interaction; Use with the GNU General Public License. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, if you modify the | ||||
| Program, your modified version must prominently offer all users | ||||
| interacting with it remotely through a computer network (if your version | ||||
| supports such interaction) an opportunity to receive the Corresponding | ||||
| Source of your version by providing access to the Corresponding Source | ||||
| from a network server at no charge, through some standard or customary | ||||
| means of facilitating copying of software.  This Corresponding Source | ||||
| shall include the Corresponding Source for any work covered by version 3 | ||||
| of the GNU General Public License that is incorporated pursuant to the | ||||
| following paragraph. | ||||
|  | ||||
|   Notwithstanding any other provision of this License, you have | ||||
| permission to link or combine any covered work with a work licensed | ||||
| under version 3 of the GNU General Public License into a single | ||||
| combined work, and to convey the resulting work.  The terms of this | ||||
| License will continue to apply to the part which is the covered work, | ||||
| but the work with which it is combined will remain governed by version | ||||
| 3 of the GNU General Public License. | ||||
|  | ||||
|   14. Revised Versions of this License. | ||||
|  | ||||
|   The Free Software Foundation may publish revised and/or new versions of | ||||
| the GNU Affero General Public License from time to time.  Such new versions | ||||
| will be similar in spirit to the present version, but may differ in detail to | ||||
| address new problems or concerns. | ||||
|  | ||||
|   Each version is given a distinguishing version number.  If the | ||||
| Program specifies that a certain numbered version of the GNU Affero General | ||||
| Public License "or any later version" applies to it, you have the | ||||
| option of following the terms and conditions either of that numbered | ||||
| version or of any later version published by the Free Software | ||||
| Foundation.  If the Program does not specify a version number of the | ||||
| GNU Affero General Public License, you may choose any version ever published | ||||
| by the Free Software Foundation. | ||||
|  | ||||
|   If the Program specifies that a proxy can decide which future | ||||
| versions of the GNU Affero General Public License can be used, that proxy's | ||||
| public statement of acceptance of a version permanently authorizes you | ||||
| to choose that version for the Program. | ||||
|  | ||||
|   Later license versions may give you additional or different | ||||
| permissions.  However, no additional obligations are imposed on any | ||||
| author or copyright holder as a result of your choosing to follow a | ||||
| later version. | ||||
|  | ||||
|   15. Disclaimer of Warranty. | ||||
|  | ||||
|   THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | ||||
| APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | ||||
| HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | ||||
| OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | ||||
| THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||||
| PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | ||||
| IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | ||||
| ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
|  | ||||
|   16. Limitation of Liability. | ||||
|  | ||||
|   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||||
| WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | ||||
| THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | ||||
| GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | ||||
| USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | ||||
| DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | ||||
| PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | ||||
| EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | ||||
| SUCH DAMAGES. | ||||
|  | ||||
|   17. Interpretation of Sections 15 and 16. | ||||
|  | ||||
|   If the disclaimer of warranty and limitation of liability provided | ||||
| above cannot be given local legal effect according to their terms, | ||||
| reviewing courts shall apply local law that most closely approximates | ||||
| an absolute waiver of all civil liability in connection with the | ||||
| Program, unless a warranty or assumption of liability accompanies a | ||||
| copy of the Program in return for a fee. | ||||
|  | ||||
|                      END OF TERMS AND CONDITIONS | ||||
|  | ||||
|             How to Apply These Terms to Your New Programs | ||||
|  | ||||
|   If you develop a new program, and you want it to be of the greatest | ||||
| possible use to the public, the best way to achieve this is to make it | ||||
| free software which everyone can redistribute and change under these terms. | ||||
|  | ||||
|   To do so, attach the following notices to the program.  It is safest | ||||
| to attach them to the start of each source file to most effectively | ||||
| state the exclusion of warranty; and each file should have at least | ||||
| the "copyright" line and a pointer to where the full notice is found. | ||||
|  | ||||
|     <one line to give the program's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
|  | ||||
|     This program is free software: you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Affero General Public License as published by | ||||
|     the Free Software Foundation, either version 3 of the License, or | ||||
|     (at your option) any later version. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU Affero General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Affero General Public License | ||||
|     along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
|  | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
|  | ||||
|   If your software can interact with users remotely through a computer | ||||
| network, you should also make sure that it provides a way for users to | ||||
| get its source.  For example, if your program is a web application, its | ||||
| interface could display a "Source" link that leads users to an archive | ||||
| of the code.  There are many ways you could offer source, and different | ||||
| solutions will be better for different programs; see section 13 for the | ||||
| specific requirements. | ||||
|  | ||||
|   You should also get your employer (if you work as a programmer) or school, | ||||
| if any, to sign a "copyright disclaimer" for the program, if necessary. | ||||
| For more information on this, and how to apply and follow the GNU AGPL, see | ||||
| <http://www.gnu.org/licenses/>. | ||||
| @@ -1,43 +1,43 @@ | ||||
| import { | ||||
|   Address, | ||||
|   Center, | ||||
|   Civility, | ||||
|   DateTime, | ||||
|   User, | ||||
|   WorkflowAvailable, | ||||
|     Address, | ||||
|     Center, | ||||
|     Civility, | ||||
|     DateTime, | ||||
|     User, | ||||
|     WorkflowAvailable, | ||||
| } from "../../../ChillMainBundle/Resources/public/types"; | ||||
| import { StoredObject } from "../../../ChillDocStoreBundle/Resources/public/types"; | ||||
|  | ||||
| export interface Person { | ||||
|   id: number; | ||||
|   type: "person"; | ||||
|   text: string; | ||||
|   textAge: string; | ||||
|   firstName: string; | ||||
|   lastName: string; | ||||
|   current_household_address: Address | null; | ||||
|   birthdate: DateTime | null; | ||||
|   deathdate: DateTime | null; | ||||
|   age: number; | ||||
|   phonenumber: string; | ||||
|   mobilenumber: string; | ||||
|   email: string; | ||||
|   gender: "woman" | "man" | "other"; | ||||
|   centers: Center[]; | ||||
|   civility: Civility | null; | ||||
|   current_household_id: number; | ||||
|   current_residential_addresses: Address[]; | ||||
|     id: number; | ||||
|     type: "person"; | ||||
|     text: string; | ||||
|     textAge: string; | ||||
|     firstName: string; | ||||
|     lastName: string; | ||||
|     current_household_address: Address | null; | ||||
|     birthdate: DateTime | null; | ||||
|     deathdate: DateTime | null; | ||||
|     age: number; | ||||
|     phonenumber: string; | ||||
|     mobilenumber: string; | ||||
|     email: string; | ||||
|     gender: "woman" | "man" | "other"; | ||||
|     centers: Center[]; | ||||
|     civility: Civility | null; | ||||
|     current_household_id: number; | ||||
|     current_residential_addresses: Address[]; | ||||
| } | ||||
|  | ||||
| export interface AccompanyingPeriodWorkEvaluationDocument { | ||||
|   id: number; | ||||
|   type: "accompanying_period_work_evaluation_document"; | ||||
|   storedObject: StoredObject; | ||||
|   title: string; | ||||
|   createdAt: DateTime | null; | ||||
|   createdBy: User | null; | ||||
|   updatedAt: DateTime | null; | ||||
|   updatedBy: User | null; | ||||
|   workflows_availables: WorkflowAvailable[]; | ||||
|   workflows: object[]; | ||||
|     id: number; | ||||
|     type: "accompanying_period_work_evaluation_document"; | ||||
|     storedObject: StoredObject; | ||||
|     title: string; | ||||
|     createdAt: DateTime | null; | ||||
|     createdBy: User | null; | ||||
|     updatedAt: DateTime | null; | ||||
|     updatedBy: User | null; | ||||
|     workflows_availables: WorkflowAvailable[]; | ||||
|     workflows: object[]; | ||||
| } | ||||
|   | ||||
| @@ -1,28 +1,28 @@ | ||||
| <template> | ||||
|   <banner /> | ||||
|   <sticky-nav /> | ||||
|     <banner /> | ||||
|     <sticky-nav /> | ||||
|  | ||||
|   <h1 v-if="accompanyingCourse.step === 'DRAFT'"> | ||||
|     {{ $t("course.title.draft") }} | ||||
|   </h1> | ||||
|   <h1 v-else> | ||||
|     {{ $t("course.title.active") }} | ||||
|   </h1> | ||||
|     <h1 v-if="accompanyingCourse.step === 'DRAFT'"> | ||||
|         {{ $t("course.title.draft") }} | ||||
|     </h1> | ||||
|     <h1 v-else> | ||||
|         {{ $t("course.title.active") }} | ||||
|     </h1> | ||||
|  | ||||
|   <persons-associated /> | ||||
|   <course-location /> | ||||
|   <origin-demand /> | ||||
|   <admin-location /> | ||||
|   <requestor :is-anonymous="accompanyingCourse.requestorAnonymous" /> | ||||
|   <social-issue /> | ||||
|   <scopes /> | ||||
|   <referrer /> | ||||
|   <resources /> | ||||
|   <start-date v-if="accompanyingCourse.step.startsWith('CONFIRMED')" /> | ||||
|   <comment v-if="accompanyingCourse.step === 'DRAFT'" /> | ||||
|   <confirm v-if="accompanyingCourse.step === 'DRAFT'" /> | ||||
|     <persons-associated /> | ||||
|     <course-location /> | ||||
|     <origin-demand /> | ||||
|     <admin-location /> | ||||
|     <requestor :is-anonymous="accompanyingCourse.requestorAnonymous" /> | ||||
|     <social-issue /> | ||||
|     <scopes /> | ||||
|     <referrer /> | ||||
|     <resources /> | ||||
|     <start-date v-if="accompanyingCourse.step.startsWith('CONFIRMED')" /> | ||||
|     <comment v-if="accompanyingCourse.step === 'DRAFT'" /> | ||||
|     <confirm v-if="accompanyingCourse.step === 'DRAFT'" /> | ||||
|  | ||||
|   <!-- <div v-for="error in errorMsg" v-bind:key="error.id" class="vue-component errors alert alert-danger"> | ||||
|     <!-- <div v-for="error in errorMsg" v-bind:key="error.id" class="vue-component errors alert alert-danger"> | ||||
|        <p> | ||||
|           <span>{{ error.sta }} {{ error.txt }}</span><br> | ||||
|           <span>{{ $t(error.msg) }}</span> | ||||
| @@ -47,26 +47,26 @@ import Confirm from "./components/Confirm.vue"; | ||||
| import StartDate from "./components/StartDate.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "App", | ||||
|   components: { | ||||
|     Banner, | ||||
|     StickyNav, | ||||
|     OriginDemand, | ||||
|     AdminLocation, | ||||
|     PersonsAssociated, | ||||
|     Requestor, | ||||
|     SocialIssue, | ||||
|     CourseLocation, | ||||
|     Scopes, | ||||
|     Referrer, | ||||
|     Resources, | ||||
|     Comment, | ||||
|     Confirm, | ||||
|     StartDate, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(["accompanyingCourse", "addressContext"]), | ||||
|   }, | ||||
|     name: "App", | ||||
|     components: { | ||||
|         Banner, | ||||
|         StickyNav, | ||||
|         OriginDemand, | ||||
|         AdminLocation, | ||||
|         PersonsAssociated, | ||||
|         Requestor, | ||||
|         SocialIssue, | ||||
|         CourseLocation, | ||||
|         Scopes, | ||||
|         Referrer, | ||||
|         Resources, | ||||
|         Comment, | ||||
|         Confirm, | ||||
|         StartDate, | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState(["accompanyingCourse", "addressContext"]), | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| @@ -75,62 +75,62 @@ export default { | ||||
| $chill-accourse-context: #718596; | ||||
|  | ||||
| div#accompanying-course { | ||||
|   div.vue-component { | ||||
|     h2 { | ||||
|       margin: 1em 0.7em; | ||||
|       position: relative; | ||||
|       &:before { | ||||
|         position: absolute; | ||||
|         content: "\f142"; //ellipsis-v | ||||
|         font-family: "ForkAwesome"; | ||||
|         color: tint-color($chill-accourse-context, 10%); | ||||
|         left: -22px; | ||||
|         top: 4px; | ||||
|       } | ||||
|       a[id^="section"] { | ||||
|         position: absolute; | ||||
|         top: -2.5em; // reference for stickNav | ||||
|       } | ||||
|     } | ||||
|     padding: 0em 0em; | ||||
|     margin: 1em 0; | ||||
|     border-radius: 5px; | ||||
|     border: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|     border-left: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|     border-right: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|     dd { | ||||
|       margin-left: 1em; | ||||
|     } | ||||
|     & > div { | ||||
|       margin: 1em 3em 0; | ||||
|  | ||||
|       &.flex-table, | ||||
|       &.flex-bloc { | ||||
|         margin: 1em 0 0; | ||||
|       } | ||||
|       &.alert.to-confirm { | ||||
|         margin: 1em 0 0; | ||||
|         padding: 1em 3em; | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     div.flex-table { | ||||
|       div.item-row { | ||||
|         div.item-col:first-child { | ||||
|           flex-basis: 33%; | ||||
|     div.vue-component { | ||||
|         h2 { | ||||
|             margin: 1em 0.7em; | ||||
|             position: relative; | ||||
|             &:before { | ||||
|                 position: absolute; | ||||
|                 content: "\f142"; //ellipsis-v | ||||
|                 font-family: "ForkAwesome"; | ||||
|                 color: tint-color($chill-accourse-context, 10%); | ||||
|                 left: -22px; | ||||
|                 top: 4px; | ||||
|             } | ||||
|             a[id^="section"] { | ||||
|                 position: absolute; | ||||
|                 top: -2.5em; // reference for stickNav | ||||
|             } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|         padding: 0em 0em; | ||||
|         margin: 1em 0; | ||||
|         border-radius: 5px; | ||||
|         border: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|         border-left: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|         border-right: 1px dotted tint-color($chill-accourse-context, 10%); | ||||
|         dd { | ||||
|             margin-left: 1em; | ||||
|         } | ||||
|         & > div { | ||||
|             margin: 1em 3em 0; | ||||
|  | ||||
|     &.errors { | ||||
|       //display: flex; | ||||
|       //position: sticky; | ||||
|       //bottom: 0.3em; | ||||
|       //z-index: 1000; | ||||
|       margin: 1em 0; | ||||
|       padding: 1em; | ||||
|       border-radius: 0; | ||||
|             &.flex-table, | ||||
|             &.flex-bloc { | ||||
|                 margin: 1em 0 0; | ||||
|             } | ||||
|             &.alert.to-confirm { | ||||
|                 margin: 1em 0 0; | ||||
|                 padding: 1em 3em; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         div.flex-table { | ||||
|             div.item-row { | ||||
|                 div.item-col:first-child { | ||||
|                     flex-basis: 33%; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         &.errors { | ||||
|             //display: flex; | ||||
|             //position: sticky; | ||||
|             //bottom: 0.3em; | ||||
|             //z-index: 1000; | ||||
|             margin: 1em 0; | ||||
|             padding: 1em; | ||||
|             border-radius: 0; | ||||
|         } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,35 +1,38 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-40" />{{ $t("admin_location.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-40" />{{ $t("admin_location.title") }}</h2> | ||||
|  | ||||
|     <div class="mb-4"> | ||||
|       <label for="selectAdminLocation"> | ||||
|         {{ $t("admin_location.title") }} | ||||
|       </label> | ||||
|         <div class="mb-4"> | ||||
|             <label for="selectAdminLocation"> | ||||
|                 {{ $t("admin_location.title") }} | ||||
|             </label> | ||||
|  | ||||
|       <VueMultiselect | ||||
|         name="selectAdminLocation" | ||||
|         label="text" | ||||
|         :custom-label="customLabel" | ||||
|         track-by="id" | ||||
|         :multiple="false" | ||||
|         :searchable="true" | ||||
|         :placeholder="$t('admin_location.placeholder')" | ||||
|         v-model="value" | ||||
|         :options="options" | ||||
|         group-values="locations" | ||||
|         group-label="locationCategories" | ||||
|         :select-label="$t('multiselect.select_label')" | ||||
|         :deselect-label="$t('multiselect.deselect_label')" | ||||
|         :selected-label="$t('multiselect.selected_label')" | ||||
|         @select="updateAdminLocation" | ||||
|       /> | ||||
|             <VueMultiselect | ||||
|                 name="selectAdminLocation" | ||||
|                 label="text" | ||||
|                 :custom-label="customLabel" | ||||
|                 track-by="id" | ||||
|                 :multiple="false" | ||||
|                 :searchable="true" | ||||
|                 :placeholder="$t('admin_location.placeholder')" | ||||
|                 v-model="value" | ||||
|                 :options="options" | ||||
|                 group-values="locations" | ||||
|                 group-label="locationCategories" | ||||
|                 :select-label="$t('multiselect.select_label')" | ||||
|                 :deselect-label="$t('multiselect.deselect_label')" | ||||
|                 :selected-label="$t('multiselect.selected_label')" | ||||
|                 @select="updateAdminLocation" | ||||
|             /> | ||||
|         </div> | ||||
|  | ||||
|         <div | ||||
|             v-if="!isAdminLocationValid" | ||||
|             class="alert alert-warning to-confirm" | ||||
|         > | ||||
|             {{ $t("admin_location.not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div v-if="!isAdminLocationValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("admin_location.not_valid") }} | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -38,67 +41,72 @@ import { fetchResults } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import { mapState, mapGetters } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "AdminLocation", | ||||
|   components: { VueMultiselect }, | ||||
|   data() { | ||||
|     return { | ||||
|       options: [], | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       value: (state) => state.accompanyingCourse.administrativeLocation, | ||||
|     }), | ||||
|     ...mapGetters(["isAdminLocationValid"]), | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.getOptions(); | ||||
|   }, | ||||
|   methods: { | ||||
|     getOptions() { | ||||
|       fetchResults(`/api/1.0/main/location.json`).then((response) => { | ||||
|         let uniqueLocationTypeId = [ | ||||
|           ...new Set(response.map((o) => o.locationType.id)), | ||||
|         ]; | ||||
|         let results = []; | ||||
|         for (let id of uniqueLocationTypeId) { | ||||
|           results.push({ | ||||
|             locationCategories: response.filter( | ||||
|               (o) => o.locationType.id === id, | ||||
|             )[0].locationType.title.fr, | ||||
|             locations: response.filter((o) => o.locationType.id === id), | ||||
|           }); | ||||
|         } | ||||
|         this.options = results; | ||||
|       }); | ||||
|     name: "AdminLocation", | ||||
|     components: { VueMultiselect }, | ||||
|     data() { | ||||
|         return { | ||||
|             options: [], | ||||
|         }; | ||||
|     }, | ||||
|     updateAdminLocation(value) { | ||||
|       this.$store | ||||
|         .dispatch("updateAdminLocation", value) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             value: (state) => state.accompanyingCourse.administrativeLocation, | ||||
|         }), | ||||
|         ...mapGetters(["isAdminLocationValid"]), | ||||
|     }, | ||||
|     customLabel(value) { | ||||
|       return value.locationType | ||||
|         ? value.name | ||||
|           ? `${value.name} (${value.locationType.title.fr})` | ||||
|           : value.locationType.title.fr | ||||
|         : ""; | ||||
|     mounted() { | ||||
|         this.getOptions(); | ||||
|     }, | ||||
|     methods: { | ||||
|         getOptions() { | ||||
|             fetchResults(`/api/1.0/main/location.json`).then((response) => { | ||||
|                 let uniqueLocationTypeId = [ | ||||
|                     ...new Set(response.map((o) => o.locationType.id)), | ||||
|                 ]; | ||||
|                 let results = []; | ||||
|                 for (let id of uniqueLocationTypeId) { | ||||
|                     results.push({ | ||||
|                         locationCategories: response.filter( | ||||
|                             (o) => o.locationType.id === id, | ||||
|                         )[0].locationType.title.fr, | ||||
|                         locations: response.filter( | ||||
|                             (o) => o.locationType.id === id, | ||||
|                         ), | ||||
|                     }); | ||||
|                 } | ||||
|                 this.options = results; | ||||
|             }); | ||||
|         }, | ||||
|         updateAdminLocation(value) { | ||||
|             this.$store | ||||
|                 .dispatch("updateAdminLocation", value) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         customLabel(value) { | ||||
|             return value.locationType | ||||
|                 ? value.name | ||||
|                     ? `${value.name} (${value.locationType.title.fr})` | ||||
|                     : value.locationType.title.fr | ||||
|                 : ""; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style src="vue-multiselect/dist/vue-multiselect.css"></style> | ||||
| <style lang="css" scoped> | ||||
| label { | ||||
|   display: none; | ||||
|     display: none; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,106 +1,132 @@ | ||||
| <template> | ||||
|   <teleport to="#header-accompanying_course-name #banner-flags"> | ||||
|     <toggle-flags /> | ||||
|   </teleport> | ||||
|     <teleport to="#header-accompanying_course-name #banner-flags"> | ||||
|         <toggle-flags /> | ||||
|     </teleport> | ||||
|  | ||||
|   <teleport to="#header-accompanying_course-name #banner-status"> | ||||
|     <span | ||||
|       v-if="accompanyingCourse.step === 'DRAFT'" | ||||
|       class="text-md-end d-md-block" | ||||
|     <teleport to="#header-accompanying_course-name #banner-status"> | ||||
|         <span | ||||
|             v-if="accompanyingCourse.step === 'DRAFT'" | ||||
|             class="text-md-end d-md-block" | ||||
|         > | ||||
|             <span class="badge bg-secondary"> | ||||
|                 {{ $t("course.step.draft") }} | ||||
|             </span> | ||||
|         </span> | ||||
|         <span | ||||
|             v-else-if=" | ||||
|                 accompanyingCourse.step === 'CONFIRMED' || | ||||
|                 accompanyingCourse.step === 'CONFIRMED_INACTIVE_SHORT' || | ||||
|                 accompanyingCourse.step === 'CONFIRMED_INACTIVE_LONG' | ||||
|             " | ||||
|             class="text-md-end" | ||||
|         > | ||||
|             <span | ||||
|                 v-if="accompanyingCourse.step === 'CONFIRMED'" | ||||
|                 class="d-md-block mb-md-3" | ||||
|             > | ||||
|                 <span class="badge bg-primary"> | ||||
|                     {{ $t("course.step.active") }} | ||||
|                 </span> | ||||
|             </span> | ||||
|             <span | ||||
|                 v-else-if=" | ||||
|                     accompanyingCourse.step === 'CONFIRMED_INACTIVE_SHORT' | ||||
|                 " | ||||
|                 class="d-md-block mb-md-3" | ||||
|             > | ||||
|                 <span class="badge bg-chill-yellow text-primary"> | ||||
|                     {{ $t("course.step.inactive_short") }} | ||||
|                 </span> | ||||
|             </span> | ||||
|             <span | ||||
|                 v-else-if=" | ||||
|                     accompanyingCourse.step === 'CONFIRMED_INACTIVE_LONG' | ||||
|                 " | ||||
|                 class="d-md-block mb-md-3" | ||||
|             > | ||||
|                 <span class="badge bg-chill-pink"> | ||||
|                     {{ $t("course.step.inactive_long") }} | ||||
|                 </span> | ||||
|             </span> | ||||
|             <span class="d-md-block"> | ||||
|                 <span class="d-md-block ms-3 ms-md-0"> | ||||
|                     <i | ||||
|                         >{{ $t("course.open_at") | ||||
|                         }}{{ | ||||
|                             $d(accompanyingCourse.openingDate.datetime, "text") | ||||
|                         }}</i | ||||
|                     > | ||||
|                 </span> | ||||
|                 <span | ||||
|                     v-if="accompanyingCourse.user" | ||||
|                     class="d-md-block ms-3 ms-md-0" | ||||
|                 > | ||||
|                     <span class="item-key">{{ $t("course.referrer") }}:</span | ||||
|                     >  | ||||
|                     <b>{{ accompanyingCourse.user.text }}</b> | ||||
|                     <template v-if="accompanyingCourse.user.isAbsent"> | ||||
|                           | ||||
|                         <span | ||||
|                             class="badge bg-danger rounded-pill" | ||||
|                             title="Absent" | ||||
|                             >A</span | ||||
|                         > | ||||
|                     </template> | ||||
|                 </span> | ||||
|             </span> | ||||
|         </span> | ||||
|         <span v-else class="text-md-end d-md-block"> | ||||
|             <span class="badge bg-danger"> | ||||
|                 {{ $t("course.step.closed") }} | ||||
|             </span> | ||||
|             <span class="d-md-block"> | ||||
|                 <span class="d-md-block ms-3 ms-md-0"> | ||||
|                     <i | ||||
|                         >{{ | ||||
|                             $d(accompanyingCourse.openingDate.datetime, "text") | ||||
|                         }} | ||||
|                         - | ||||
|                         {{ | ||||
|                             $d(accompanyingCourse.closingDate.datetime, "text") | ||||
|                         }}</i | ||||
|                     > | ||||
|                 </span> | ||||
|                 <span | ||||
|                     v-if="accompanyingCourse.user" | ||||
|                     class="d-md-block ms-3 ms-md-0" | ||||
|                 > | ||||
|                     <span class="item-key">{{ $t("course.referrer") }}:</span> | ||||
|                     <b>{{ accompanyingCourse.user.text }}</b> | ||||
|                 </span> | ||||
|             </span> | ||||
|         </span> | ||||
|     </teleport> | ||||
|  | ||||
|     <teleport | ||||
|         to="#header-accompanying_course-name #persons-associated-shortlist" | ||||
|     > | ||||
|       <span class="badge bg-secondary"> | ||||
|         {{ $t("course.step.draft") }} | ||||
|       </span> | ||||
|     </span> | ||||
|     <span | ||||
|       v-else-if=" | ||||
|         accompanyingCourse.step === 'CONFIRMED' || | ||||
|         accompanyingCourse.step === 'CONFIRMED_INACTIVE_SHORT' || | ||||
|         accompanyingCourse.step === 'CONFIRMED_INACTIVE_LONG' | ||||
|       " | ||||
|       class="text-md-end" | ||||
|         <persons-associated | ||||
|             :accompanyingCourse="accompanyingCourse" | ||||
|             :shortlist="true" | ||||
|         ></persons-associated> | ||||
|     </teleport> | ||||
|  | ||||
|     <teleport to="#header-accompanying_course-details #banner-social-issues"> | ||||
|         <social-issue | ||||
|             v-for="issue in accompanyingCourse.socialIssues" | ||||
|             :key="issue.id" | ||||
|             :issue="issue" | ||||
|         /> | ||||
|     </teleport> | ||||
|  | ||||
|     <teleport | ||||
|         to="#header-accompanying_course-details #banner-persons-associated" | ||||
|     > | ||||
|       <span | ||||
|         v-if="accompanyingCourse.step === 'CONFIRMED'" | ||||
|         class="d-md-block mb-md-3" | ||||
|       > | ||||
|         <span class="badge bg-primary"> | ||||
|           {{ $t("course.step.active") }} | ||||
|         </span> | ||||
|       </span> | ||||
|       <span | ||||
|         v-else-if="accompanyingCourse.step === 'CONFIRMED_INACTIVE_SHORT'" | ||||
|         class="d-md-block mb-md-3" | ||||
|       > | ||||
|         <span class="badge bg-chill-yellow text-primary"> | ||||
|           {{ $t("course.step.inactive_short") }} | ||||
|         </span> | ||||
|       </span> | ||||
|       <span | ||||
|         v-else-if="accompanyingCourse.step === 'CONFIRMED_INACTIVE_LONG'" | ||||
|         class="d-md-block mb-md-3" | ||||
|       > | ||||
|         <span class="badge bg-chill-pink"> | ||||
|           {{ $t("course.step.inactive_long") }} | ||||
|         </span> | ||||
|       </span> | ||||
|       <span class="d-md-block"> | ||||
|         <span class="d-md-block ms-3 ms-md-0"> | ||||
|           <i | ||||
|             >{{ $t("course.open_at") | ||||
|             }}{{ $d(accompanyingCourse.openingDate.datetime, "text") }}</i | ||||
|           > | ||||
|         </span> | ||||
|         <span v-if="accompanyingCourse.user" class="d-md-block ms-3 ms-md-0"> | ||||
|           <span class="item-key">{{ $t("course.referrer") }}:</span>  | ||||
|           <b>{{ accompanyingCourse.user.text }}</b> | ||||
|           <template v-if="accompanyingCourse.user.isAbsent"> | ||||
|               | ||||
|             <span class="badge bg-danger rounded-pill" title="Absent">A</span> | ||||
|           </template> | ||||
|         </span> | ||||
|       </span> | ||||
|     </span> | ||||
|     <span v-else class="text-md-end d-md-block"> | ||||
|       <span class="badge bg-danger"> | ||||
|         {{ $t("course.step.closed") }} | ||||
|       </span> | ||||
|       <span class="d-md-block"> | ||||
|         <span class="d-md-block ms-3 ms-md-0"> | ||||
|           <i | ||||
|             >{{ $d(accompanyingCourse.openingDate.datetime, "text") }} - | ||||
|             {{ $d(accompanyingCourse.closingDate.datetime, "text") }}</i | ||||
|           > | ||||
|         </span> | ||||
|         <span v-if="accompanyingCourse.user" class="d-md-block ms-3 ms-md-0"> | ||||
|           <span class="item-key">{{ $t("course.referrer") }}:</span> | ||||
|           <b>{{ accompanyingCourse.user.text }}</b> | ||||
|         </span> | ||||
|       </span> | ||||
|     </span> | ||||
|   </teleport> | ||||
|  | ||||
|   <teleport to="#header-accompanying_course-name #persons-associated-shortlist"> | ||||
|     <persons-associated | ||||
|       :accompanyingCourse="accompanyingCourse" | ||||
|       :shortlist="true" | ||||
|     ></persons-associated> | ||||
|   </teleport> | ||||
|  | ||||
|   <teleport to="#header-accompanying_course-details #banner-social-issues"> | ||||
|     <social-issue | ||||
|       v-for="issue in accompanyingCourse.socialIssues" | ||||
|       :key="issue.id" | ||||
|       :issue="issue" | ||||
|     /> | ||||
|   </teleport> | ||||
|  | ||||
|   <teleport to="#header-accompanying_course-details #banner-persons-associated"> | ||||
|     <persons-associated | ||||
|       :accompanying-course="accompanyingCourse" | ||||
|       :shortlist="false" | ||||
|     /> | ||||
|   </teleport> | ||||
|         <persons-associated | ||||
|             :accompanying-course="accompanyingCourse" | ||||
|             :shortlist="false" | ||||
|         /> | ||||
|     </teleport> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -109,30 +135,30 @@ import SocialIssue from "./Banner/SocialIssue.vue"; | ||||
| import PersonsAssociated from "./Banner/PersonsAssociated.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "Banner", | ||||
|   components: { | ||||
|     ToggleFlags, | ||||
|     SocialIssue, | ||||
|     PersonsAssociated, | ||||
|   }, | ||||
|   computed: { | ||||
|     accompanyingCourse() { | ||||
|       return this.$store.state.accompanyingCourse; | ||||
|     name: "Banner", | ||||
|     components: { | ||||
|         ToggleFlags, | ||||
|         SocialIssue, | ||||
|         PersonsAssociated, | ||||
|     }, | ||||
|     computed: { | ||||
|         accompanyingCourse() { | ||||
|             return this.$store.state.accompanyingCourse; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| div#banner-flags, | ||||
| div#banner-status { | ||||
|   .badge { | ||||
|     text-transform: uppercase; | ||||
|   } | ||||
|     .badge { | ||||
|         text-transform: uppercase; | ||||
|     } | ||||
| } | ||||
| div#banner-status { | ||||
|   span.badge { | ||||
|     font-size: 90%; | ||||
|   } | ||||
|     span.badge { | ||||
|         font-size: 90%; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,123 +1,129 @@ | ||||
| <template> | ||||
|   <span v-if="shortlist"> | ||||
|     <span v-for="person in firstPersons" class="me-1" :key="person.id"> | ||||
|       <on-the-fly | ||||
|         :type="person.type" | ||||
|         :id="person.id" | ||||
|         :buttonText="person.textAge" | ||||
|         :displayBadge="'true' === 'true'" | ||||
|         action="show" | ||||
|       ></on-the-fly> | ||||
|     <span v-if="shortlist"> | ||||
|         <span v-for="person in firstPersons" class="me-1" :key="person.id"> | ||||
|             <on-the-fly | ||||
|                 :type="person.type" | ||||
|                 :id="person.id" | ||||
|                 :buttonText="person.textAge" | ||||
|                 :displayBadge="'true' === 'true'" | ||||
|                 action="show" | ||||
|             ></on-the-fly> | ||||
|         </span> | ||||
|         <span v-if="hasMoreThanShortListPerson"> | ||||
|             <a | ||||
|                 class="showMore carousel-control" | ||||
|                 role="button" | ||||
|                 data-bs-target="#ACHeaderSlider" | ||||
|                 data-bs-slide="next" | ||||
|                 >{{ $t("more_x", { x: countMoreThanShortListPerson }) }}</a | ||||
|             > | ||||
|         </span> | ||||
|     </span> | ||||
|     <span v-if="hasMoreThanShortListPerson"> | ||||
|       <a | ||||
|         class="showMore carousel-control" | ||||
|         role="button" | ||||
|         data-bs-target="#ACHeaderSlider" | ||||
|         data-bs-slide="next" | ||||
|         >{{ $t("more_x", { x: countMoreThanShortListPerson }) }}</a | ||||
|       > | ||||
|     <span v-else> | ||||
|         <span | ||||
|             v-for="([pk, persons], h) in personsByHousehold" | ||||
|             :class="{ household: pk > -1, 'no-household': pk === -1 }" | ||||
|             :key="h.id" | ||||
|         > | ||||
|             <a v-if="pk !== -1" :href="householdLink(pk)"> | ||||
|                 <i | ||||
|                     class="fa fa-home fa-fw text-light" | ||||
|                     :title=" | ||||
|                         $t('persons_associated.show_household_number', { | ||||
|                             id: pk, | ||||
|                         }) | ||||
|                     " | ||||
|                 ></i> | ||||
|             </a> | ||||
|             <span v-for="person in persons" class="me-1" :key="person.id"> | ||||
|                 <on-the-fly | ||||
|                     :type="person.type" | ||||
|                     :id="person.id" | ||||
|                     :buttonText="person.textAge" | ||||
|                     :displayBadge="true" | ||||
|                     action="show" | ||||
|                 ></on-the-fly> | ||||
|             </span> | ||||
|         </span> | ||||
|     </span> | ||||
|   </span> | ||||
|   <span v-else> | ||||
|     <span | ||||
|       v-for="([pk, persons], h) in personsByHousehold" | ||||
|       :class="{ household: pk > -1, 'no-household': pk === -1 }" | ||||
|       :key="h.id" | ||||
|     > | ||||
|       <a v-if="pk !== -1" :href="householdLink(pk)"> | ||||
|         <i | ||||
|           class="fa fa-home fa-fw text-light" | ||||
|           :title="$t('persons_associated.show_household_number', { id: pk })" | ||||
|         ></i> | ||||
|       </a> | ||||
|       <span v-for="person in persons" class="me-1" :key="person.id"> | ||||
|         <on-the-fly | ||||
|           :type="person.type" | ||||
|           :id="person.id" | ||||
|           :buttonText="person.textAge" | ||||
|           :displayBadge="true" | ||||
|           action="show" | ||||
|         ></on-the-fly> | ||||
|       </span> | ||||
|     </span> | ||||
|   </span> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import OnTheFly from "ChillMainAssets/vuejs/OnTheFly/components/OnTheFly"; | ||||
|  | ||||
| export default { | ||||
|   name: "PersonsAssociated", | ||||
|   components: { | ||||
|     OnTheFly, | ||||
|   }, | ||||
|   props: ["accompanyingCourse", "shortlist"], | ||||
|   data() { | ||||
|     return { | ||||
|       showAllPersons: false, | ||||
|       maxTotalPersons: 2, | ||||
|       nbShortList: 3, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     participations() { | ||||
|       return this.accompanyingCourse.participations.filter( | ||||
|         (p) => p.endDate === null, | ||||
|       ); | ||||
|     name: "PersonsAssociated", | ||||
|     components: { | ||||
|         OnTheFly, | ||||
|     }, | ||||
|     persons() { | ||||
|       return this.participations.map((p) => p.person); | ||||
|     props: ["accompanyingCourse", "shortlist"], | ||||
|     data() { | ||||
|         return { | ||||
|             showAllPersons: false, | ||||
|             maxTotalPersons: 2, | ||||
|             nbShortList: 3, | ||||
|         }; | ||||
|     }, | ||||
|     firstPersons() { | ||||
|       return this.participations.slice(0, 3).map((p) => p.person); | ||||
|     }, | ||||
|     hasMoreThanShortListPerson() { | ||||
|       return this.participations.length > 3; | ||||
|     }, | ||||
|     countMoreThanShortListPerson() { | ||||
|       return this.participations.length - 3; | ||||
|     }, | ||||
|     resources() { | ||||
|       return this.accompanyingCourse.resources; | ||||
|     }, | ||||
|     requestor() { | ||||
|       return this.accompanyingCourse.requestor; | ||||
|     }, | ||||
|     personsByHousehold() { | ||||
|       const households = new Map(); | ||||
|       this.accompanyingCourse.participations | ||||
|         .filter((part) => part.endDate === null) | ||||
|         .map((part) => part.person) | ||||
|         .forEach((person) => { | ||||
|           if (!households.has(person.current_household_id || -1)) { | ||||
|             households.set(person.current_household_id || -1, []); | ||||
|           } | ||||
|           households.get(person.current_household_id || -1).push(person); | ||||
|         }); | ||||
|     computed: { | ||||
|         participations() { | ||||
|             return this.accompanyingCourse.participations.filter( | ||||
|                 (p) => p.endDate === null, | ||||
|             ); | ||||
|         }, | ||||
|         persons() { | ||||
|             return this.participations.map((p) => p.person); | ||||
|         }, | ||||
|         firstPersons() { | ||||
|             return this.participations.slice(0, 3).map((p) => p.person); | ||||
|         }, | ||||
|         hasMoreThanShortListPerson() { | ||||
|             return this.participations.length > 3; | ||||
|         }, | ||||
|         countMoreThanShortListPerson() { | ||||
|             return this.participations.length - 3; | ||||
|         }, | ||||
|         resources() { | ||||
|             return this.accompanyingCourse.resources; | ||||
|         }, | ||||
|         requestor() { | ||||
|             return this.accompanyingCourse.requestor; | ||||
|         }, | ||||
|         personsByHousehold() { | ||||
|             const households = new Map(); | ||||
|             this.accompanyingCourse.participations | ||||
|                 .filter((part) => part.endDate === null) | ||||
|                 .map((part) => part.person) | ||||
|                 .forEach((person) => { | ||||
|                     if (!households.has(person.current_household_id || -1)) { | ||||
|                         households.set(person.current_household_id || -1, []); | ||||
|                     } | ||||
|                     households | ||||
|                         .get(person.current_household_id || -1) | ||||
|                         .push(person); | ||||
|                 }); | ||||
|  | ||||
|       return households; | ||||
|             return households; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     householdLink(id) { | ||||
|       return `/fr/person/household/${id}/summary`; | ||||
|     methods: { | ||||
|         householdLink(id) { | ||||
|             return `/fr/person/household/${id}/summary`; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .showMore { | ||||
|   cursor: pointer; | ||||
|   color: white; | ||||
|     cursor: pointer; | ||||
|     color: white; | ||||
| } | ||||
| span.household { | ||||
|   display: inline-block; | ||||
|   border-top: 1px solid rgba(255, 255, 255, 0.3); | ||||
|   background-color: rgba(255, 255, 255, 0.1); | ||||
|   border-radius: 10px; | ||||
|   margin-right: 0.3em; | ||||
|   padding: 5px; | ||||
|     display: inline-block; | ||||
|     border-top: 1px solid rgba(255, 255, 255, 0.3); | ||||
|     background-color: rgba(255, 255, 255, 0.1); | ||||
|     border-radius: 10px; | ||||
|     margin-right: 0.3em; | ||||
|     padding: 5px; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,11 +1,11 @@ | ||||
| <template> | ||||
|   <span class="badge bg-chill-l-gray text-dark">{{ issue.text }}</span> | ||||
|     <span class="badge bg-chill-l-gray text-dark">{{ issue.text }}</span> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: "SocialIssues", | ||||
|   props: ["issue"], | ||||
|     name: "SocialIssues", | ||||
|     props: ["issue"], | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| @@ -14,9 +14,9 @@ export default { | ||||
| @import "ChillPersonAssets/chill/scss/mixins"; | ||||
| @import "ChillMainAssets/chill/scss/chill_variables"; | ||||
| span.badge { | ||||
|   @include badge_social($social-issue-color); | ||||
|   font-size: 95%; | ||||
|   margin-bottom: 5px; | ||||
|   margin-right: 1em; | ||||
|     @include badge_social($social-issue-color); | ||||
|     font-size: 95%; | ||||
|     margin-bottom: 5px; | ||||
|     margin-right: 1em; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,142 +1,158 @@ | ||||
| <template> | ||||
|   <div class="text-md-end"> | ||||
|     <span class="d-block d-sm-inline-block mb-md-2"> | ||||
|       <a @click="toggleIntensity" class="flag-toggle"> | ||||
|         <span :class="{ on: !isRegular }">{{ $t("course.occasional") }}</span> | ||||
|         <i | ||||
|           class="fa" | ||||
|           :class="{ | ||||
|             'fa-toggle-on': isRegular, | ||||
|             'fa-toggle-on fa-flip-horizontal': !isRegular, | ||||
|           }" | ||||
|         /> | ||||
|         <span :class="{ on: isRegular }">{{ $t("course.regular") }}</span> | ||||
|       </a> | ||||
|     </span> | ||||
|     <div class="text-md-end"> | ||||
|         <span class="d-block d-sm-inline-block mb-md-2"> | ||||
|             <a @click="toggleIntensity" class="flag-toggle"> | ||||
|                 <span :class="{ on: !isRegular }">{{ | ||||
|                     $t("course.occasional") | ||||
|                 }}</span> | ||||
|                 <i | ||||
|                     class="fa" | ||||
|                     :class="{ | ||||
|                         'fa-toggle-on': isRegular, | ||||
|                         'fa-toggle-on fa-flip-horizontal': !isRegular, | ||||
|                     }" | ||||
|                 /> | ||||
|                 <span :class="{ on: isRegular }">{{ | ||||
|                     $t("course.regular") | ||||
|                 }}</span> | ||||
|             </a> | ||||
|         </span> | ||||
|  | ||||
|     <span class="d-block d-sm-inline-block ms-sm-3 ms-md-0"> | ||||
|       <button | ||||
|         class="badge rounded-pill me-1" | ||||
|         :class="{ 'bg-danger': isEmergency, 'bg-secondary': !isEmergency }" | ||||
|         @click="toggleEmergency" | ||||
|       > | ||||
|         {{ $t("course.emergency") }} | ||||
|       </button> | ||||
|       <button | ||||
|         class="badge rounded-pill" | ||||
|         :class="{ | ||||
|           'bg-danger': isConfidential, | ||||
|           'bg-secondary': !isConfidential, | ||||
|         }" | ||||
|         @click="toggleConfidential" | ||||
|       > | ||||
|         {{ $t("course.confidential") }} | ||||
|       </button> | ||||
|     </span> | ||||
|   </div> | ||||
|         <span class="d-block d-sm-inline-block ms-sm-3 ms-md-0"> | ||||
|             <button | ||||
|                 class="badge rounded-pill me-1" | ||||
|                 :class="{ | ||||
|                     'bg-danger': isEmergency, | ||||
|                     'bg-secondary': !isEmergency, | ||||
|                 }" | ||||
|                 @click="toggleEmergency" | ||||
|             > | ||||
|                 {{ $t("course.emergency") }} | ||||
|             </button> | ||||
|             <button | ||||
|                 class="badge rounded-pill" | ||||
|                 :class="{ | ||||
|                     'bg-danger': isConfidential, | ||||
|                     'bg-secondary': !isConfidential, | ||||
|                 }" | ||||
|                 @click="toggleConfidential" | ||||
|             > | ||||
|                 {{ $t("course.confidential") }} | ||||
|             </button> | ||||
|         </span> | ||||
|     </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { mapState } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "ToggleFlags", | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       intensity: (state) => state.accompanyingCourse.intensity, | ||||
|       emergency: (state) => state.accompanyingCourse.emergency, | ||||
|       confidential: (state) => state.accompanyingCourse.confidential, | ||||
|       permissions: (state) => state.permissions, | ||||
|     }), | ||||
|     isRegular() { | ||||
|       return this.intensity === "regular" ? true : false; | ||||
|     name: "ToggleFlags", | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             intensity: (state) => state.accompanyingCourse.intensity, | ||||
|             emergency: (state) => state.accompanyingCourse.emergency, | ||||
|             confidential: (state) => state.accompanyingCourse.confidential, | ||||
|             permissions: (state) => state.permissions, | ||||
|         }), | ||||
|         isRegular() { | ||||
|             return this.intensity === "regular" ? true : false; | ||||
|         }, | ||||
|         isEmergency() { | ||||
|             return this.emergency ? true : false; | ||||
|         }, | ||||
|         isConfidential() { | ||||
|             return this.confidential ? true : false; | ||||
|         }, | ||||
|     }, | ||||
|     isEmergency() { | ||||
|       return this.emergency ? true : false; | ||||
|     methods: { | ||||
|         toggleIntensity() { | ||||
|             let value; | ||||
|             switch (this.intensity) { | ||||
|                 case "occasional": | ||||
|                     value = "regular"; | ||||
|                     break; | ||||
|                 case "regular": | ||||
|                     value = "occasional"; | ||||
|                     break; | ||||
|                 default: | ||||
|                     //temporaire (modif backend) | ||||
|                     value = "occasional"; | ||||
|             } | ||||
|             this.$store.dispatch("toggleIntensity", value).catch(({ name }) => { | ||||
|                 if ( | ||||
|                     name === "ValidationException" || | ||||
|                     name === "AccessException" | ||||
|                 ) { | ||||
|                     this.$toast.open({ | ||||
|                         message: this.$t( | ||||
|                             "Only the referrer can toggle the intensity of an accompanying course", | ||||
|                         ), | ||||
|                     }); | ||||
|                 } else { | ||||
|                     this.$toast.open({ message: "An error occurred" }); | ||||
|                 } | ||||
|             }); | ||||
|         }, | ||||
|         toggleEmergency() { | ||||
|             this.$store | ||||
|                 .dispatch("toggleEmergency", !this.isEmergency) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         toggleConfidential() { | ||||
|             this.$store.dispatch("toggleConfidential").catch(({ name }) => { | ||||
|                 console.log(name); | ||||
|                 if ( | ||||
|                     name === "ValidationException" || | ||||
|                     name === "AccessException" | ||||
|                 ) { | ||||
|                     this.$toast.open({ | ||||
|                         message: this.$t( | ||||
|                             "Only the referrer can toggle the confidentiality of an accompanying course", | ||||
|                         ), | ||||
|                     }); | ||||
|                 } else { | ||||
|                     this.$toast.open({ message: "An error occurred" }); | ||||
|                 } | ||||
|             }); | ||||
|         }, | ||||
|     }, | ||||
|     isConfidential() { | ||||
|       return this.confidential ? true : false; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleIntensity() { | ||||
|       let value; | ||||
|       switch (this.intensity) { | ||||
|         case "occasional": | ||||
|           value = "regular"; | ||||
|           break; | ||||
|         case "regular": | ||||
|           value = "occasional"; | ||||
|           break; | ||||
|         default: | ||||
|           //temporaire (modif backend) | ||||
|           value = "occasional"; | ||||
|       } | ||||
|       this.$store.dispatch("toggleIntensity", value).catch(({ name }) => { | ||||
|         if (name === "ValidationException" || name === "AccessException") { | ||||
|           this.$toast.open({ | ||||
|             message: this.$t( | ||||
|               "Only the referrer can toggle the intensity of an accompanying course", | ||||
|             ), | ||||
|           }); | ||||
|         } else { | ||||
|           this.$toast.open({ message: "An error occurred" }); | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|     toggleEmergency() { | ||||
|       this.$store | ||||
|         .dispatch("toggleEmergency", !this.isEmergency) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     toggleConfidential() { | ||||
|       this.$store.dispatch("toggleConfidential").catch(({ name }) => { | ||||
|         console.log(name); | ||||
|         if (name === "ValidationException" || name === "AccessException") { | ||||
|           this.$toast.open({ | ||||
|             message: this.$t( | ||||
|               "Only the referrer can toggle the confidentiality of an accompanying course", | ||||
|             ), | ||||
|           }); | ||||
|         } else { | ||||
|           this.$toast.open({ message: "An error occurred" }); | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| a.flag-toggle { | ||||
|   color: white; | ||||
|   cursor: pointer; | ||||
|   &:hover { | ||||
|     color: white; | ||||
|     text-decoration: underline; | ||||
|     border-radius: 20px; | ||||
|   } | ||||
|   i { | ||||
|     margin: auto 0.4em; | ||||
|   } | ||||
|   span.on { | ||||
|     font-weight: bolder; | ||||
|   } | ||||
|     cursor: pointer; | ||||
|     &:hover { | ||||
|         color: white; | ||||
|         text-decoration: underline; | ||||
|         border-radius: 20px; | ||||
|     } | ||||
|     i { | ||||
|         margin: auto 0.4em; | ||||
|     } | ||||
|     span.on { | ||||
|         font-weight: bolder; | ||||
|     } | ||||
| } | ||||
| button.badge { | ||||
|   &.bg-secondary { | ||||
|     opacity: 0.5; | ||||
|     &:hover { | ||||
|       opacity: 0.7; | ||||
|     &.bg-secondary { | ||||
|         opacity: 0.5; | ||||
|         &:hover { | ||||
|             opacity: 0.7; | ||||
|         } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,36 +1,38 @@ | ||||
| <template> | ||||
|   <li> | ||||
|     <button | ||||
|       class="btn btn-sm btn-secondary" | ||||
|       @click="modal.showModal = true" | ||||
|       :title="$t('courselocation.assign_course_address')" | ||||
|     > | ||||
|       <i class="fa fa-map-marker" /> | ||||
|     </button> | ||||
|   </li> | ||||
|  | ||||
|   <teleport to="body"> | ||||
|     <modal | ||||
|       v-if="modal.showModal" | ||||
|       :modal-dialog-class="modal.modalDialogClass" | ||||
|       @close="modal.showModal = false" | ||||
|     > | ||||
|       <template #header> | ||||
|         <h2 class="modal-title"> | ||||
|           {{ $t("courselocation.sure") }} | ||||
|         </h2> | ||||
|       </template> | ||||
|       <template #body> | ||||
|         <address-render-box :address="person.current_household_address" /> | ||||
|         <p>{{ $t("courselocation.sure_description") }}</p> | ||||
|       </template> | ||||
|       <template #footer> | ||||
|         <button class="btn btn-danger" @click="assignAddress"> | ||||
|           {{ $t("courselocation.ok") }} | ||||
|     <li> | ||||
|         <button | ||||
|             class="btn btn-sm btn-secondary" | ||||
|             @click="modal.showModal = true" | ||||
|             :title="$t('courselocation.assign_course_address')" | ||||
|         > | ||||
|             <i class="fa fa-map-marker" /> | ||||
|         </button> | ||||
|       </template> | ||||
|     </modal> | ||||
|   </teleport> | ||||
|     </li> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|         <modal | ||||
|             v-if="modal.showModal" | ||||
|             :modal-dialog-class="modal.modalDialogClass" | ||||
|             @close="modal.showModal = false" | ||||
|         > | ||||
|             <template #header> | ||||
|                 <h2 class="modal-title"> | ||||
|                     {{ $t("courselocation.sure") }} | ||||
|                 </h2> | ||||
|             </template> | ||||
|             <template #body> | ||||
|                 <address-render-box | ||||
|                     :address="person.current_household_address" | ||||
|                 /> | ||||
|                 <p>{{ $t("courselocation.sure_description") }}</p> | ||||
|             </template> | ||||
|             <template #footer> | ||||
|                 <button class="btn btn-danger" @click="assignAddress"> | ||||
|                     {{ $t("courselocation.ok") }} | ||||
|                 </button> | ||||
|             </template> | ||||
|         </modal> | ||||
|     </teleport> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -39,49 +41,52 @@ import Modal from "ChillMainAssets/vuejs/_components/Modal"; | ||||
| import AddressRenderBox from "ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "ButtonLocation", | ||||
|   components: { | ||||
|     AddressRenderBox, | ||||
|     Modal, | ||||
|   }, | ||||
|   props: ["person"], | ||||
|   data() { | ||||
|     return { | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-centered modal-md", | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       context: (state) => state.addressContext, | ||||
|     }), | ||||
|   }, | ||||
|   methods: { | ||||
|     assignAddress() { | ||||
|       //console.log('assignAddress id', this.person.current_household_address); | ||||
|       let payload = { | ||||
|         target: this.context.target.name, | ||||
|         targetId: this.context.target.id, | ||||
|         locationStatusTo: "person", | ||||
|         personId: this.person.id, | ||||
|       }; | ||||
|       this.$store | ||||
|         .dispatch("updateLocation", payload) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|  | ||||
|       window.location.assign("#section-20"); | ||||
|       this.modal.showModal = false; | ||||
|     name: "ButtonLocation", | ||||
|     components: { | ||||
|         AddressRenderBox, | ||||
|         Modal, | ||||
|     }, | ||||
|     props: ["person"], | ||||
|     data() { | ||||
|         return { | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-centered modal-md", | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             context: (state) => state.addressContext, | ||||
|         }), | ||||
|     }, | ||||
|     methods: { | ||||
|         assignAddress() { | ||||
|             //console.log('assignAddress id', this.person.current_household_address); | ||||
|             let payload = { | ||||
|                 target: this.context.target.name, | ||||
|                 targetId: this.context.target.id, | ||||
|                 locationStatusTo: "person", | ||||
|                 personId: this.person.id, | ||||
|             }; | ||||
|             this.$store | ||||
|                 .dispatch("updateLocation", payload) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|             window.location.assign("#section-20"); | ||||
|             this.modal.showModal = false; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,56 +1,56 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-100" />{{ $t("comment.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-100" />{{ $t("comment.title") }}</h2> | ||||
|  | ||||
|     <!--div class="error flash_message" v-if="errors.length > 0"> | ||||
|         <!--div class="error flash_message" v-if="errors.length > 0"> | ||||
|          {{ errors[0] }} | ||||
|          TODO fix errors flashbag for app component | ||||
|       </div--> | ||||
|  | ||||
|     <div> | ||||
|       <form @submit.prevent="submitform"> | ||||
|         <label class="col-form-label" for="content">{{ | ||||
|           $t("comment.label") | ||||
|         }}</label> | ||||
|  | ||||
|         <comment-editor v-model="content" /> | ||||
|  | ||||
|         <div class="sub-comment"> | ||||
|           <div | ||||
|             v-if=" | ||||
|               pinnedComment !== null && | ||||
|               typeof pinnedComment.creator !== 'undefined' | ||||
|             " | ||||
|             class="metadata" | ||||
|           > | ||||
|             {{ | ||||
|               $t("comment.created_by", [ | ||||
|                 pinnedComment.creator.text, | ||||
|                 $d(pinnedComment.updatedAt.datetime, "long"), | ||||
|               ]) | ||||
|             }} | ||||
|           </div> | ||||
|           <div class="loading"> | ||||
|             <i | ||||
|               v-if="loading" | ||||
|               class="fa fa-circle-o-notch fa-spin" | ||||
|               :title="$t('loading')" | ||||
|             /> | ||||
|           </div> | ||||
|         </div> | ||||
|  | ||||
|         <div> | ||||
|           <ul class="record_actions"> | ||||
|             <li v-if="pinnedComment !== null"> | ||||
|               <a class="btn btn-delete" @click="removeComment"> | ||||
|                 {{ $t("action.delete") }} | ||||
|               </a> | ||||
|             </li> | ||||
|           </ul> | ||||
|             <form @submit.prevent="submitform"> | ||||
|                 <label class="col-form-label" for="content">{{ | ||||
|                     $t("comment.label") | ||||
|                 }}</label> | ||||
|  | ||||
|                 <comment-editor v-model="content" /> | ||||
|  | ||||
|                 <div class="sub-comment"> | ||||
|                     <div | ||||
|                         v-if=" | ||||
|                             pinnedComment !== null && | ||||
|                             typeof pinnedComment.creator !== 'undefined' | ||||
|                         " | ||||
|                         class="metadata" | ||||
|                     > | ||||
|                         {{ | ||||
|                             $t("comment.created_by", [ | ||||
|                                 pinnedComment.creator.text, | ||||
|                                 $d(pinnedComment.updatedAt.datetime, "long"), | ||||
|                             ]) | ||||
|                         }} | ||||
|                     </div> | ||||
|                     <div class="loading"> | ||||
|                         <i | ||||
|                             v-if="loading" | ||||
|                             class="fa fa-circle-o-notch fa-spin" | ||||
|                             :title="$t('loading')" | ||||
|                         /> | ||||
|                     </div> | ||||
|                 </div> | ||||
|  | ||||
|                 <div> | ||||
|                     <ul class="record_actions"> | ||||
|                         <li v-if="pinnedComment !== null"> | ||||
|                             <a class="btn btn-delete" @click="removeComment"> | ||||
|                                 {{ $t("action.delete") }} | ||||
|                             </a> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
|             </form> | ||||
|         </div> | ||||
|       </form> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -58,113 +58,127 @@ import CommentEditor from "ChillMainAssets/vuejs/_components/CommentEditor/Comme | ||||
| import { mapState } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "Comment", | ||||
|   components: { | ||||
|     CommentEditor, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       loading: false, | ||||
|       lastRecordedContent: null, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       pinnedComment: (state) => state.accompanyingCourse.pinnedComment, | ||||
|     }), | ||||
|     classicEditor: () => ClassicEditor, | ||||
|     editorConfig: () => classicEditorConfig, | ||||
|     content: { | ||||
|       set(value) { | ||||
|         console.log("new comment value", value); | ||||
|         console.log("previous value", this.lastRecordedContent); | ||||
|         this.lastRecordedContent = value; | ||||
|     name: "Comment", | ||||
|     components: { | ||||
|         CommentEditor, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             loading: false, | ||||
|             lastRecordedContent: null, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             pinnedComment: (state) => state.accompanyingCourse.pinnedComment, | ||||
|         }), | ||||
|         classicEditor: () => ClassicEditor, | ||||
|         editorConfig: () => classicEditorConfig, | ||||
|         content: { | ||||
|             set(value) { | ||||
|                 console.log("new comment value", value); | ||||
|                 console.log("previous value", this.lastRecordedContent); | ||||
|                 this.lastRecordedContent = value; | ||||
|  | ||||
|         setTimeout(() => { | ||||
|           console.log("performing test on ", value); | ||||
|           if (this.lastRecordedContent === value) { | ||||
|             this.loading = true; | ||||
|             if (value !== "") { | ||||
|               this.$store | ||||
|                 .dispatch("updatePinnedComment", value) | ||||
|                 .then(() => { | ||||
|                   this.loading = false; | ||||
|                 }) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                   if ( | ||||
|                     name === "ValidationException" || | ||||
|                     name === "AccessException" | ||||
|                   ) { | ||||
|                     violations.forEach((violation) => | ||||
|                       this.$toast.open({ message: violation }), | ||||
|                     ); | ||||
|                   } else { | ||||
|                     this.$toast.open({ message: "An error occurred" }); | ||||
|                   } | ||||
|                 }); | ||||
|             } else { | ||||
|               if (this.$store.state.accompanyingCourse.pinnedComment !== null) { | ||||
|                 this.$store | ||||
|                   .dispatch("removePinnedComment", { | ||||
|                     id: this.pinnedComment.id, | ||||
|                   }) | ||||
|                   .then(() => { | ||||
|                     this.loading = false; | ||||
|                     this.lastRecoredContent = null; | ||||
|                   }) | ||||
|                   .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                       name === "ValidationException" || | ||||
|                       name === "AccessException" | ||||
|                     ) { | ||||
|                       violations.forEach((violation) => | ||||
|                         this.$toast.open({ message: violation }), | ||||
|                       ); | ||||
|                     } else { | ||||
|                       this.$toast.open({ message: "An error occurred" }); | ||||
|                 setTimeout(() => { | ||||
|                     console.log("performing test on ", value); | ||||
|                     if (this.lastRecordedContent === value) { | ||||
|                         this.loading = true; | ||||
|                         if (value !== "") { | ||||
|                             this.$store | ||||
|                                 .dispatch("updatePinnedComment", value) | ||||
|                                 .then(() => { | ||||
|                                     this.loading = false; | ||||
|                                 }) | ||||
|                                 .catch(({ name, violations }) => { | ||||
|                                     if ( | ||||
|                                         name === "ValidationException" || | ||||
|                                         name === "AccessException" | ||||
|                                     ) { | ||||
|                                         violations.forEach((violation) => | ||||
|                                             this.$toast.open({ | ||||
|                                                 message: violation, | ||||
|                                             }), | ||||
|                                         ); | ||||
|                                     } else { | ||||
|                                         this.$toast.open({ | ||||
|                                             message: "An error occurred", | ||||
|                                         }); | ||||
|                                     } | ||||
|                                 }); | ||||
|                         } else { | ||||
|                             if ( | ||||
|                                 this.$store.state.accompanyingCourse | ||||
|                                     .pinnedComment !== null | ||||
|                             ) { | ||||
|                                 this.$store | ||||
|                                     .dispatch("removePinnedComment", { | ||||
|                                         id: this.pinnedComment.id, | ||||
|                                     }) | ||||
|                                     .then(() => { | ||||
|                                         this.loading = false; | ||||
|                                         this.lastRecoredContent = null; | ||||
|                                     }) | ||||
|                                     .catch(({ name, violations }) => { | ||||
|                                         if ( | ||||
|                                             name === "ValidationException" || | ||||
|                                             name === "AccessException" | ||||
|                                         ) { | ||||
|                                             violations.forEach((violation) => | ||||
|                                                 this.$toast.open({ | ||||
|                                                     message: violation, | ||||
|                                                 }), | ||||
|                                             ); | ||||
|                                         } else { | ||||
|                                             this.$toast.open({ | ||||
|                                                 message: "An error occurred", | ||||
|                                             }); | ||||
|                                         } | ||||
|                                     }); | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|                   }); | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         }, 3000); | ||||
|       }, | ||||
|       get() { | ||||
|         return this.pinnedComment ? this.pinnedComment.content : ""; | ||||
|       }, | ||||
|                 }, 3000); | ||||
|             }, | ||||
|             get() { | ||||
|                 return this.pinnedComment ? this.pinnedComment.content : ""; | ||||
|             }, | ||||
|         }, | ||||
|         errors() { | ||||
|             return this.$store.state.errorMsg; | ||||
|         }, | ||||
|     }, | ||||
|     errors() { | ||||
|       return this.$store.state.errorMsg; | ||||
|     methods: { | ||||
|         removeComment() { | ||||
|             this.$store | ||||
|                 .dispatch("removePinnedComment", { id: this.pinnedComment.id }) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     removeComment() { | ||||
|       this.$store | ||||
|         .dispatch("removePinnedComment", { id: this.pinnedComment.id }) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| div.ck-editor.ck-reset { | ||||
|   margin: 0.6em 0; | ||||
|     margin: 0.6em 0; | ||||
| } | ||||
| div.sub-comment { | ||||
|   display: flex; | ||||
|   justify-content: space-between; | ||||
|   div.loading { | ||||
|     margin-right: 6px; | ||||
|     margin-left: 6px; | ||||
|   } | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     div.loading { | ||||
|         margin-right: 6px; | ||||
|         margin-left: 6px; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,120 +1,127 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2> | ||||
|       <a id="section-110" /> | ||||
|       {{ $t("confirm.title") }} | ||||
|     </h2> | ||||
|     <div> | ||||
|       <p v-html="$t('confirm.text_draft', [$t('course.step.draft')])" /> | ||||
|     <div class="vue-component"> | ||||
|         <h2> | ||||
|             <a id="section-110" /> | ||||
|             {{ $t("confirm.title") }} | ||||
|         </h2> | ||||
|         <div> | ||||
|             <p v-html="$t('confirm.text_draft', [$t('course.step.draft')])" /> | ||||
|  | ||||
|       <div v-if="!isValidToBeConfirmed"> | ||||
|         <div class="alert alert-warning"> | ||||
|           {{ $t("confirm.alert_validation") }} | ||||
|           <ul class="mt-2"> | ||||
|             <li v-for="k in validationKeys" :key="k"> | ||||
|               {{ $t(notValidMessages[k].msg) }} | ||||
|               <a :href="notValidMessages[k].anchor"> | ||||
|                 <i class="fa fa-level-up fa-fw" /> | ||||
|               </a> | ||||
|             </li> | ||||
|           </ul> | ||||
|             <div v-if="!isValidToBeConfirmed"> | ||||
|                 <div class="alert alert-warning"> | ||||
|                     {{ $t("confirm.alert_validation") }} | ||||
|                     <ul class="mt-2"> | ||||
|                         <li v-for="k in validationKeys" :key="k"> | ||||
|                             {{ $t(notValidMessages[k].msg) }} | ||||
|                             <a :href="notValidMessages[k].anchor"> | ||||
|                                 <i class="fa fa-level-up fa-fw" /> | ||||
|                             </a> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </div> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
|                         <button class="btn btn-save" disabled> | ||||
|                             {{ $t("confirm.ok") }} | ||||
|                         </button> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <a class="btn btn-delete" :href="deleteLink"> | ||||
|                             {{ $t("confirm.delete") }} | ||||
|                         </a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|  | ||||
|             <div v-else> | ||||
|                 <p | ||||
|                     v-html=" | ||||
|                         $t('confirm.text_active', [$t('course.step.active')]) | ||||
|                     " | ||||
|                 /> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
|                         <button | ||||
|                             class="btn btn-save" | ||||
|                             @click="modal.showModal = true" | ||||
|                         > | ||||
|                             {{ $t("confirm.ok") }} | ||||
|                         </button> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <a class="btn btn-delete" :href="deleteLink"> | ||||
|                             {{ $t("confirm.delete") }} | ||||
|                         </a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
|         <ul class="record_actions"> | ||||
|           <li> | ||||
|             <button class="btn btn-save" disabled> | ||||
|               {{ $t("confirm.ok") }} | ||||
|             </button> | ||||
|           </li> | ||||
|           <li> | ||||
|             <a class="btn btn-delete" :href="deleteLink"> | ||||
|               {{ $t("confirm.delete") }} | ||||
|             </a> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|  | ||||
|       <div v-else> | ||||
|         <p v-html="$t('confirm.text_active', [$t('course.step.active')])" /> | ||||
|         <ul class="record_actions"> | ||||
|           <li> | ||||
|             <button class="btn btn-save" @click="modal.showModal = true"> | ||||
|               {{ $t("confirm.ok") }} | ||||
|             </button> | ||||
|           </li> | ||||
|           <li> | ||||
|             <a class="btn btn-delete" :href="deleteLink"> | ||||
|               {{ $t("confirm.delete") }} | ||||
|             </a> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|       <modal | ||||
|         v-if="modal.showModal" | ||||
|         :modal-dialog-class="modal.modalDialogClass" | ||||
|         @close="modal.showModal = false" | ||||
|       > | ||||
|         <template #header> | ||||
|           <h2 class="modal-title"> | ||||
|             {{ $t("confirm.sure") }} | ||||
|           </h2> | ||||
|         </template> | ||||
|         <template #body> | ||||
|           <p>{{ $t("confirm.sure_description") }}</p> | ||||
|           <div v-if="accompanyingCourse.user === null"> | ||||
|             <div v-if="usersSuggestedFilteredByJob.length === 0"> | ||||
|               <p class="alert alert-warning"> | ||||
|                 {{ $t("confirm.no_suggested_referrer") }} | ||||
|               </p> | ||||
|             </div> | ||||
|             <div | ||||
|               v-if="usersSuggestedFilteredByJob.length === 1" | ||||
|               class="alert alert-info" | ||||
|         <teleport to="body"> | ||||
|             <modal | ||||
|                 v-if="modal.showModal" | ||||
|                 :modal-dialog-class="modal.modalDialogClass" | ||||
|                 @close="modal.showModal = false" | ||||
|             > | ||||
|               <p>{{ $t("confirm.one_suggested_referrer") }}:</p> | ||||
|               <ul class="list-suggest add-items inline"> | ||||
|                 <li> | ||||
|                   <user-render-box-badge | ||||
|                     :user="usersSuggestedFilteredByJob[0]" | ||||
|                   /> | ||||
|                 </li> | ||||
|               </ul> | ||||
|               <p>{{ $t("confirm.choose_suggested_referrer") }}</p> | ||||
|               <ul class="record_actions"> | ||||
|                 <li> | ||||
|                   <button | ||||
|                     class="btn btn-save mr-5" | ||||
|                     @click="chooseSuggestedReferrer" | ||||
|                   > | ||||
|                     {{ $t("confirm.choose_button") }} | ||||
|                   </button> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                   <button | ||||
|                     class="btn btn-secondary" | ||||
|                     @click="doNotChooseSuggestedReferrer" | ||||
|                   > | ||||
|                     {{ $t("confirm.do_not_choose_button") }} | ||||
|                   </button> | ||||
|                 </li> | ||||
|               </ul> | ||||
|             </div> | ||||
|           </div> | ||||
|         </template> | ||||
|         <template #footer> | ||||
|           <button | ||||
|             class="btn btn-danger" | ||||
|             :disabled="disableConfirm" | ||||
|             @click="confirmCourse" | ||||
|           > | ||||
|             {{ $t("confirm.ok") }} | ||||
|           </button> | ||||
|         </template> | ||||
|       </modal> | ||||
|     </teleport> | ||||
|   </div> | ||||
|                 <template #header> | ||||
|                     <h2 class="modal-title"> | ||||
|                         {{ $t("confirm.sure") }} | ||||
|                     </h2> | ||||
|                 </template> | ||||
|                 <template #body> | ||||
|                     <p>{{ $t("confirm.sure_description") }}</p> | ||||
|                     <div v-if="accompanyingCourse.user === null"> | ||||
|                         <div v-if="usersSuggestedFilteredByJob.length === 0"> | ||||
|                             <p class="alert alert-warning"> | ||||
|                                 {{ $t("confirm.no_suggested_referrer") }} | ||||
|                             </p> | ||||
|                         </div> | ||||
|                         <div | ||||
|                             v-if="usersSuggestedFilteredByJob.length === 1" | ||||
|                             class="alert alert-info" | ||||
|                         > | ||||
|                             <p>{{ $t("confirm.one_suggested_referrer") }}:</p> | ||||
|                             <ul class="list-suggest add-items inline"> | ||||
|                                 <li> | ||||
|                                     <user-render-box-badge | ||||
|                                         :user="usersSuggestedFilteredByJob[0]" | ||||
|                                     /> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                             <p>{{ $t("confirm.choose_suggested_referrer") }}</p> | ||||
|                             <ul class="record_actions"> | ||||
|                                 <li> | ||||
|                                     <button | ||||
|                                         class="btn btn-save mr-5" | ||||
|                                         @click="chooseSuggestedReferrer" | ||||
|                                     > | ||||
|                                         {{ $t("confirm.choose_button") }} | ||||
|                                     </button> | ||||
|                                 </li> | ||||
|                                 <li> | ||||
|                                     <button | ||||
|                                         class="btn btn-secondary" | ||||
|                                         @click="doNotChooseSuggestedReferrer" | ||||
|                                     > | ||||
|                                         {{ $t("confirm.do_not_choose_button") }} | ||||
|                                     </button> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </template> | ||||
|                 <template #footer> | ||||
|                     <button | ||||
|                         class="btn btn-danger" | ||||
|                         :disabled="disableConfirm" | ||||
|                         @click="confirmCourse" | ||||
|                     > | ||||
|                         {{ $t("confirm.ok") }} | ||||
|                     </button> | ||||
|                 </template> | ||||
|             </modal> | ||||
|         </teleport> | ||||
|     </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -123,106 +130,112 @@ import Modal from "ChillMainAssets/vuejs/_components/Modal"; | ||||
| import UserRenderBoxBadge from "ChillMainAssets/vuejs/_components/Entity/UserRenderBoxBadge"; | ||||
|  | ||||
| export default { | ||||
|   name: "Confirm", | ||||
|   components: { | ||||
|     Modal, | ||||
|     UserRenderBoxBadge, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-centered modal-md", | ||||
|       }, | ||||
|       notValidMessages: { | ||||
|         participation: { | ||||
|           msg: "confirm.participation_not_valid", | ||||
|           anchor: "#section-10", | ||||
|         }, | ||||
|         location: { | ||||
|           msg: "confirm.location_not_valid", | ||||
|           anchor: "#section-20", | ||||
|         }, | ||||
|         origin: { | ||||
|           msg: "confirm.origin_not_valid", | ||||
|           anchor: "#section-30", | ||||
|         }, | ||||
|         adminLocation: { | ||||
|           msg: "confirm.adminLocation_not_valid", | ||||
|           anchor: "#section-40", | ||||
|         }, | ||||
|         socialIssue: { | ||||
|           msg: "confirm.socialIssue_not_valid", | ||||
|           anchor: "#section-60", | ||||
|         }, | ||||
|         scopes: { | ||||
|           msg: "confirm.set_a_scope", | ||||
|           anchor: "#section-70", | ||||
|         }, | ||||
|         job: { | ||||
|           msg: "confirm.job_not_valid", | ||||
|           anchor: "#section-80", | ||||
|         }, | ||||
|       }, | ||||
|       clickedDoNotChooseReferrer: false, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       accompanyingCourse: (state) => state.accompanyingCourse, | ||||
|     }), | ||||
|     ...mapGetters([ | ||||
|       "isParticipationValid", | ||||
|       "isSocialIssueValid", | ||||
|       "isOriginValid", | ||||
|       "isAdminLocationValid", | ||||
|       "isLocationValid", | ||||
|       "isJobValid", | ||||
|       "validationKeys", | ||||
|       "isValidToBeConfirmed", | ||||
|       "usersSuggestedFilteredByJob", | ||||
|     ]), | ||||
|     deleteLink() { | ||||
|       return `/fr/parcours/${this.accompanyingCourse.id}/delete`; //TODO locale | ||||
|     name: "Confirm", | ||||
|     components: { | ||||
|         Modal, | ||||
|         UserRenderBoxBadge, | ||||
|     }, | ||||
|     disableConfirm() { | ||||
|       return ( | ||||
|         this.accompanyingCourse.user === null && | ||||
|         this.usersSuggestedFilteredByJob.length === 1 && | ||||
|         this.clickedDoNotChooseReferrer === false | ||||
|       ); | ||||
|     data() { | ||||
|         return { | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-centered modal-md", | ||||
|             }, | ||||
|             notValidMessages: { | ||||
|                 participation: { | ||||
|                     msg: "confirm.participation_not_valid", | ||||
|                     anchor: "#section-10", | ||||
|                 }, | ||||
|                 location: { | ||||
|                     msg: "confirm.location_not_valid", | ||||
|                     anchor: "#section-20", | ||||
|                 }, | ||||
|                 origin: { | ||||
|                     msg: "confirm.origin_not_valid", | ||||
|                     anchor: "#section-30", | ||||
|                 }, | ||||
|                 adminLocation: { | ||||
|                     msg: "confirm.adminLocation_not_valid", | ||||
|                     anchor: "#section-40", | ||||
|                 }, | ||||
|                 socialIssue: { | ||||
|                     msg: "confirm.socialIssue_not_valid", | ||||
|                     anchor: "#section-60", | ||||
|                 }, | ||||
|                 scopes: { | ||||
|                     msg: "confirm.set_a_scope", | ||||
|                     anchor: "#section-70", | ||||
|                 }, | ||||
|                 job: { | ||||
|                     msg: "confirm.job_not_valid", | ||||
|                     anchor: "#section-80", | ||||
|                 }, | ||||
|             }, | ||||
|             clickedDoNotChooseReferrer: false, | ||||
|         }; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     confirmCourse() { | ||||
|       this.$store | ||||
|         .dispatch("confirmAccompanyingCourse") | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             accompanyingCourse: (state) => state.accompanyingCourse, | ||||
|         }), | ||||
|         ...mapGetters([ | ||||
|             "isParticipationValid", | ||||
|             "isSocialIssueValid", | ||||
|             "isOriginValid", | ||||
|             "isAdminLocationValid", | ||||
|             "isLocationValid", | ||||
|             "isJobValid", | ||||
|             "validationKeys", | ||||
|             "isValidToBeConfirmed", | ||||
|             "usersSuggestedFilteredByJob", | ||||
|         ]), | ||||
|         deleteLink() { | ||||
|             return `/fr/parcours/${this.accompanyingCourse.id}/delete`; //TODO locale | ||||
|         }, | ||||
|         disableConfirm() { | ||||
|             return ( | ||||
|                 this.accompanyingCourse.user === null && | ||||
|                 this.usersSuggestedFilteredByJob.length === 1 && | ||||
|                 this.clickedDoNotChooseReferrer === false | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|         }, | ||||
|     }, | ||||
|     chooseSuggestedReferrer() { | ||||
|       this.$store | ||||
|         .dispatch("updateReferrer", this.usersSuggestedFilteredByJob[0]) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     methods: { | ||||
|         confirmCourse() { | ||||
|             this.$store | ||||
|                 .dispatch("confirmAccompanyingCourse") | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         chooseSuggestedReferrer() { | ||||
|             this.$store | ||||
|                 .dispatch("updateReferrer", this.usersSuggestedFilteredByJob[0]) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         doNotChooseSuggestedReferrer() { | ||||
|             this.clickedDoNotChooseReferrer = true; | ||||
|         }, | ||||
|     }, | ||||
|     doNotChooseSuggestedReferrer() { | ||||
|       this.clickedDoNotChooseReferrer = true; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,85 +1,95 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2> | ||||
|       <a id="section-20" /> | ||||
|       {{ $t("courselocation.title") }} | ||||
|     </h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2> | ||||
|             <a id="section-20" /> | ||||
|             {{ $t("courselocation.title") }} | ||||
|         </h2> | ||||
|  | ||||
|     <div | ||||
|       v-for="error in displayErrors" | ||||
|       class="alert alert-danger my-2" | ||||
|       :key="error" | ||||
|     > | ||||
|       {{ error }} | ||||
|     </div> | ||||
|  | ||||
|     <div v-if="hasNoLocation"> | ||||
|       <label class="chill-no-data-statement"> | ||||
|         {{ $t("courselocation.no_address") }} | ||||
|       </label> | ||||
|     </div> | ||||
|  | ||||
|     <div class="flex-table" v-if="accompanyingCourse.location"> | ||||
|       <div class="item-bloc"> | ||||
|         <address-render-box :address="accompanyingCourse.location" /> | ||||
|  | ||||
|         <div v-if="isPersonLocation" class="alert alert-secondary separator"> | ||||
|           <label class="col-form-label"> | ||||
|             {{ | ||||
|               $t("courselocation.person_locator", [ | ||||
|                 accompanyingCourse.personLocation.text, | ||||
|               ]) | ||||
|             }} | ||||
|           </label> | ||||
|         <div | ||||
|             v-for="error in displayErrors" | ||||
|             class="alert alert-danger my-2" | ||||
|             :key="error" | ||||
|         > | ||||
|             {{ error }} | ||||
|         </div> | ||||
|  | ||||
|         <div v-if="isTemporaryAddress" class="alert alert-warning separator"> | ||||
|           <p> | ||||
|             {{ $t("courselocation.temporary_address_must_be_changed") }} | ||||
|             <i class="fa fa-fw fa-map-marker" /> | ||||
|           </p> | ||||
|         <div v-if="hasNoLocation"> | ||||
|             <label class="chill-no-data-statement"> | ||||
|                 {{ $t("courselocation.no_address") }} | ||||
|             </label> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <div | ||||
|       v-if="hasNoPersonLocation" | ||||
|       class="alert alert-danger no-person-location" | ||||
|     > | ||||
|       <i class="fa fa-warning fa-2x" /> | ||||
|       <div> | ||||
|         <p> | ||||
|           {{ | ||||
|             $t( | ||||
|               "courselocation.associate_at_least_one_person_with_one_household_with_address", | ||||
|             ) | ||||
|           }} | ||||
|           <a href="#section-10"> | ||||
|             <i class="fa fa-level-up fa-fw" /> | ||||
|           </a> | ||||
|         </p> | ||||
|       </div> | ||||
|     </div> | ||||
|         <div class="flex-table" v-if="accompanyingCourse.location"> | ||||
|             <div class="item-bloc"> | ||||
|                 <address-render-box :address="accompanyingCourse.location" /> | ||||
|  | ||||
|     <div> | ||||
|       <ul class="record_actions"> | ||||
|         <li> | ||||
|           <add-address | ||||
|             v-if="!isPersonLocation" | ||||
|             :key="key" | ||||
|             :context="context" | ||||
|             :options="options" | ||||
|             :address-changed-callback="submitTemporaryAddress" | ||||
|             ref="addAddress" | ||||
|           /> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|                 <div | ||||
|                     v-if="isPersonLocation" | ||||
|                     class="alert alert-secondary separator" | ||||
|                 > | ||||
|                     <label class="col-form-label"> | ||||
|                         {{ | ||||
|                             $t("courselocation.person_locator", [ | ||||
|                                 accompanyingCourse.personLocation.text, | ||||
|                             ]) | ||||
|                         }} | ||||
|                     </label> | ||||
|                 </div> | ||||
|  | ||||
|     <div v-if="!isLocationValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("courselocation.not_valid") }} | ||||
|                 <div | ||||
|                     v-if="isTemporaryAddress" | ||||
|                     class="alert alert-warning separator" | ||||
|                 > | ||||
|                     <p> | ||||
|                         {{ | ||||
|                             $t( | ||||
|                                 "courselocation.temporary_address_must_be_changed", | ||||
|                             ) | ||||
|                         }} | ||||
|                         <i class="fa fa-fw fa-map-marker" /> | ||||
|                     </p> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div | ||||
|             v-if="hasNoPersonLocation" | ||||
|             class="alert alert-danger no-person-location" | ||||
|         > | ||||
|             <i class="fa fa-warning fa-2x" /> | ||||
|             <div> | ||||
|                 <p> | ||||
|                     {{ | ||||
|                         $t( | ||||
|                             "courselocation.associate_at_least_one_person_with_one_household_with_address", | ||||
|                         ) | ||||
|                     }} | ||||
|                     <a href="#section-10"> | ||||
|                         <i class="fa fa-level-up fa-fw" /> | ||||
|                     </a> | ||||
|                 </p> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|         <div> | ||||
|             <ul class="record_actions"> | ||||
|                 <li> | ||||
|                     <add-address | ||||
|                         v-if="!isPersonLocation" | ||||
|                         :key="key" | ||||
|                         :context="context" | ||||
|                         :options="options" | ||||
|                         :address-changed-callback="submitTemporaryAddress" | ||||
|                         ref="addAddress" | ||||
|                     /> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div v-if="!isLocationValid" class="alert alert-warning to-confirm"> | ||||
|             {{ $t("courselocation.not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -88,171 +98,177 @@ import AddAddress from "ChillMainAssets/vuejs/Address/components/AddAddress.vue" | ||||
| import AddressRenderBox from "ChillMainAssets/vuejs/_components/Entity/AddressRenderBox.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "CourseLocation", | ||||
|   components: { | ||||
|     AddAddress, | ||||
|     AddressRenderBox, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       addAddress: { | ||||
|         options: { | ||||
|           button: { | ||||
|             text: { | ||||
|               create: "courselocation.add_temporary_address", | ||||
|               edit: "courselocation.edit_temporary_address", | ||||
|     name: "CourseLocation", | ||||
|     components: { | ||||
|         AddAddress, | ||||
|         AddressRenderBox, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             addAddress: { | ||||
|                 options: { | ||||
|                     button: { | ||||
|                         text: { | ||||
|                             create: "courselocation.add_temporary_address", | ||||
|                             edit: "courselocation.edit_temporary_address", | ||||
|                         }, | ||||
|                     }, | ||||
|                     title: { | ||||
|                         create: "courselocation.add_temporary_address", | ||||
|                         edit: "courselocation.edit_temporary_address", | ||||
|                     }, | ||||
|                     onlyButton: true, | ||||
|                 }, | ||||
|             }, | ||||
|           }, | ||||
|           title: { | ||||
|             create: "courselocation.add_temporary_address", | ||||
|             edit: "courselocation.edit_temporary_address", | ||||
|           }, | ||||
|           onlyButton: true, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             accompanyingCourse: (state) => state.accompanyingCourse, | ||||
|             context: (state) => state.addressContext, | ||||
|         }), | ||||
|         ...mapGetters(["isLocationValid"]), | ||||
|         options() { | ||||
|             return this.addAddress.options; | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       accompanyingCourse: (state) => state.accompanyingCourse, | ||||
|       context: (state) => state.addressContext, | ||||
|     }), | ||||
|     ...mapGetters(["isLocationValid"]), | ||||
|     options() { | ||||
|       return this.addAddress.options; | ||||
|     }, | ||||
|     key() { | ||||
|       return this.context.edit | ||||
|         ? "address_" + this.context.addressId | ||||
|         : this.accompanyingCourse.type + "_" + this.accompanyingCourse.id; | ||||
|     }, | ||||
|     isTemporaryAddress() { | ||||
|       return this.accompanyingCourse.locationStatus === "address"; | ||||
|     }, | ||||
|     isPersonLocation() { | ||||
|       return this.accompanyingCourse.locationStatus === "person"; | ||||
|     }, | ||||
|     hasNoLocation() { | ||||
|       return this.accompanyingCourse.locationStatus === "none"; | ||||
|     }, | ||||
|     currentParticipations() { | ||||
|       return this.accompanyingCourse.participations.filter( | ||||
|         (p) => p.enddate !== null, | ||||
|       ); | ||||
|     }, | ||||
|     hasNoPersonLocation() { | ||||
|       let addressInParticipations_ = []; | ||||
|       this.currentParticipations.forEach((p) => { | ||||
|         addressInParticipations_.push( | ||||
|           this.checkHouseholdAddressForParticipation(p), | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       const booleanReducer = (previousValue, currentValue) => | ||||
|         previousValue || currentValue; | ||||
|  | ||||
|       let addressInParticipations = | ||||
|         addressInParticipations_.length > 0 | ||||
|           ? addressInParticipations_.reduce(booleanReducer) | ||||
|           : false; | ||||
|  | ||||
|       //console.log(addressInParticipations_, addressInParticipations); | ||||
|       return ( | ||||
|         this.accompanyingCourse.step !== "DRAFT" && | ||||
|         this.isTemporaryAddress && | ||||
|         !addressInParticipations | ||||
|       ); | ||||
|     }, | ||||
|     isContextEdit() { | ||||
|       return this.context.edit; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     checkHouseholdAddressForParticipation(participation) { | ||||
|       if (participation.person.current_household_id === null) { | ||||
|         return false; | ||||
|       } | ||||
|       return participation.person.current_household_address !== null; | ||||
|     }, | ||||
|     initAddressContext() { | ||||
|       let context = { | ||||
|         target: { | ||||
|           name: this.accompanyingCourse.type, | ||||
|           id: this.accompanyingCourse.id, | ||||
|         key() { | ||||
|             return this.context.edit | ||||
|                 ? "address_" + this.context.addressId | ||||
|                 : this.accompanyingCourse.type + | ||||
|                       "_" + | ||||
|                       this.accompanyingCourse.id; | ||||
|         }, | ||||
|         edit: false, | ||||
|         addressId: null, | ||||
|         defaults: window.addaddress, | ||||
|       }; | ||||
|       if (this.accompanyingCourse.location) { | ||||
|         context["edit"] = true; | ||||
|         context["addressId"] = this.accompanyingCourse.location.address_id; | ||||
|       } | ||||
|       this.$store.commit("setAddressContext", context); | ||||
|     }, | ||||
|     displayErrors() { | ||||
|       return this.$refs.addAddress.errorMsg; | ||||
|     }, | ||||
|     submitTemporaryAddress(payload) { | ||||
|       //console.log('@@@ click on Submit Temporary Address Button', payload); | ||||
|       payload["locationStatusTo"] = "address"; // <== temporary, not none, not person | ||||
|       this.$store | ||||
|         .dispatch("updateLocation", payload) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|         isTemporaryAddress() { | ||||
|             return this.accompanyingCourse.locationStatus === "address"; | ||||
|         }, | ||||
|         isPersonLocation() { | ||||
|             return this.accompanyingCourse.locationStatus === "person"; | ||||
|         }, | ||||
|         hasNoLocation() { | ||||
|             return this.accompanyingCourse.locationStatus === "none"; | ||||
|         }, | ||||
|         currentParticipations() { | ||||
|             return this.accompanyingCourse.participations.filter( | ||||
|                 (p) => p.enddate !== null, | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|         }, | ||||
|         hasNoPersonLocation() { | ||||
|             let addressInParticipations_ = []; | ||||
|             this.currentParticipations.forEach((p) => { | ||||
|                 addressInParticipations_.push( | ||||
|                     this.checkHouseholdAddressForParticipation(p), | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|       this.$store.commit("setEditContextTrue", payload); | ||||
|             const booleanReducer = (previousValue, currentValue) => | ||||
|                 previousValue || currentValue; | ||||
|  | ||||
|             let addressInParticipations = | ||||
|                 addressInParticipations_.length > 0 | ||||
|                     ? addressInParticipations_.reduce(booleanReducer) | ||||
|                     : false; | ||||
|  | ||||
|             //console.log(addressInParticipations_, addressInParticipations); | ||||
|             return ( | ||||
|                 this.accompanyingCourse.step !== "DRAFT" && | ||||
|                 this.isTemporaryAddress && | ||||
|                 !addressInParticipations | ||||
|             ); | ||||
|         }, | ||||
|         isContextEdit() { | ||||
|             return this.context.edit; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   created() { | ||||
|     this.initAddressContext(); | ||||
|     methods: { | ||||
|         checkHouseholdAddressForParticipation(participation) { | ||||
|             if (participation.person.current_household_id === null) { | ||||
|                 return false; | ||||
|             } | ||||
|             return participation.person.current_household_address !== null; | ||||
|         }, | ||||
|         initAddressContext() { | ||||
|             let context = { | ||||
|                 target: { | ||||
|                     name: this.accompanyingCourse.type, | ||||
|                     id: this.accompanyingCourse.id, | ||||
|                 }, | ||||
|                 edit: false, | ||||
|                 addressId: null, | ||||
|                 defaults: window.addaddress, | ||||
|             }; | ||||
|             if (this.accompanyingCourse.location) { | ||||
|                 context["edit"] = true; | ||||
|                 context["addressId"] = | ||||
|                     this.accompanyingCourse.location.address_id; | ||||
|             } | ||||
|             this.$store.commit("setAddressContext", context); | ||||
|         }, | ||||
|         displayErrors() { | ||||
|             return this.$refs.addAddress.errorMsg; | ||||
|         }, | ||||
|         submitTemporaryAddress(payload) { | ||||
|             //console.log('@@@ click on Submit Temporary Address Button', payload); | ||||
|             payload["locationStatusTo"] = "address"; // <== temporary, not none, not person | ||||
|             this.$store | ||||
|                 .dispatch("updateLocation", payload) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|     //console.log('ac.locationStatus', this.accompanyingCourse.locationStatus); | ||||
|     //console.log('ac.location (temporary location)', this.accompanyingCourse.location); | ||||
|     //console.log('ac.personLocation', this.accompanyingCourse.personLocation); | ||||
|   }, | ||||
|             this.$store.commit("setEditContextTrue", payload); | ||||
|         }, | ||||
|     }, | ||||
|     created() { | ||||
|         this.initAddressContext(); | ||||
|  | ||||
|         //console.log('ac.locationStatus', this.accompanyingCourse.locationStatus); | ||||
|         //console.log('ac.location (temporary location)', this.accompanyingCourse.location); | ||||
|         //console.log('ac.personLocation', this.accompanyingCourse.personLocation); | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
| <style lang="scss" scoped> | ||||
| div#accompanying-course { | ||||
|   div.vue-component { | ||||
|     & > div.alert.no-person-location { | ||||
|       margin: 1px 0 0; | ||||
|     } | ||||
|     div.no-person-location { | ||||
|       padding-top: 1.5em; | ||||
|       display: flex; | ||||
|       flex-direction: row; | ||||
|       & > i { | ||||
|         flex-basis: 1.5em; | ||||
|         flex-grow: 0; | ||||
|         flex-shrink: 0; | ||||
|         padding-top: 0.2em; | ||||
|         opacity: 0.75; | ||||
|       } | ||||
|       & > div { | ||||
|         flex-basis: auto; | ||||
|         div.action { | ||||
|           button.btn-update { | ||||
|             margin-right: 2em; | ||||
|           } | ||||
|     div.vue-component { | ||||
|         & > div.alert.no-person-location { | ||||
|             margin: 1px 0 0; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|     div.flex-table { | ||||
|       div.item-bloc { | ||||
|         div.alert { | ||||
|           margin: 0 -0.9em -1em; | ||||
|         div.no-person-location { | ||||
|             padding-top: 1.5em; | ||||
|             display: flex; | ||||
|             flex-direction: row; | ||||
|             & > i { | ||||
|                 flex-basis: 1.5em; | ||||
|                 flex-grow: 0; | ||||
|                 flex-shrink: 0; | ||||
|                 padding-top: 0.2em; | ||||
|                 opacity: 0.75; | ||||
|             } | ||||
|             & > div { | ||||
|                 flex-basis: auto; | ||||
|                 div.action { | ||||
|                     button.btn-update { | ||||
|                         margin-right: 2em; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         div.flex-table { | ||||
|             div.item-bloc { | ||||
|                 div.alert { | ||||
|                     margin: 0 -0.9em -1em; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,33 +1,33 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-30" />{{ $t("origin.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-30" />{{ $t("origin.title") }}</h2> | ||||
|  | ||||
|     <div class="mb-4"> | ||||
|       <label for="selectOrigin"> | ||||
|         {{ $t("origin.title") }} | ||||
|       </label> | ||||
|         <div class="mb-4"> | ||||
|             <label for="selectOrigin"> | ||||
|                 {{ $t("origin.title") }} | ||||
|             </label> | ||||
|  | ||||
|       <VueMultiselect | ||||
|         name="selectOrigin" | ||||
|         label="text" | ||||
|         :custom-label="transText" | ||||
|         track-by="id" | ||||
|         :multiple="false" | ||||
|         :searchable="true" | ||||
|         :placeholder="$t('origin.placeholder')" | ||||
|         v-model="value" | ||||
|         :options="options" | ||||
|         :select-label="$t('multiselect.select_label')" | ||||
|         :deselect-label="$t('multiselect.deselect_label')" | ||||
|         :selected-label="$t('multiselect.selected_label')" | ||||
|         @select="updateOrigin" | ||||
|       /> | ||||
|             <VueMultiselect | ||||
|                 name="selectOrigin" | ||||
|                 label="text" | ||||
|                 :custom-label="transText" | ||||
|                 track-by="id" | ||||
|                 :multiple="false" | ||||
|                 :searchable="true" | ||||
|                 :placeholder="$t('origin.placeholder')" | ||||
|                 v-model="value" | ||||
|                 :options="options" | ||||
|                 :select-label="$t('multiselect.select_label')" | ||||
|                 :deselect-label="$t('multiselect.deselect_label')" | ||||
|                 :selected-label="$t('multiselect.selected_label')" | ||||
|                 @select="updateOrigin" | ||||
|             /> | ||||
|         </div> | ||||
|  | ||||
|         <div v-if="!isOriginValid" class="alert alert-warning to-confirm"> | ||||
|             {{ $t("origin.not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div v-if="!isOriginValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("origin.not_valid") }} | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -36,58 +36,61 @@ import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import { mapState, mapGetters } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "OriginDemand", | ||||
|   components: { VueMultiselect }, | ||||
|   data() { | ||||
|     return { | ||||
|       options: [], | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       value: (state) => state.accompanyingCourse.origin, | ||||
|     }), | ||||
|     ...mapGetters(["isOriginValid"]), | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.getOptions(); | ||||
|   }, | ||||
|   methods: { | ||||
|     getOptions() { | ||||
|       const url = `/api/1.0/person/accompanying-period/origin.json`; | ||||
|       makeFetch("GET", url) | ||||
|         .then((response) => { | ||||
|           this.options = response.results; | ||||
|           return response; | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|           commit("catchError", error); | ||||
|           this.$toast.open({ message: error.txt }); | ||||
|         }); | ||||
|     name: "OriginDemand", | ||||
|     components: { VueMultiselect }, | ||||
|     data() { | ||||
|         return { | ||||
|             options: [], | ||||
|         }; | ||||
|     }, | ||||
|     updateOrigin(value) { | ||||
|       this.$store | ||||
|         .dispatch("updateOrigin", value) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             value: (state) => state.accompanyingCourse.origin, | ||||
|         }), | ||||
|         ...mapGetters(["isOriginValid"]), | ||||
|     }, | ||||
|     transText({ text }) { | ||||
|       return text.fr; | ||||
|     mounted() { | ||||
|         this.getOptions(); | ||||
|     }, | ||||
|     methods: { | ||||
|         getOptions() { | ||||
|             const url = `/api/1.0/person/accompanying-period/origin.json`; | ||||
|             makeFetch("GET", url) | ||||
|                 .then((response) => { | ||||
|                     this.options = response.results; | ||||
|                     return response; | ||||
|                 }) | ||||
|                 .catch((error) => { | ||||
|                     commit("catchError", error); | ||||
|                     this.$toast.open({ message: error.txt }); | ||||
|                 }); | ||||
|         }, | ||||
|         updateOrigin(value) { | ||||
|             this.$store | ||||
|                 .dispatch("updateOrigin", value) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         transText({ text }) { | ||||
|             return text.fr; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style src="vue-multiselect/dist/vue-multiselect.css"></style> | ||||
| <style lang="css" scoped> | ||||
| label { | ||||
|   display: none; | ||||
|     display: none; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,106 +1,121 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-10" />{{ $t("persons_associated.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-10" />{{ $t("persons_associated.title") }}</h2> | ||||
|  | ||||
|     <div v-if="currentParticipations.length > 0"> | ||||
|       <label class="col-form-label">{{ | ||||
|         $tc("persons_associated.counter", counter) | ||||
|       }}</label> | ||||
|     </div> | ||||
|     <div v-else> | ||||
|       <label class="chill-no-data-statement">{{ | ||||
|         $tc("persons_associated.counter", counter) | ||||
|       }}</label> | ||||
|     </div> | ||||
|  | ||||
|     <div | ||||
|       v-if="participationWithoutHousehold.length > 0" | ||||
|       class="alert alert-warning no-household" | ||||
|     > | ||||
|       <i class="fa fa-warning fa-2x" /> | ||||
|       <form method="GET" action="/fr/person/household/members/editor"> | ||||
|         <div class="float-button bottom"> | ||||
|           <div class="box"> | ||||
|             <div class="action"> | ||||
|               <button class="btn btn-update" type="submit"> | ||||
|                 {{ $t("persons_associated.update_household") }} | ||||
|               </button> | ||||
|             </div> | ||||
|             <p class="mb-3"> | ||||
|               {{ $t("persons_associated.person_without_household_warning") }} | ||||
|             </p> | ||||
|             <div | ||||
|               class="form-check" | ||||
|               v-for="p in participationWithoutHousehold" | ||||
|               :key="p.id" | ||||
|             > | ||||
|               <input | ||||
|                 type="checkbox" | ||||
|                 class="form-check-input" | ||||
|                 name="persons[]" | ||||
|                 checked="checked" | ||||
|                 :id="p.person.id" | ||||
|                 :value="p.person.id" | ||||
|               /> | ||||
|               <label class="form-check-label"> | ||||
|                 <person-text :person="p.person" /> | ||||
|               </label> | ||||
|             </div> | ||||
|             <input type="hidden" name="expand_suggestions" value="true" /> | ||||
|             <input type="hidden" name="returnPath" :value="getReturnPath" /> | ||||
|             <input | ||||
|               type="hidden" | ||||
|               name="accompanying_period_id" | ||||
|               :value="courseId" | ||||
|             /> | ||||
|           </div> | ||||
|         <div v-if="currentParticipations.length > 0"> | ||||
|             <label class="col-form-label">{{ | ||||
|                 $tc("persons_associated.counter", counter) | ||||
|             }}</label> | ||||
|         </div> | ||||
|         <div v-else> | ||||
|             <label class="chill-no-data-statement">{{ | ||||
|                 $tc("persons_associated.counter", counter) | ||||
|             }}</label> | ||||
|         </div> | ||||
|       </form> | ||||
|     </div> | ||||
|  | ||||
|     <div class="flex-table mb-3"> | ||||
|       <participation-item | ||||
|         v-for="participation in currentParticipations" | ||||
|         :participation="participation" | ||||
|         :key="participation.id" | ||||
|         @remove="removeParticipation" | ||||
|         @close="closeParticipation" | ||||
|       /> | ||||
|     </div> | ||||
|  | ||||
|     <div v-if="suggestedPersons.length > 0"> | ||||
|       <ul class="list-suggest add-items inline"> | ||||
|         <li | ||||
|           v-for="p in suggestedPersons" | ||||
|           :key="p.id" | ||||
|           @click="addSuggestedPerson(p)" | ||||
|         <div | ||||
|             v-if="participationWithoutHousehold.length > 0" | ||||
|             class="alert alert-warning no-household" | ||||
|         > | ||||
|           <person-text :person="p" /> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|             <i class="fa fa-warning fa-2x" /> | ||||
|             <form method="GET" action="/fr/person/household/members/editor"> | ||||
|                 <div class="float-button bottom"> | ||||
|                     <div class="box"> | ||||
|                         <div class="action"> | ||||
|                             <button class="btn btn-update" type="submit"> | ||||
|                                 {{ $t("persons_associated.update_household") }} | ||||
|                             </button> | ||||
|                         </div> | ||||
|                         <p class="mb-3"> | ||||
|                             {{ | ||||
|                                 $t( | ||||
|                                     "persons_associated.person_without_household_warning", | ||||
|                                 ) | ||||
|                             }} | ||||
|                         </p> | ||||
|                         <div | ||||
|                             class="form-check" | ||||
|                             v-for="p in participationWithoutHousehold" | ||||
|                             :key="p.id" | ||||
|                         > | ||||
|                             <input | ||||
|                                 type="checkbox" | ||||
|                                 class="form-check-input" | ||||
|                                 name="persons[]" | ||||
|                                 checked="checked" | ||||
|                                 :id="p.person.id" | ||||
|                                 :value="p.person.id" | ||||
|                             /> | ||||
|                             <label class="form-check-label"> | ||||
|                                 <person-text :person="p.person" /> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                         <input | ||||
|                             type="hidden" | ||||
|                             name="expand_suggestions" | ||||
|                             value="true" | ||||
|                         /> | ||||
|                         <input | ||||
|                             type="hidden" | ||||
|                             name="returnPath" | ||||
|                             :value="getReturnPath" | ||||
|                         /> | ||||
|                         <input | ||||
|                             type="hidden" | ||||
|                             name="accompanying_period_id" | ||||
|                             :value="courseId" | ||||
|                         /> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </form> | ||||
|         </div> | ||||
|  | ||||
|     <div> | ||||
|       <ul class="record_actions"> | ||||
|         <li class="add-persons"> | ||||
|           <add-persons | ||||
|             button-title="persons_associated.add_persons" | ||||
|             modal-title="add_persons.title" | ||||
|             :key="addPersons.key" | ||||
|             :options="addPersons.options" | ||||
|             @add-new-persons="addNewPersons" | ||||
|             ref="addPersons" | ||||
|           > | ||||
|             <!-- to cast child method --> | ||||
|           </add-persons> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|         <div class="flex-table mb-3"> | ||||
|             <participation-item | ||||
|                 v-for="participation in currentParticipations" | ||||
|                 :participation="participation" | ||||
|                 :key="participation.id" | ||||
|                 @remove="removeParticipation" | ||||
|                 @close="closeParticipation" | ||||
|             /> | ||||
|         </div> | ||||
|  | ||||
|     <div v-if="!isParticipationValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("persons_associated.participation_not_valid") }} | ||||
|         <div v-if="suggestedPersons.length > 0"> | ||||
|             <ul class="list-suggest add-items inline"> | ||||
|                 <li | ||||
|                     v-for="p in suggestedPersons" | ||||
|                     :key="p.id" | ||||
|                     @click="addSuggestedPerson(p)" | ||||
|                 > | ||||
|                     <person-text :person="p" /> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div> | ||||
|             <ul class="record_actions"> | ||||
|                 <li class="add-persons"> | ||||
|                     <add-persons | ||||
|                         button-title="persons_associated.add_persons" | ||||
|                         modal-title="add_persons.title" | ||||
|                         :key="addPersons.key" | ||||
|                         :options="addPersons.options" | ||||
|                         @add-new-persons="addNewPersons" | ||||
|                         ref="addPersons" | ||||
|                     > | ||||
|                         <!-- to cast child method --> | ||||
|                     </add-persons> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div | ||||
|             v-if="!isParticipationValid" | ||||
|             class="alert alert-warning to-confirm" | ||||
|         > | ||||
|             {{ $t("persons_associated.participation_not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -110,157 +125,176 @@ import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons.vue"; | ||||
| import PersonText from "ChillPersonAssets/vuejs/_components/Entity/PersonText.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "PersonsAssociated", | ||||
|   components: { | ||||
|     ParticipationItem, | ||||
|     AddPersons, | ||||
|     PersonText, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       addPersons: { | ||||
|         key: "persons_associated", | ||||
|         options: { | ||||
|           type: ["person"], | ||||
|           priority: null, | ||||
|           uniq: false, | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       courseId: (state) => state.accompanyingCourse.id, | ||||
|       participations: (state) => state.accompanyingCourse.participations, | ||||
|       suggestedPersons: (state) => | ||||
|         [ | ||||
|           state.accompanyingCourse.requestor, | ||||
|           ...state.accompanyingCourse.resources.map((r) => r.resource), | ||||
|         ] | ||||
|           .filter((e) => e !== null) | ||||
|           .filter((e) => e.type === "person") | ||||
|           .filter( | ||||
|             (p) => | ||||
|               !state.accompanyingCourse.participations | ||||
|                 .filter((pa) => pa.endDate === null) | ||||
|                 .map((pa) => pa.person.id) | ||||
|                 .includes(p.id), | ||||
|           ) | ||||
|           // filter persons appearing twice in requestor and resources | ||||
|           .filter((e, index, suggested) => { | ||||
|             for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|               if (i < index && e.id === suggested[i].id) { | ||||
|                 return false; | ||||
|               } | ||||
|             } | ||||
|     name: "PersonsAssociated", | ||||
|     components: { | ||||
|         ParticipationItem, | ||||
|         AddPersons, | ||||
|         PersonText, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             addPersons: { | ||||
|                 key: "persons_associated", | ||||
|                 options: { | ||||
|                     type: ["person"], | ||||
|                     priority: null, | ||||
|                     uniq: false, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             courseId: (state) => state.accompanyingCourse.id, | ||||
|             participations: (state) => state.accompanyingCourse.participations, | ||||
|             suggestedPersons: (state) => | ||||
|                 [ | ||||
|                     state.accompanyingCourse.requestor, | ||||
|                     ...state.accompanyingCourse.resources.map( | ||||
|                         (r) => r.resource, | ||||
|                     ), | ||||
|                 ] | ||||
|                     .filter((e) => e !== null) | ||||
|                     .filter((e) => e.type === "person") | ||||
|                     .filter( | ||||
|                         (p) => | ||||
|                             !state.accompanyingCourse.participations | ||||
|                                 .filter((pa) => pa.endDate === null) | ||||
|                                 .map((pa) => pa.person.id) | ||||
|                                 .includes(p.id), | ||||
|                     ) | ||||
|                     // filter persons appearing twice in requestor and resources | ||||
|                     .filter((e, index, suggested) => { | ||||
|                         for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|                             if (i < index && e.id === suggested[i].id) { | ||||
|                                 return false; | ||||
|                             } | ||||
|                         } | ||||
|  | ||||
|             return true; | ||||
|           }), | ||||
|     }), | ||||
|     ...mapGetters(["isParticipationValid"]), | ||||
|     currentParticipations() { | ||||
|       return this.participations.filter((p) => p.endDate === null); | ||||
|     }, | ||||
|     counter() { | ||||
|       return this.currentParticipations.length; | ||||
|     }, | ||||
|     participationWithoutHousehold() { | ||||
|       return this.currentParticipations.filter( | ||||
|         (p) => p.person.current_household_id === null, | ||||
|       ); | ||||
|     }, | ||||
|     getReturnPath() { | ||||
|       return ( | ||||
|         window.location.pathname + window.location.search + window.location.hash | ||||
|       ); | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     removeParticipation(item) { | ||||
|       this.$store | ||||
|         .dispatch("removeParticipation", item) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|                         return true; | ||||
|                     }), | ||||
|         }), | ||||
|         ...mapGetters(["isParticipationValid"]), | ||||
|         currentParticipations() { | ||||
|             return this.participations.filter((p) => p.endDate === null); | ||||
|         }, | ||||
|         counter() { | ||||
|             return this.currentParticipations.length; | ||||
|         }, | ||||
|         participationWithoutHousehold() { | ||||
|             return this.currentParticipations.filter( | ||||
|                 (p) => p.person.current_household_id === null, | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     closeParticipation(item) { | ||||
|       this.$store | ||||
|         .dispatch("closeParticipation", item) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|         }, | ||||
|         getReturnPath() { | ||||
|             return ( | ||||
|                 window.location.pathname + | ||||
|                 window.location.search + | ||||
|                 window.location.hash | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|         }, | ||||
|     }, | ||||
|     addNewPersons({ selected, modal }) { | ||||
|       selected.forEach(function (item) { | ||||
|         this.$store | ||||
|           .dispatch("addParticipation", item) | ||||
|           .catch(({ name, violations }) => { | ||||
|             if (name === "ValidationException" || name === "AccessException") { | ||||
|               violations.forEach((violation) => | ||||
|                 this.$toast.open({ message: violation }), | ||||
|               ); | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|             } | ||||
|           }); | ||||
|       }, this); | ||||
|       this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|       modal.showModal = false; | ||||
|     methods: { | ||||
|         removeParticipation(item) { | ||||
|             this.$store | ||||
|                 .dispatch("removeParticipation", item) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         closeParticipation(item) { | ||||
|             this.$store | ||||
|                 .dispatch("closeParticipation", item) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         addNewPersons({ selected, modal }) { | ||||
|             selected.forEach(function (item) { | ||||
|                 this.$store | ||||
|                     .dispatch("addParticipation", item) | ||||
|                     .catch(({ name, violations }) => { | ||||
|                         if ( | ||||
|                             name === "ValidationException" || | ||||
|                             name === "AccessException" | ||||
|                         ) { | ||||
|                             violations.forEach((violation) => | ||||
|                                 this.$toast.open({ message: violation }), | ||||
|                             ); | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             }, this); | ||||
|             this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|             modal.showModal = false; | ||||
|         }, | ||||
|         addSuggestedPerson(person) { | ||||
|             this.$store | ||||
|                 .dispatch("addParticipation", { | ||||
|                     result: person, | ||||
|                     type: "person", | ||||
|                 }) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|     }, | ||||
|     addSuggestedPerson(person) { | ||||
|       this.$store | ||||
|         .dispatch("addParticipation", { result: person, type: "person" }) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
| <style lang="scss" scoped> | ||||
| div#accompanying-course { | ||||
|   div.vue-component { | ||||
|     & > div.alert.no-household { | ||||
|       margin: 0 0 -1em; | ||||
|     } | ||||
|     div.no-household { | ||||
|       padding-bottom: 1.5em; | ||||
|       display: flex; | ||||
|       flex-direction: row; | ||||
|       & > i { | ||||
|         flex-basis: 1.5em; | ||||
|         flex-grow: 0; | ||||
|         flex-shrink: 0; | ||||
|         padding-top: 0.2em; | ||||
|         opacity: 0.75; | ||||
|       } | ||||
|       & > form { | ||||
|         flex-basis: auto; | ||||
|         div.action { | ||||
|           button.btn-update { | ||||
|             margin-right: 2em; | ||||
|           } | ||||
|     div.vue-component { | ||||
|         & > div.alert.no-household { | ||||
|             margin: 0 0 -1em; | ||||
|         } | ||||
|         div.no-household { | ||||
|             padding-bottom: 1.5em; | ||||
|             display: flex; | ||||
|             flex-direction: row; | ||||
|             & > i { | ||||
|                 flex-basis: 1.5em; | ||||
|                 flex-grow: 0; | ||||
|                 flex-shrink: 0; | ||||
|                 padding-top: 0.2em; | ||||
|                 opacity: 0.75; | ||||
|             } | ||||
|             & > form { | ||||
|                 flex-basis: auto; | ||||
|                 div.action { | ||||
|                     button.btn-update { | ||||
|                         margin-right: 2em; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,97 +1,98 @@ | ||||
| <template> | ||||
|   <person-render-box | ||||
|     render="bloc" | ||||
|     :options="{ | ||||
|       addInfo: true, | ||||
|       addId: false, | ||||
|       addEntity: false, | ||||
|       addLink: false, | ||||
|       addHouseholdLink: false, | ||||
|       addAltNames: true, | ||||
|       addAge: true, | ||||
|       hLevel: 3, | ||||
|       isConfidential: false, | ||||
|       isMultiline: true, | ||||
|     }" | ||||
|     :person="participation.person" | ||||
|     :return-path="getAccompanyingCourseReturnPath" | ||||
|   > | ||||
|     <template #end-bloc> | ||||
|       <div class="item-row separator"> | ||||
|         <ul class="record_actions"> | ||||
|           <button-location | ||||
|             v-if=" | ||||
|               hasCurrentHouseholdAddress && | ||||
|               !isPersonLocatingCourse(participation.person) | ||||
|             " | ||||
|             :person="participation.person" | ||||
|           /> | ||||
|           <li v-if="participation.person.current_household_id"> | ||||
|             <a | ||||
|               class="btn btn-sm btn-chill-beige" | ||||
|               :href="getCurrentHouseholdUrl" | ||||
|               :title=" | ||||
|                 $t('persons_associated.show_household_number', { | ||||
|                   id: participation.person.current_household_id, | ||||
|                 }) | ||||
|               " | ||||
|             > | ||||
|               <i class="fa fa-fw fa-home" /> | ||||
|             </a> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :type="participation.person.type" | ||||
|               :id="participation.person.id" | ||||
|               action="show" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :type="participation.person.type" | ||||
|               :id="participation.person.id" | ||||
|               action="edit" | ||||
|               @save-form-on-the-fly="saveFormOnTheFly" | ||||
|               ref="onTheFly" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <button | ||||
|               v-if="!participation.endDate" | ||||
|               class="btn btn-sm btn-remove" | ||||
|               :title="$t('persons_associated.leave_course')" | ||||
|               @click="modal.showModal = true" | ||||
|             /> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </template> | ||||
|   </person-render-box> | ||||
|  | ||||
|   <teleport to="body"> | ||||
|     <modal | ||||
|       v-if="modal.showModal" | ||||
|       :modal-dialog-class="modal.modalDialogClass" | ||||
|       @close="modal.showModal = false" | ||||
|     <person-render-box | ||||
|         render="bloc" | ||||
|         :options="{ | ||||
|             addInfo: true, | ||||
|             addId: false, | ||||
|             addEntity: false, | ||||
|             addLink: false, | ||||
|             addHouseholdLink: false, | ||||
|             addAltNames: true, | ||||
|             addAge: true, | ||||
|             hLevel: 3, | ||||
|             isConfidential: false, | ||||
|             isMultiline: true, | ||||
|         }" | ||||
|         :person="participation.person" | ||||
|         :return-path="getAccompanyingCourseReturnPath" | ||||
|     > | ||||
|       <template #header> | ||||
|         <h2 class="modal-title"> | ||||
|           {{ $t("persons_associated.sure") }} | ||||
|         </h2> | ||||
|       </template> | ||||
|       <template #body> | ||||
|         <p>{{ $t("persons_associated.sure_description") }}</p> | ||||
|       </template> | ||||
|       <template #footer> | ||||
|         <button | ||||
|           class="btn btn-danger" | ||||
|           @click.prevent="$emit('close', participation)" | ||||
|         <template #end-bloc> | ||||
|             <div class="item-row separator"> | ||||
|                 <ul class="record_actions"> | ||||
|                     <button-location | ||||
|                         v-if=" | ||||
|                             hasCurrentHouseholdAddress && | ||||
|                             !isPersonLocatingCourse(participation.person) | ||||
|                         " | ||||
|                         :person="participation.person" | ||||
|                     /> | ||||
|                     <li v-if="participation.person.current_household_id"> | ||||
|                         <a | ||||
|                             class="btn btn-sm btn-chill-beige" | ||||
|                             :href="getCurrentHouseholdUrl" | ||||
|                             :title=" | ||||
|                                 $t('persons_associated.show_household_number', { | ||||
|                                     id: participation.person | ||||
|                                         .current_household_id, | ||||
|                                 }) | ||||
|                             " | ||||
|                         > | ||||
|                             <i class="fa fa-fw fa-home" /> | ||||
|                         </a> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :type="participation.person.type" | ||||
|                             :id="participation.person.id" | ||||
|                             action="show" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :type="participation.person.type" | ||||
|                             :id="participation.person.id" | ||||
|                             action="edit" | ||||
|                             @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                             ref="onTheFly" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <button | ||||
|                             v-if="!participation.endDate" | ||||
|                             class="btn btn-sm btn-remove" | ||||
|                             :title="$t('persons_associated.leave_course')" | ||||
|                             @click="modal.showModal = true" | ||||
|                         /> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </template> | ||||
|     </person-render-box> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|         <modal | ||||
|             v-if="modal.showModal" | ||||
|             :modal-dialog-class="modal.modalDialogClass" | ||||
|             @close="modal.showModal = false" | ||||
|         > | ||||
|           {{ $t("persons_associated.ok") }} | ||||
|         </button> | ||||
|       </template> | ||||
|     </modal> | ||||
|   </teleport> | ||||
|             <template #header> | ||||
|                 <h2 class="modal-title"> | ||||
|                     {{ $t("persons_associated.sure") }} | ||||
|                 </h2> | ||||
|             </template> | ||||
|             <template #body> | ||||
|                 <p>{{ $t("persons_associated.sure_description") }}</p> | ||||
|             </template> | ||||
|             <template #footer> | ||||
|                 <button | ||||
|                     class="btn btn-danger" | ||||
|                     @click.prevent="$emit('close', participation)" | ||||
|                 > | ||||
|                     {{ $t("persons_associated.ok") }} | ||||
|                 </button> | ||||
|             </template> | ||||
|         </modal> | ||||
|     </teleport> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -102,135 +103,135 @@ import Modal from "ChillMainAssets/vuejs/_components/Modal"; | ||||
| import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
|  | ||||
| export default { | ||||
|   name: "ParticipationItem", | ||||
|   components: { | ||||
|     OnTheFly, | ||||
|     ButtonLocation, | ||||
|     PersonRenderBox, | ||||
|     Modal, | ||||
|   }, | ||||
|   props: ["participation"], | ||||
|   emits: ["remove", "close"], | ||||
|   data() { | ||||
|     return { | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-centered modal-md", | ||||
|       }, | ||||
|       PersonRenderBox: { | ||||
|         participation: "participation", | ||||
|         options: { | ||||
|           addInfo: false, | ||||
|           addId: true, | ||||
|           addAge: false, | ||||
|           hLevel: 1, | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     hasCurrentHouseholdAddress() { | ||||
|       if ( | ||||
|         !this.participation.endDate && | ||||
|         this.participation.person.current_household_address !== null | ||||
|       ) { | ||||
|         return true; | ||||
|       } | ||||
|       return false; | ||||
|     name: "ParticipationItem", | ||||
|     components: { | ||||
|         OnTheFly, | ||||
|         ButtonLocation, | ||||
|         PersonRenderBox, | ||||
|         Modal, | ||||
|     }, | ||||
|     getAccompanyingCourseReturnPath() { | ||||
|       return `fr/parcours/${this.$store.state.accompanyingCourse.id}/edit#section-10`; | ||||
|     }, | ||||
|     getCurrentHouseholdUrl() { | ||||
|       return `/fr/person/household/${this.participation.person.current_household_id}/summary?returnPath=${this.getAccompanyingCourseReturnPath}`; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     isPersonLocatingCourse(person) { | ||||
|       return this.$store.getters.isPersonLocatingCourse(person); | ||||
|     }, | ||||
|     saveFormOnTheFly(payload) { | ||||
|       console.log( | ||||
|         "saveFormOnTheFly: type", | ||||
|         payload.type, | ||||
|         ", data", | ||||
|         payload.data, | ||||
|       ); | ||||
|       payload.target = "participation"; | ||||
|  | ||||
|       let body = { type: payload.type }; | ||||
|       if (payload.type === "person") { | ||||
|         body.firstName = payload.data.firstName; | ||||
|         body.lastName = payload.data.lastName; | ||||
|         if (payload.data.birthdate !== null) { | ||||
|           body.birthdate = payload.data.birthdate; | ||||
|         } | ||||
|         body.phonenumber = payload.data.phonenumber; | ||||
|         body.mobilenumber = payload.data.mobilenumber; | ||||
|         body.email = payload.data.email; | ||||
|         body.altNames = payload.data.altNames; | ||||
|         body.gender = { | ||||
|           id: payload.data.gender.id, | ||||
|           type: payload.data.gender.type, | ||||
|     props: ["participation"], | ||||
|     emits: ["remove", "close"], | ||||
|     data() { | ||||
|         return { | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-centered modal-md", | ||||
|             }, | ||||
|             PersonRenderBox: { | ||||
|                 participation: "participation", | ||||
|                 options: { | ||||
|                     addInfo: false, | ||||
|                     addId: true, | ||||
|                     addAge: false, | ||||
|                     hLevel: 1, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|         if (payload.data.civility !== null) { | ||||
|           body.civility = { | ||||
|             id: payload.data.civility.id, | ||||
|             type: payload.data.civility.type, | ||||
|           }; | ||||
|         } | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addPerson", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|             } | ||||
|           }); | ||||
|       } else if (payload.type === "thirdparty") { | ||||
|         body.name = payload.data.text; | ||||
|         body.email = payload.data.email; | ||||
|         body.telephone = payload.data.telephone; | ||||
|         body.telephone2 = payload.data.telephone2; | ||||
|         body.address = { id: payload.data.address.address_id }; | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addThirdparty", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|             } | ||||
|           }); | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|     computed: { | ||||
|         hasCurrentHouseholdAddress() { | ||||
|             if ( | ||||
|                 !this.participation.endDate && | ||||
|                 this.participation.person.current_household_address !== null | ||||
|             ) { | ||||
|                 return true; | ||||
|             } | ||||
|             return false; | ||||
|         }, | ||||
|         getAccompanyingCourseReturnPath() { | ||||
|             return `fr/parcours/${this.$store.state.accompanyingCourse.id}/edit#section-10`; | ||||
|         }, | ||||
|         getCurrentHouseholdUrl() { | ||||
|             return `/fr/person/household/${this.participation.person.current_household_id}/summary?returnPath=${this.getAccompanyingCourseReturnPath}`; | ||||
|         }, | ||||
|     }, | ||||
|     methods: { | ||||
|         isPersonLocatingCourse(person) { | ||||
|             return this.$store.getters.isPersonLocatingCourse(person); | ||||
|         }, | ||||
|         saveFormOnTheFly(payload) { | ||||
|             console.log( | ||||
|                 "saveFormOnTheFly: type", | ||||
|                 payload.type, | ||||
|                 ", data", | ||||
|                 payload.data, | ||||
|             ); | ||||
|             payload.target = "participation"; | ||||
|  | ||||
|             let body = { type: payload.type }; | ||||
|             if (payload.type === "person") { | ||||
|                 body.firstName = payload.data.firstName; | ||||
|                 body.lastName = payload.data.lastName; | ||||
|                 if (payload.data.birthdate !== null) { | ||||
|                     body.birthdate = payload.data.birthdate; | ||||
|                 } | ||||
|                 body.phonenumber = payload.data.phonenumber; | ||||
|                 body.mobilenumber = payload.data.mobilenumber; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.altNames = payload.data.altNames; | ||||
|                 body.gender = { | ||||
|                     id: payload.data.gender.id, | ||||
|                     type: payload.data.gender.type, | ||||
|                 }; | ||||
|                 if (payload.data.civility !== null) { | ||||
|                     body.civility = { | ||||
|                         id: payload.data.civility.id, | ||||
|                         type: payload.data.civility.type, | ||||
|                     }; | ||||
|                 } | ||||
|  | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addPerson", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } else if (payload.type === "thirdparty") { | ||||
|                 body.name = payload.data.text; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.telephone = payload.data.telephone; | ||||
|                 body.telephone2 = payload.data.telephone2; | ||||
|                 body.address = { id: payload.data.address.address_id }; | ||||
|  | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addThirdparty", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } | ||||
|         }, | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,111 +1,116 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-80" />{{ $t("referrer.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-80" />{{ $t("referrer.title") }}</h2> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|       <modal | ||||
|         v-if="modal.showModal" | ||||
|         :modal-dialog-class="modal.modalDialogClass" | ||||
|         @close="cancelChange" | ||||
|       > | ||||
|         <template #header> | ||||
|           <h3 class="modal-title"> | ||||
|             {{ $t("confirm.title") }} | ||||
|           </h3> | ||||
|         </template> | ||||
|         <teleport to="body"> | ||||
|             <modal | ||||
|                 v-if="modal.showModal" | ||||
|                 :modal-dialog-class="modal.modalDialogClass" | ||||
|                 @close="cancelChange" | ||||
|             > | ||||
|                 <template #header> | ||||
|                     <h3 class="modal-title"> | ||||
|                         {{ $t("confirm.title") }} | ||||
|                     </h3> | ||||
|                 </template> | ||||
|  | ||||
|         <template #body-head> | ||||
|           <div class="modal-body"> | ||||
|             <p | ||||
|               v-html=" | ||||
|                 $t('confirm.sure_referrer', { referrer: this.value.text }) | ||||
|               " | ||||
|                 <template #body-head> | ||||
|                     <div class="modal-body"> | ||||
|                         <p | ||||
|                             v-html=" | ||||
|                                 $t('confirm.sure_referrer', { | ||||
|                                     referrer: this.value.text, | ||||
|                                 }) | ||||
|                             " | ||||
|                         /> | ||||
|                     </div> | ||||
|                 </template> | ||||
|  | ||||
|                 <template #footer> | ||||
|                     <button | ||||
|                         class="btn btn-save" | ||||
|                         @click.prevent="this.confirmReferrer" | ||||
|                     > | ||||
|                         {{ $t("confirm.ok_referrer") }} | ||||
|                     </button> | ||||
|                 </template> | ||||
|             </modal> | ||||
|         </teleport> | ||||
|  | ||||
|         <div> | ||||
|             <label class="col-form-label" for="selectJob"> | ||||
|                 {{ $t("job.label") }} | ||||
|             </label> | ||||
|  | ||||
|             <VueMultiselect | ||||
|                 name="selectJob" | ||||
|                 label="text" | ||||
|                 :custom-label="customJobLabel" | ||||
|                 track-by="id" | ||||
|                 :multiple="false" | ||||
|                 :searchable="true" | ||||
|                 :placeholder="$t('job.placeholder')" | ||||
|                 v-model="valueJob" | ||||
|                 :options="jobs" | ||||
|                 :select-label="$t('multiselect.select_label')" | ||||
|                 :deselect-label="$t('multiselect.deselect_label')" | ||||
|                 :selected-label="$t('multiselect.selected_label')" | ||||
|             /> | ||||
|           </div> | ||||
|         </template> | ||||
|  | ||||
|         <template #footer> | ||||
|           <button class="btn btn-save" @click.prevent="this.confirmReferrer"> | ||||
|             {{ $t("confirm.ok_referrer") }} | ||||
|           </button> | ||||
|         </template> | ||||
|       </modal> | ||||
|     </teleport> | ||||
|             <label class="col-form-label" for="selectReferrer"> | ||||
|                 {{ $t("referrer.label") }} | ||||
|             </label> | ||||
|  | ||||
|     <div> | ||||
|       <label class="col-form-label" for="selectJob"> | ||||
|         {{ $t("job.label") }} | ||||
|       </label> | ||||
|             <VueMultiselect | ||||
|                 name="selectReferrer" | ||||
|                 label="text" | ||||
|                 track-by="id" | ||||
|                 :multiple="false" | ||||
|                 :searchable="true" | ||||
|                 :placeholder="$t('referrer.placeholder')" | ||||
|                 v-model="value" | ||||
|                 @select="updateReferrer" | ||||
|                 @remove="removeReferrer" | ||||
|                 :options="users" | ||||
|                 :select-label="$t('multiselect.select_label')" | ||||
|                 :deselect-label="$t('multiselect.deselect_label')" | ||||
|                 :selected-label="$t('multiselect.selected_label')" | ||||
|             /> | ||||
|  | ||||
|       <VueMultiselect | ||||
|         name="selectJob" | ||||
|         label="text" | ||||
|         :custom-label="customJobLabel" | ||||
|         track-by="id" | ||||
|         :multiple="false" | ||||
|         :searchable="true" | ||||
|         :placeholder="$t('job.placeholder')" | ||||
|         v-model="valueJob" | ||||
|         :options="jobs" | ||||
|         :select-label="$t('multiselect.select_label')" | ||||
|         :deselect-label="$t('multiselect.deselect_label')" | ||||
|         :selected-label="$t('multiselect.selected_label')" | ||||
|       /> | ||||
|             <template v-if="usersSuggestedFilteredByJob.length > 0"> | ||||
|                 <ul class="list-suggest add-items inline"> | ||||
|                     <li | ||||
|                         v-for="(u, i) in usersSuggestedFilteredByJob" | ||||
|                         @click="updateReferrer(u)" | ||||
|                         :key="`referrer-${i}`" | ||||
|                     > | ||||
|                         <span> | ||||
|                             <user-render-box-badge :user="u" /> | ||||
|                         </span> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </template> | ||||
|         </div> | ||||
|  | ||||
|       <label class="col-form-label" for="selectReferrer"> | ||||
|         {{ $t("referrer.label") }} | ||||
|       </label> | ||||
|         <div> | ||||
|             <ul class="record_actions"> | ||||
|                 <li> | ||||
|                     <button | ||||
|                         class="btn btn-create" | ||||
|                         type="button" | ||||
|                         name="button" | ||||
|                         @click="assignMe" | ||||
|                     > | ||||
|                         {{ $t("referrer.assign_me") }} | ||||
|                     </button> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|       <VueMultiselect | ||||
|         name="selectReferrer" | ||||
|         label="text" | ||||
|         track-by="id" | ||||
|         :multiple="false" | ||||
|         :searchable="true" | ||||
|         :placeholder="$t('referrer.placeholder')" | ||||
|         v-model="value" | ||||
|         @select="updateReferrer" | ||||
|         @remove="removeReferrer" | ||||
|         :options="users" | ||||
|         :select-label="$t('multiselect.select_label')" | ||||
|         :deselect-label="$t('multiselect.deselect_label')" | ||||
|         :selected-label="$t('multiselect.selected_label')" | ||||
|       /> | ||||
|  | ||||
|       <template v-if="usersSuggestedFilteredByJob.length > 0"> | ||||
|         <ul class="list-suggest add-items inline"> | ||||
|           <li | ||||
|             v-for="(u, i) in usersSuggestedFilteredByJob" | ||||
|             @click="updateReferrer(u)" | ||||
|             :key="`referrer-${i}`" | ||||
|           > | ||||
|             <span> | ||||
|               <user-render-box-badge :user="u" /> | ||||
|             </span> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </template> | ||||
|         <div v-if="!isJobValid" class="alert alert-warning to-confirm"> | ||||
|             {{ $t("job.not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <div> | ||||
|       <ul class="record_actions"> | ||||
|         <li> | ||||
|           <button | ||||
|             class="btn btn-create" | ||||
|             type="button" | ||||
|             name="button" | ||||
|             @click="assignMe" | ||||
|           > | ||||
|             {{ $t("referrer.assign_me") }} | ||||
|           </button> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|  | ||||
|     <div v-if="!isJobValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("job.not_valid") }} | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -116,124 +121,134 @@ import UserRenderBoxBadge from "ChillMainAssets/vuejs/_components/Entity/UserRen | ||||
| import Modal from "ChillMainAssets/vuejs/_components/Modal"; | ||||
|  | ||||
| export default { | ||||
|   name: "Referrer", | ||||
|   components: { | ||||
|     UserRenderBoxBadge, | ||||
|     VueMultiselect, | ||||
|     Modal, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       jobs: [], | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-scrollable modal-xl", | ||||
|       }, | ||||
|       value: this.$store.state.accompanyingCourse.user, | ||||
|       confirmed: false, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       valueJob: (state) => state.accompanyingCourse.job, | ||||
|     }), | ||||
|     ...mapGetters(["isJobValid", "usersSuggestedFilteredByJob"]), | ||||
|     users: function () { | ||||
|       let users = this.$store.getters.usersFilteredByJob; | ||||
|       // ensure that the selected user is in the list. add it if necessary | ||||
|       if ( | ||||
|         this.$store.state.accompanyingCourse.user !== null && | ||||
|         users.find( | ||||
|           (u) => this.$store.state.accompanyingCourse.user.id === u.id, | ||||
|         ) === undefined | ||||
|       ) { | ||||
|         users.push(this.$store.state.accompanyingCourse.user); | ||||
|       } | ||||
|       return users; | ||||
|     name: "Referrer", | ||||
|     components: { | ||||
|         UserRenderBoxBadge, | ||||
|         VueMultiselect, | ||||
|         Modal, | ||||
|     }, | ||||
|     valueJob: { | ||||
|       get() { | ||||
|         return this.$store.state.accompanyingCourse.job; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store | ||||
|           .dispatch("updateJob", value) | ||||
|           .catch(({ name, violations }) => { | ||||
|             if (name === "ValidationException" || name === "AccessException") { | ||||
|               violations.forEach((violation) => | ||||
|                 this.$toast.open({ message: violation }), | ||||
|               ); | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|     data() { | ||||
|         return { | ||||
|             jobs: [], | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-scrollable modal-xl", | ||||
|             }, | ||||
|             value: this.$store.state.accompanyingCourse.user, | ||||
|             confirmed: false, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             valueJob: (state) => state.accompanyingCourse.job, | ||||
|         }), | ||||
|         ...mapGetters(["isJobValid", "usersSuggestedFilteredByJob"]), | ||||
|         users: function () { | ||||
|             let users = this.$store.getters.usersFilteredByJob; | ||||
|             // ensure that the selected user is in the list. add it if necessary | ||||
|             if ( | ||||
|                 this.$store.state.accompanyingCourse.user !== null && | ||||
|                 users.find( | ||||
|                     (u) => | ||||
|                         this.$store.state.accompanyingCourse.user.id === u.id, | ||||
|                 ) === undefined | ||||
|             ) { | ||||
|                 users.push(this.$store.state.accompanyingCourse.user); | ||||
|             } | ||||
|           }); | ||||
|       }, | ||||
|             return users; | ||||
|         }, | ||||
|         valueJob: { | ||||
|             get() { | ||||
|                 return this.$store.state.accompanyingCourse.job; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store | ||||
|                     .dispatch("updateJob", value) | ||||
|                     .catch(({ name, violations }) => { | ||||
|                         if ( | ||||
|                             name === "ValidationException" || | ||||
|                             name === "AccessException" | ||||
|                         ) { | ||||
|                             violations.forEach((violation) => | ||||
|                                 this.$toast.open({ message: violation }), | ||||
|                             ); | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.getJobs(); | ||||
|   }, | ||||
|   methods: { | ||||
|     updateReferrer(value) { | ||||
|       this.value = value; | ||||
|       this.toggleModal(); | ||||
|     mounted() { | ||||
|         this.getJobs(); | ||||
|     }, | ||||
|     getJobs() { | ||||
|       const url = "/api/1.0/main/user-job.json"; | ||||
|       makeFetch("GET", url) | ||||
|         .then((response) => { | ||||
|           this.jobs = response.results; | ||||
|         }) | ||||
|         .catch((error) => { | ||||
|           this.$toast.open({ message: error.txt }); | ||||
|         }); | ||||
|     methods: { | ||||
|         updateReferrer(value) { | ||||
|             this.value = value; | ||||
|             this.toggleModal(); | ||||
|         }, | ||||
|         getJobs() { | ||||
|             const url = "/api/1.0/main/user-job.json"; | ||||
|             makeFetch("GET", url) | ||||
|                 .then((response) => { | ||||
|                     this.jobs = response.results; | ||||
|                 }) | ||||
|                 .catch((error) => { | ||||
|                     this.$toast.open({ message: error.txt }); | ||||
|                 }); | ||||
|         }, | ||||
|         customJobLabel(value) { | ||||
|             return value.label.fr; | ||||
|         }, | ||||
|         assignMe() { | ||||
|             const url = `/api/1.0/main/whoami.json`; | ||||
|             makeFetch("GET", url).then((user) => { | ||||
|                 // this.value = user | ||||
|                 this.updateReferrer(user); | ||||
|             }); | ||||
|         }, | ||||
|         toggleModal() { | ||||
|             this.modal.showModal = !this.modal.showModal; | ||||
|         }, | ||||
|         confirmReferrer() { | ||||
|             this.$store | ||||
|                 .dispatch("updateReferrer", this.value) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|             this.toggleModal(); | ||||
|         }, | ||||
|         removeReferrer() { | ||||
|             console.log("remove option"); | ||||
|             this.$store | ||||
|                 .dispatch("updateReferrer", null) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         cancelChange() { | ||||
|             this.value = this.$store.state.accompanyingCourse.user; | ||||
|             this.toggleModal(); | ||||
|         }, | ||||
|     }, | ||||
|     customJobLabel(value) { | ||||
|       return value.label.fr; | ||||
|     }, | ||||
|     assignMe() { | ||||
|       const url = `/api/1.0/main/whoami.json`; | ||||
|       makeFetch("GET", url).then((user) => { | ||||
|         // this.value = user | ||||
|         this.updateReferrer(user); | ||||
|       }); | ||||
|     }, | ||||
|     toggleModal() { | ||||
|       this.modal.showModal = !this.modal.showModal; | ||||
|     }, | ||||
|     confirmReferrer() { | ||||
|       this.$store | ||||
|         .dispatch("updateReferrer", this.value) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|       this.toggleModal(); | ||||
|     }, | ||||
|     removeReferrer() { | ||||
|       console.log("remove option"); | ||||
|       this.$store | ||||
|         .dispatch("updateReferrer", null) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     cancelChange() { | ||||
|       this.value = this.$store.state.accompanyingCourse.user; | ||||
|       this.toggleModal(); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,239 +1,263 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-50" />{{ $t("requestor.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-50" />{{ $t("requestor.title") }}</h2> | ||||
|  | ||||
|     <div v-if="accompanyingCourse.requestor && isAnonymous" class="flex-table"> | ||||
|       <label> | ||||
|         <input type="checkbox" v-model="requestorIsAnonymous" class="me-2" /> | ||||
|         {{ $t("requestor.is_anonymous") }} | ||||
|       </label> | ||||
|       <confidential v-if="accompanyingCourse.requestor.type === 'thirdparty'"> | ||||
|         <template #confidential-content> | ||||
|           <third-party-render-box | ||||
|             :thirdparty="accompanyingCourse.requestor" | ||||
|             :options="{ | ||||
|               addLink: false, | ||||
|               addId: false, | ||||
|               addEntity: true, | ||||
|               addInfo: false, | ||||
|               hLevel: 3, | ||||
|               isMultiline: true, | ||||
|               isConfidential: true, | ||||
|             }" | ||||
|           > | ||||
|             <template #record-actions> | ||||
|               <ul class="record_actions"> | ||||
|                 <li> | ||||
|                   <on-the-fly | ||||
|                     :type="accompanyingCourse.requestor.type" | ||||
|                     :id="accompanyingCourse.requestor.id" | ||||
|                     action="show" | ||||
|                   /> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                   <on-the-fly | ||||
|                     :type="accompanyingCourse.requestor.type" | ||||
|                     :id="accompanyingCourse.requestor.id" | ||||
|                     action="edit" | ||||
|                     @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                     ref="onTheFly" | ||||
|                   /> | ||||
|                 </li> | ||||
|               </ul> | ||||
|             </template> | ||||
|           </third-party-render-box> | ||||
|         </template> | ||||
|       </confidential> | ||||
|  | ||||
|       <confidential v-else-if="accompanyingCourse.requestor.type === 'person'"> | ||||
|         <template #confidential-content> | ||||
|           <person-render-box | ||||
|             render="bloc" | ||||
|             :person="accompanyingCourse.requestor" | ||||
|             :options="{ | ||||
|               addLink: false, | ||||
|               addId: false, | ||||
|               addAltNames: false, | ||||
|               addEntity: true, | ||||
|               addInfo: true, | ||||
|               hLevel: 3, | ||||
|               isMultiline: true, | ||||
|               isConfidential: false, | ||||
|               addAge: true, | ||||
|             }" | ||||
|           > | ||||
|             <template #record-actions> | ||||
|               <ul class="record_actions"> | ||||
|                 <li> | ||||
|                   <on-the-fly | ||||
|                     :type="accompanyingCourse.requestor.type" | ||||
|                     :id="accompanyingCourse.requestor.id" | ||||
|                     action="show" | ||||
|                   /> | ||||
|                 </li> | ||||
|                 <li> | ||||
|                   <on-the-fly | ||||
|                     :type="accompanyingCourse.requestor.type" | ||||
|                     :id="accompanyingCourse.requestor.id" | ||||
|                     action="edit" | ||||
|                     @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                     ref="onTheFly" | ||||
|                   /> | ||||
|                 </li> | ||||
|               </ul> | ||||
|             </template> | ||||
|           </person-render-box> | ||||
|         </template> | ||||
|       </confidential> | ||||
|  | ||||
|       <ul class="record_actions"> | ||||
|         <li> | ||||
|           <button | ||||
|             class="btn btn-remove" | ||||
|             :title="$t('action.remove')" | ||||
|             @click="removeRequestor" | ||||
|           > | ||||
|             {{ $t("action.remove") }} | ||||
|           </button> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|  | ||||
|     <div | ||||
|       v-else-if="accompanyingCourse.requestor && !isAnonymous" | ||||
|       class="flex-table" | ||||
|     > | ||||
|       <label> | ||||
|         <input type="checkbox" v-model="requestorIsAnonymous" class="me-2" /> | ||||
|         {{ $t("requestor.is_anonymous") }} | ||||
|       </label> | ||||
|  | ||||
|       <third-party-render-box | ||||
|         v-if="accompanyingCourse.requestor.type === 'thirdparty'" | ||||
|         :thirdparty="accompanyingCourse.requestor" | ||||
|         :options="{ | ||||
|           addLink: false, | ||||
|           addId: false, | ||||
|           addEntity: true, | ||||
|           addInfo: false, | ||||
|           hLevel: 3, | ||||
|           isMultiline: true, | ||||
|           isConfidential: true, | ||||
|         }" | ||||
|       > | ||||
|         <template #record-actions> | ||||
|           <ul class="record_actions"> | ||||
|             <li> | ||||
|               <on-the-fly | ||||
|                 :type="accompanyingCourse.requestor.type" | ||||
|                 :id="accompanyingCourse.requestor.id" | ||||
|                 action="show" | ||||
|               /> | ||||
|             </li> | ||||
|             <li> | ||||
|               <on-the-fly | ||||
|                 :type="accompanyingCourse.requestor.type" | ||||
|                 :id="accompanyingCourse.requestor.id" | ||||
|                 action="edit" | ||||
|                 @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                 ref="onTheFly" | ||||
|               /> | ||||
|             </li> | ||||
|           </ul> | ||||
|         </template> | ||||
|       </third-party-render-box> | ||||
|  | ||||
|       <person-render-box | ||||
|         render="bloc" | ||||
|         v-if="accompanyingCourse.requestor.type === 'person'" | ||||
|         :person="accompanyingCourse.requestor" | ||||
|         :options="{ | ||||
|           addLink: false, | ||||
|           addId: false, | ||||
|           addAltNames: false, | ||||
|           addEntity: true, | ||||
|           addInfo: true, | ||||
|           hLevel: 3, | ||||
|           isMultiline: true, | ||||
|           isConfidential: false, | ||||
|         }" | ||||
|       > | ||||
|         <template #record-actions> | ||||
|           <ul class="record_actions"> | ||||
|             <li> | ||||
|               <on-the-fly | ||||
|                 :type="accompanyingCourse.requestor.type" | ||||
|                 :id="accompanyingCourse.requestor.id" | ||||
|                 action="show" | ||||
|               /> | ||||
|             </li> | ||||
|             <li> | ||||
|               <on-the-fly | ||||
|                 :type="accompanyingCourse.requestor.type" | ||||
|                 :id="accompanyingCourse.requestor.id" | ||||
|                 action="edit" | ||||
|                 @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                 ref="onTheFly" | ||||
|               /> | ||||
|             </li> | ||||
|           </ul> | ||||
|         </template> | ||||
|       </person-render-box> | ||||
|  | ||||
|       <ul class="record_actions"> | ||||
|         <li> | ||||
|           <button | ||||
|             class="btn btn-remove" | ||||
|             :title="$t('action.remove')" | ||||
|             @click="removeRequestor" | ||||
|           > | ||||
|             {{ $t("action.remove") }} | ||||
|           </button> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|  | ||||
|     <div v-else> | ||||
|       <label class="chill-no-data-statement">{{ | ||||
|         $t("requestor.counter") | ||||
|       }}</label> | ||||
|     </div> | ||||
|  | ||||
|     <div | ||||
|       v-if=" | ||||
|         accompanyingCourse.requestor === null && suggestedEntities.length > 0 | ||||
|       " | ||||
|     > | ||||
|       <ul class="list-suggest add-items inline"> | ||||
|         <li | ||||
|           v-for="p in suggestedEntities" | ||||
|           :key="uniqueId(p)" | ||||
|           @click="addSuggestedEntity(p)" | ||||
|         <div | ||||
|             v-if="accompanyingCourse.requestor && isAnonymous" | ||||
|             class="flex-table" | ||||
|         > | ||||
|           <person-text v-if="p.type === 'person'" :person="p" /> | ||||
|           <span v-else>{{ p.text }}</span> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|             <label> | ||||
|                 <input | ||||
|                     type="checkbox" | ||||
|                     v-model="requestorIsAnonymous" | ||||
|                     class="me-2" | ||||
|                 /> | ||||
|                 {{ $t("requestor.is_anonymous") }} | ||||
|             </label> | ||||
|             <confidential | ||||
|                 v-if="accompanyingCourse.requestor.type === 'thirdparty'" | ||||
|             > | ||||
|                 <template #confidential-content> | ||||
|                     <third-party-render-box | ||||
|                         :thirdparty="accompanyingCourse.requestor" | ||||
|                         :options="{ | ||||
|                             addLink: false, | ||||
|                             addId: false, | ||||
|                             addEntity: true, | ||||
|                             addInfo: false, | ||||
|                             hLevel: 3, | ||||
|                             isMultiline: true, | ||||
|                             isConfidential: true, | ||||
|                         }" | ||||
|                     > | ||||
|                         <template #record-actions> | ||||
|                             <ul class="record_actions"> | ||||
|                                 <li> | ||||
|                                     <on-the-fly | ||||
|                                         :type=" | ||||
|                                             accompanyingCourse.requestor.type | ||||
|                                         " | ||||
|                                         :id="accompanyingCourse.requestor.id" | ||||
|                                         action="show" | ||||
|                                     /> | ||||
|                                 </li> | ||||
|                                 <li> | ||||
|                                     <on-the-fly | ||||
|                                         :type=" | ||||
|                                             accompanyingCourse.requestor.type | ||||
|                                         " | ||||
|                                         :id="accompanyingCourse.requestor.id" | ||||
|                                         action="edit" | ||||
|                                         @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                                         ref="onTheFly" | ||||
|                                     /> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                         </template> | ||||
|                     </third-party-render-box> | ||||
|                 </template> | ||||
|             </confidential> | ||||
|  | ||||
|     <div> | ||||
|       <ul class="record_actions"> | ||||
|         <li class="add-persons"> | ||||
|           <add-persons | ||||
|             v-if="accompanyingCourse.requestor === null" | ||||
|             button-title="requestor.add_requestor" | ||||
|             modal-title="requestor.add_requestor" | ||||
|             :key="addPersons.key" | ||||
|             :options="addPersons.options" | ||||
|             @add-new-persons="addNewPersons" | ||||
|             ref="addPersons" | ||||
|           > | ||||
|             <!-- to cast child method --> | ||||
|           </add-persons> | ||||
|         </li> | ||||
|       </ul> | ||||
|             <confidential | ||||
|                 v-else-if="accompanyingCourse.requestor.type === 'person'" | ||||
|             > | ||||
|                 <template #confidential-content> | ||||
|                     <person-render-box | ||||
|                         render="bloc" | ||||
|                         :person="accompanyingCourse.requestor" | ||||
|                         :options="{ | ||||
|                             addLink: false, | ||||
|                             addId: false, | ||||
|                             addAltNames: false, | ||||
|                             addEntity: true, | ||||
|                             addInfo: true, | ||||
|                             hLevel: 3, | ||||
|                             isMultiline: true, | ||||
|                             isConfidential: false, | ||||
|                             addAge: true, | ||||
|                         }" | ||||
|                     > | ||||
|                         <template #record-actions> | ||||
|                             <ul class="record_actions"> | ||||
|                                 <li> | ||||
|                                     <on-the-fly | ||||
|                                         :type=" | ||||
|                                             accompanyingCourse.requestor.type | ||||
|                                         " | ||||
|                                         :id="accompanyingCourse.requestor.id" | ||||
|                                         action="show" | ||||
|                                     /> | ||||
|                                 </li> | ||||
|                                 <li> | ||||
|                                     <on-the-fly | ||||
|                                         :type=" | ||||
|                                             accompanyingCourse.requestor.type | ||||
|                                         " | ||||
|                                         :id="accompanyingCourse.requestor.id" | ||||
|                                         action="edit" | ||||
|                                         @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                                         ref="onTheFly" | ||||
|                                     /> | ||||
|                                 </li> | ||||
|                             </ul> | ||||
|                         </template> | ||||
|                     </person-render-box> | ||||
|                 </template> | ||||
|             </confidential> | ||||
|  | ||||
|             <ul class="record_actions"> | ||||
|                 <li> | ||||
|                     <button | ||||
|                         class="btn btn-remove" | ||||
|                         :title="$t('action.remove')" | ||||
|                         @click="removeRequestor" | ||||
|                     > | ||||
|                         {{ $t("action.remove") }} | ||||
|                     </button> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div | ||||
|             v-else-if="accompanyingCourse.requestor && !isAnonymous" | ||||
|             class="flex-table" | ||||
|         > | ||||
|             <label> | ||||
|                 <input | ||||
|                     type="checkbox" | ||||
|                     v-model="requestorIsAnonymous" | ||||
|                     class="me-2" | ||||
|                 /> | ||||
|                 {{ $t("requestor.is_anonymous") }} | ||||
|             </label> | ||||
|  | ||||
|             <third-party-render-box | ||||
|                 v-if="accompanyingCourse.requestor.type === 'thirdparty'" | ||||
|                 :thirdparty="accompanyingCourse.requestor" | ||||
|                 :options="{ | ||||
|                     addLink: false, | ||||
|                     addId: false, | ||||
|                     addEntity: true, | ||||
|                     addInfo: false, | ||||
|                     hLevel: 3, | ||||
|                     isMultiline: true, | ||||
|                     isConfidential: true, | ||||
|                 }" | ||||
|             > | ||||
|                 <template #record-actions> | ||||
|                     <ul class="record_actions"> | ||||
|                         <li> | ||||
|                             <on-the-fly | ||||
|                                 :type="accompanyingCourse.requestor.type" | ||||
|                                 :id="accompanyingCourse.requestor.id" | ||||
|                                 action="show" | ||||
|                             /> | ||||
|                         </li> | ||||
|                         <li> | ||||
|                             <on-the-fly | ||||
|                                 :type="accompanyingCourse.requestor.type" | ||||
|                                 :id="accompanyingCourse.requestor.id" | ||||
|                                 action="edit" | ||||
|                                 @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                                 ref="onTheFly" | ||||
|                             /> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </template> | ||||
|             </third-party-render-box> | ||||
|  | ||||
|             <person-render-box | ||||
|                 render="bloc" | ||||
|                 v-if="accompanyingCourse.requestor.type === 'person'" | ||||
|                 :person="accompanyingCourse.requestor" | ||||
|                 :options="{ | ||||
|                     addLink: false, | ||||
|                     addId: false, | ||||
|                     addAltNames: false, | ||||
|                     addEntity: true, | ||||
|                     addInfo: true, | ||||
|                     hLevel: 3, | ||||
|                     isMultiline: true, | ||||
|                     isConfidential: false, | ||||
|                 }" | ||||
|             > | ||||
|                 <template #record-actions> | ||||
|                     <ul class="record_actions"> | ||||
|                         <li> | ||||
|                             <on-the-fly | ||||
|                                 :type="accompanyingCourse.requestor.type" | ||||
|                                 :id="accompanyingCourse.requestor.id" | ||||
|                                 action="show" | ||||
|                             /> | ||||
|                         </li> | ||||
|                         <li> | ||||
|                             <on-the-fly | ||||
|                                 :type="accompanyingCourse.requestor.type" | ||||
|                                 :id="accompanyingCourse.requestor.id" | ||||
|                                 action="edit" | ||||
|                                 @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                                 ref="onTheFly" | ||||
|                             /> | ||||
|                         </li> | ||||
|                     </ul> | ||||
|                 </template> | ||||
|             </person-render-box> | ||||
|  | ||||
|             <ul class="record_actions"> | ||||
|                 <li> | ||||
|                     <button | ||||
|                         class="btn btn-remove" | ||||
|                         :title="$t('action.remove')" | ||||
|                         @click="removeRequestor" | ||||
|                     > | ||||
|                         {{ $t("action.remove") }} | ||||
|                     </button> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div v-else> | ||||
|             <label class="chill-no-data-statement">{{ | ||||
|                 $t("requestor.counter") | ||||
|             }}</label> | ||||
|         </div> | ||||
|  | ||||
|         <div | ||||
|             v-if=" | ||||
|                 accompanyingCourse.requestor === null && | ||||
|                 suggestedEntities.length > 0 | ||||
|             " | ||||
|         > | ||||
|             <ul class="list-suggest add-items inline"> | ||||
|                 <li | ||||
|                     v-for="p in suggestedEntities" | ||||
|                     :key="uniqueId(p)" | ||||
|                     @click="addSuggestedEntity(p)" | ||||
|                 > | ||||
|                     <person-text v-if="p.type === 'person'" :person="p" /> | ||||
|                     <span v-else>{{ p.text }}</span> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <div> | ||||
|             <ul class="record_actions"> | ||||
|                 <li class="add-persons"> | ||||
|                     <add-persons | ||||
|                         v-if="accompanyingCourse.requestor === null" | ||||
|                         button-title="requestor.add_requestor" | ||||
|                         modal-title="requestor.add_requestor" | ||||
|                         :key="addPersons.key" | ||||
|                         :options="addPersons.options" | ||||
|                         @add-new-persons="addNewPersons" | ||||
|                         ref="addPersons" | ||||
|                     > | ||||
|                         <!-- to cast child method --> | ||||
|                     </add-persons> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -247,208 +271,221 @@ import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import PersonText from "ChillPersonAssets/vuejs/_components/Entity/PersonText.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "Requestor", | ||||
|   components: { | ||||
|     AddPersons, | ||||
|     OnTheFly, | ||||
|     PersonRenderBox, | ||||
|     ThirdPartyRenderBox, | ||||
|     Confidential, | ||||
|     PersonText, | ||||
|   }, | ||||
|   props: ["isAnonymous"], | ||||
|   data() { | ||||
|     return { | ||||
|       addPersons: { | ||||
|         key: "requestor", | ||||
|         options: { | ||||
|           type: ["person", "thirdparty"], | ||||
|           priority: null, | ||||
|           uniq: true, | ||||
|     name: "Requestor", | ||||
|     components: { | ||||
|         AddPersons, | ||||
|         OnTheFly, | ||||
|         PersonRenderBox, | ||||
|         ThirdPartyRenderBox, | ||||
|         Confidential, | ||||
|         PersonText, | ||||
|     }, | ||||
|     props: ["isAnonymous"], | ||||
|     data() { | ||||
|         return { | ||||
|             addPersons: { | ||||
|                 key: "requestor", | ||||
|                 options: { | ||||
|                     type: ["person", "thirdparty"], | ||||
|                     priority: null, | ||||
|                     uniq: true, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             suggestedEntities: (state) => { | ||||
|                 return ( | ||||
|                     [ | ||||
|                         ...state.accompanyingCourse.participations | ||||
|                             .filter((p) => p.endDate === null) | ||||
|                             .map((p) => p.person), | ||||
|                         ...state.accompanyingCourse.resources.map( | ||||
|                             (r) => r.resource, | ||||
|                         ), | ||||
|                     ] | ||||
|                         .filter((e) => e !== null) | ||||
|                         // filter for same entity appearing twice | ||||
|                         .filter((e, index, suggested) => { | ||||
|                             for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|                                 if ( | ||||
|                                     i < index && | ||||
|                                     e.id === suggested[i].id && | ||||
|                                     e.type === suggested[i].type | ||||
|                                 ) { | ||||
|                                     return false; | ||||
|                                 } | ||||
|                             } | ||||
|  | ||||
|                             return true; | ||||
|                         }) | ||||
|                 ); | ||||
|             }, | ||||
|         }), | ||||
|         accompanyingCourse() { | ||||
|             return this.$store.state.accompanyingCourse; | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       suggestedEntities: (state) => { | ||||
|         return ( | ||||
|           [ | ||||
|             ...state.accompanyingCourse.participations | ||||
|               .filter((p) => p.endDate === null) | ||||
|               .map((p) => p.person), | ||||
|             ...state.accompanyingCourse.resources.map((r) => r.resource), | ||||
|           ] | ||||
|             .filter((e) => e !== null) | ||||
|             // filter for same entity appearing twice | ||||
|             .filter((e, index, suggested) => { | ||||
|               for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|                 if ( | ||||
|                   i < index && | ||||
|                   e.id === suggested[i].id && | ||||
|                   e.type === suggested[i].type | ||||
|                 ) { | ||||
|                   return false; | ||||
|         requestorIsAnonymous: { | ||||
|             set(value) { | ||||
|                 this.$store.dispatch("requestorIsAnonymous", value); | ||||
|             }, | ||||
|             get() { | ||||
|                 return this.$store.state.accompanyingCourse.requestorAnonymous; | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|     methods: { | ||||
|         removeRequestor() { | ||||
|             //console.log('@@ CLICK remove requestor: item'); | ||||
|             this.$store | ||||
|                 .dispatch("removeRequestor") | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         addNewPersons({ selected, modal }) { | ||||
|             //console.log('@@@ CLICK button addNewPersons', selected); | ||||
|             this.$store | ||||
|                 .dispatch("addRequestor", selected.shift()) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|  | ||||
|             this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|             modal.showModal = false; | ||||
|         }, | ||||
|         saveFormOnTheFly(payload) { | ||||
|             console.log( | ||||
|                 "saveFormOnTheFly: type", | ||||
|                 payload.type, | ||||
|                 ", data", | ||||
|                 payload.data, | ||||
|             ); | ||||
|             payload.target = "requestor"; | ||||
|  | ||||
|             let body = { type: payload.type }; | ||||
|             if (payload.type === "person") { | ||||
|                 body.firstName = payload.data.firstName; | ||||
|                 body.lastName = payload.data.lastName; | ||||
|                 if (payload.data.birthdate !== null) { | ||||
|                     body.birthdate = payload.data.birthdate; | ||||
|                 } | ||||
|               } | ||||
|                 body.phonenumber = payload.data.phonenumber; | ||||
|                 body.mobilenumber = payload.data.mobilenumber; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.altNames = payload.data.altNames; | ||||
|                 body.gender = payload.data.gender; | ||||
|  | ||||
|               return true; | ||||
|             }) | ||||
|         ); | ||||
|       }, | ||||
|     }), | ||||
|     accompanyingCourse() { | ||||
|       return this.$store.state.accompanyingCourse; | ||||
|     }, | ||||
|     requestorIsAnonymous: { | ||||
|       set(value) { | ||||
|         this.$store.dispatch("requestorIsAnonymous", value); | ||||
|       }, | ||||
|       get() { | ||||
|         return this.$store.state.accompanyingCourse.requestorAnonymous; | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     removeRequestor() { | ||||
|       //console.log('@@ CLICK remove requestor: item'); | ||||
|       this.$store.dispatch("removeRequestor").catch(({ name, violations }) => { | ||||
|         if (name === "ValidationException" || name === "AccessException") { | ||||
|           violations.forEach((violation) => | ||||
|             this.$toast.open({ message: violation }), | ||||
|           ); | ||||
|         } else { | ||||
|           this.$toast.open({ message: "An error occurred" }); | ||||
|         } | ||||
|       }); | ||||
|     }, | ||||
|     addNewPersons({ selected, modal }) { | ||||
|       //console.log('@@@ CLICK button addNewPersons', selected); | ||||
|       this.$store | ||||
|         .dispatch("addRequestor", selected.shift()) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addPerson", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } else if (payload.type === "thirdparty") { | ||||
|                 body.name = payload.data.text; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.telephone = payload.data.telephone; | ||||
|                 body.telephone2 = payload.data.telephone2; | ||||
|                 if (payload.data.address) { | ||||
|                     body.address = { id: payload.data.address.address_id }; | ||||
|                 } | ||||
|  | ||||
|       this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|       modal.showModal = false; | ||||
|     }, | ||||
|     saveFormOnTheFly(payload) { | ||||
|       console.log( | ||||
|         "saveFormOnTheFly: type", | ||||
|         payload.type, | ||||
|         ", data", | ||||
|         payload.data, | ||||
|       ); | ||||
|       payload.target = "requestor"; | ||||
|  | ||||
|       let body = { type: payload.type }; | ||||
|       if (payload.type === "person") { | ||||
|         body.firstName = payload.data.firstName; | ||||
|         body.lastName = payload.data.lastName; | ||||
|         if (payload.data.birthdate !== null) { | ||||
|           body.birthdate = payload.data.birthdate; | ||||
|         } | ||||
|         body.phonenumber = payload.data.phonenumber; | ||||
|         body.mobilenumber = payload.data.mobilenumber; | ||||
|         body.email = payload.data.email; | ||||
|         body.altNames = payload.data.altNames; | ||||
|         body.gender = payload.data.gender; | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addPerson", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addThirdparty", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } | ||||
|           }); | ||||
|       } else if (payload.type === "thirdparty") { | ||||
|         body.name = payload.data.text; | ||||
|         body.email = payload.data.email; | ||||
|         body.telephone = payload.data.telephone; | ||||
|         body.telephone2 = payload.data.telephone2; | ||||
|         if (payload.data.address) { | ||||
|           body.address = { id: payload.data.address.address_id }; | ||||
|         } | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addThirdparty", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|             } | ||||
|           }); | ||||
|       } | ||||
|         }, | ||||
|         addSuggestedEntity(e) { | ||||
|             this.$store | ||||
|                 .dispatch("addRequestor", { result: e, type: e.type }) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         uniqueId(e) { | ||||
|             return `${e.type}-${e.id}`; | ||||
|         }, | ||||
|     }, | ||||
|     addSuggestedEntity(e) { | ||||
|       this.$store | ||||
|         .dispatch("addRequestor", { result: e, type: e.type }) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     uniqueId(e) { | ||||
|       return `${e.type}-${e.id}`; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| div.flex-table { | ||||
|   margin: 1em 0 0 !important; | ||||
|   & > label, | ||||
|   & > ul.record_actions { | ||||
|     margin: 1em 3em 0 !important; | ||||
|   } | ||||
|   div.item-bloc { | ||||
|     background-color: white !important; | ||||
|     margin-top: 1em; | ||||
|   } | ||||
|     margin: 1em 0 0 !important; | ||||
|     & > label, | ||||
|     & > ul.record_actions { | ||||
|         margin: 1em 3em 0 !important; | ||||
|     } | ||||
|     div.item-bloc { | ||||
|         background-color: white !important; | ||||
|         margin-top: 1em; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .confidential { | ||||
|   display: block; | ||||
|   margin-right: 0px !important; | ||||
|     display: block; | ||||
|     margin-right: 0px !important; | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,57 +1,57 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-90" />{{ $t("resources.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-90" />{{ $t("resources.title") }}</h2> | ||||
|  | ||||
|     <div v-if="resources.length > 0"> | ||||
|       <label class="col-form-label">{{ | ||||
|         $tc("resources.counter", counter) | ||||
|       }}</label> | ||||
|     </div> | ||||
|     <div v-else> | ||||
|       <label class="chill-no-data-statement">{{ | ||||
|         $tc("resources.counter", counter) | ||||
|       }}</label> | ||||
|     </div> | ||||
|         <div v-if="resources.length > 0"> | ||||
|             <label class="col-form-label">{{ | ||||
|                 $tc("resources.counter", counter) | ||||
|             }}</label> | ||||
|         </div> | ||||
|         <div v-else> | ||||
|             <label class="chill-no-data-statement">{{ | ||||
|                 $tc("resources.counter", counter) | ||||
|             }}</label> | ||||
|         </div> | ||||
|  | ||||
|     <div class="flex-table mb-3"> | ||||
|       <resource-item | ||||
|         v-for="resource in resources" | ||||
|         :resource="resource" | ||||
|         :key="resource.id" | ||||
|         @remove="removeResource" | ||||
|       /> | ||||
|     </div> | ||||
|         <div class="flex-table mb-3"> | ||||
|             <resource-item | ||||
|                 v-for="resource in resources" | ||||
|                 :resource="resource" | ||||
|                 :key="resource.id" | ||||
|                 @remove="removeResource" | ||||
|             /> | ||||
|         </div> | ||||
|  | ||||
|     <div v-if="suggestedEntities.length > 0"> | ||||
|       <ul class="list-suggest add-items inline"> | ||||
|         <li | ||||
|           v-for="p in suggestedEntities" | ||||
|           :key="uniqueId(p)" | ||||
|           @click="addSuggestedEntity(p)" | ||||
|         > | ||||
|           <person-text v-if="p.type === 'person'" :person="p" /> | ||||
|           <span v-else>{{ p.text }}</span> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|         <div v-if="suggestedEntities.length > 0"> | ||||
|             <ul class="list-suggest add-items inline"> | ||||
|                 <li | ||||
|                     v-for="p in suggestedEntities" | ||||
|                     :key="uniqueId(p)" | ||||
|                     @click="addSuggestedEntity(p)" | ||||
|                 > | ||||
|                     <person-text v-if="p.type === 'person'" :person="p" /> | ||||
|                     <span v-else>{{ p.text }}</span> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|     <div> | ||||
|       <ul class="record_actions"> | ||||
|         <li class="add-persons"> | ||||
|           <add-persons | ||||
|             button-title="resources.add_resources" | ||||
|             modal-title="resources.add_resources" | ||||
|             :key="addPersons.key" | ||||
|             :options="addPersons.options" | ||||
|             @add-new-persons="addNewPersons" | ||||
|             ref="addPersons" | ||||
|           > | ||||
|             <!-- to cast child method --> | ||||
|           </add-persons> | ||||
|         </li> | ||||
|       </ul> | ||||
|         <div> | ||||
|             <ul class="record_actions"> | ||||
|                 <li class="add-persons"> | ||||
|                     <add-persons | ||||
|                         button-title="resources.add_resources" | ||||
|                         modal-title="resources.add_resources" | ||||
|                         :key="addPersons.key" | ||||
|                         :options="addPersons.options" | ||||
|                         @add-new-persons="addNewPersons" | ||||
|                         ref="addPersons" | ||||
|                     > | ||||
|                         <!-- to cast child method --> | ||||
|                     </add-persons> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -61,117 +61,126 @@ import ResourceItem from "./Resources/ResourceItem.vue"; | ||||
| import PersonText from "ChillPersonAssets/vuejs/_components/Entity/PersonText.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "Resources", | ||||
|   components: { | ||||
|     AddPersons, | ||||
|     ResourceItem, | ||||
|     PersonText, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       addPersons: { | ||||
|         key: "resources", | ||||
|         options: { | ||||
|           type: ["person", "thirdparty"], | ||||
|           priority: null, | ||||
|           uniq: false, | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: mapState({ | ||||
|     resources: (state) => state.accompanyingCourse.resources, | ||||
|     counter: (state) => state.accompanyingCourse.resources.length, | ||||
|     suggestedEntities: (state) => | ||||
|       [ | ||||
|         state.accompanyingCourse.requestor, | ||||
|         ...state.accompanyingCourse.participations | ||||
|           .filter((p) => p.endDate === null) | ||||
|           .map((p) => p.person), | ||||
|       ] | ||||
|         .filter((e) => e !== null) | ||||
|         .filter((e) => { | ||||
|           if (e.type === "person") { | ||||
|             return !state.accompanyingCourse.resources | ||||
|               .filter((r) => r.resource.type === "person") | ||||
|               .map((r) => r.resource.id) | ||||
|               .includes(e.id); | ||||
|           } | ||||
|           if (e.type === "thirdparty") { | ||||
|             return !state.accompanyingCourse.resources | ||||
|               .filter((r) => r.resource.type === "thirdparty") | ||||
|               .map((r) => r.resource.id) | ||||
|               .includes(e.id); | ||||
|           } | ||||
|         }) | ||||
|         // filter persons appearing twice in requestor and resources | ||||
|         .filter((e, index, suggested) => { | ||||
|           for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|             if (i < index && e.id === suggested[i].id) { | ||||
|               return false; | ||||
|             } | ||||
|           } | ||||
|     name: "Resources", | ||||
|     components: { | ||||
|         AddPersons, | ||||
|         ResourceItem, | ||||
|         PersonText, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             addPersons: { | ||||
|                 key: "resources", | ||||
|                 options: { | ||||
|                     type: ["person", "thirdparty"], | ||||
|                     priority: null, | ||||
|                     uniq: false, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: mapState({ | ||||
|         resources: (state) => state.accompanyingCourse.resources, | ||||
|         counter: (state) => state.accompanyingCourse.resources.length, | ||||
|         suggestedEntities: (state) => | ||||
|             [ | ||||
|                 state.accompanyingCourse.requestor, | ||||
|                 ...state.accompanyingCourse.participations | ||||
|                     .filter((p) => p.endDate === null) | ||||
|                     .map((p) => p.person), | ||||
|             ] | ||||
|                 .filter((e) => e !== null) | ||||
|                 .filter((e) => { | ||||
|                     if (e.type === "person") { | ||||
|                         return !state.accompanyingCourse.resources | ||||
|                             .filter((r) => r.resource.type === "person") | ||||
|                             .map((r) => r.resource.id) | ||||
|                             .includes(e.id); | ||||
|                     } | ||||
|                     if (e.type === "thirdparty") { | ||||
|                         return !state.accompanyingCourse.resources | ||||
|                             .filter((r) => r.resource.type === "thirdparty") | ||||
|                             .map((r) => r.resource.id) | ||||
|                             .includes(e.id); | ||||
|                     } | ||||
|                 }) | ||||
|                 // filter persons appearing twice in requestor and resources | ||||
|                 .filter((e, index, suggested) => { | ||||
|                     for (let i = 0; i < suggested.length; i = i + 1) { | ||||
|                         if (i < index && e.id === suggested[i].id) { | ||||
|                             return false; | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
|           return true; | ||||
|         }), | ||||
|   }), | ||||
|   methods: { | ||||
|     removeResource(item) { | ||||
|       //console.log('@@ CLICK remove resource: item', item); | ||||
|       this.$store | ||||
|         .dispatch("removeResource", item) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|                     return true; | ||||
|                 }), | ||||
|     }), | ||||
|     methods: { | ||||
|         removeResource(item) { | ||||
|             //console.log('@@ CLICK remove resource: item', item); | ||||
|             this.$store | ||||
|                 .dispatch("removeResource", item) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         addNewPersons({ selected, modal }) { | ||||
|             //console.log('@@@ CLICK button addNewPersons', selected); | ||||
|             selected.forEach(function (item) { | ||||
|                 this.$store | ||||
|                     .dispatch("addResource", item) | ||||
|                     .catch(({ name, violations }) => { | ||||
|                         if ( | ||||
|                             name === "ValidationException" || | ||||
|                             name === "AccessException" | ||||
|                         ) { | ||||
|                             violations.forEach((violation) => | ||||
|                                 this.$toast.open({ message: violation }), | ||||
|                             ); | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: violations }); | ||||
|                         } | ||||
|                     }); | ||||
|             }, this); | ||||
|             this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|             modal.showModal = false; | ||||
|         }, | ||||
|         addSuggestedEntity(e) { | ||||
|             this.$store | ||||
|                 .dispatch("addResource", { result: e, type: e.type }) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         uniqueId(e) { | ||||
|             return `${e.type}-${e.id}`; | ||||
|         }, | ||||
|     }, | ||||
|     addNewPersons({ selected, modal }) { | ||||
|       //console.log('@@@ CLICK button addNewPersons', selected); | ||||
|       selected.forEach(function (item) { | ||||
|         this.$store | ||||
|           .dispatch("addResource", item) | ||||
|           .catch(({ name, violations }) => { | ||||
|             if (name === "ValidationException" || name === "AccessException") { | ||||
|               violations.forEach((violation) => | ||||
|                 this.$toast.open({ message: violation }), | ||||
|               ); | ||||
|             } else { | ||||
|               this.$toast.open({ message: violations }); | ||||
|             } | ||||
|           }); | ||||
|       }, this); | ||||
|       this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|       modal.showModal = false; | ||||
|     }, | ||||
|     addSuggestedEntity(e) { | ||||
|       this.$store | ||||
|         .dispatch("addResource", { result: e, type: e.type }) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|     }, | ||||
|     uniqueId(e) { | ||||
|       return `${e.type}-${e.id}`; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| div.flex-bloc { | ||||
|   div.item-bloc { | ||||
|     flex-basis: 50%; | ||||
|   } | ||||
|     div.item-bloc { | ||||
|         flex-basis: 50%; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,107 +1,107 @@ | ||||
| <template> | ||||
|   <person-render-box | ||||
|     render="bloc" | ||||
|     v-if="resource.resource.type === 'person'" | ||||
|     :person="resource.resource" | ||||
|     :options="{ | ||||
|       addInfo: true, | ||||
|       addId: false, | ||||
|       addEntity: true, | ||||
|       addLink: false, | ||||
|       addAltNames: true, | ||||
|       addAge: false, | ||||
|       hLevel: 3, | ||||
|       isConfidential: true, | ||||
|     }" | ||||
|   > | ||||
|     <template #end-bloc> | ||||
|       <div class="item-row separator"> | ||||
|         <ul class="record_actions"> | ||||
|           <li> | ||||
|             <write-comment | ||||
|               :resource="resource" | ||||
|               @update-comment="updateComment" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :parent="parent" | ||||
|               :type="resource.resource.type" | ||||
|               :id="resource.resource.id" | ||||
|               action="show" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :parent="parent" | ||||
|               :type="resource.resource.type" | ||||
|               :id="resource.resource.id" | ||||
|               action="edit" | ||||
|               @save-form-on-the-fly="saveFormOnTheFly" | ||||
|               ref="onTheFly" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <button | ||||
|               class="btn btn-sm btn-remove" | ||||
|               :title="$t('action.remove')" | ||||
|               @click.prevent="$emit('remove', resource)" | ||||
|             /> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </template> | ||||
|   </person-render-box> | ||||
|     <person-render-box | ||||
|         render="bloc" | ||||
|         v-if="resource.resource.type === 'person'" | ||||
|         :person="resource.resource" | ||||
|         :options="{ | ||||
|             addInfo: true, | ||||
|             addId: false, | ||||
|             addEntity: true, | ||||
|             addLink: false, | ||||
|             addAltNames: true, | ||||
|             addAge: false, | ||||
|             hLevel: 3, | ||||
|             isConfidential: true, | ||||
|         }" | ||||
|     > | ||||
|         <template #end-bloc> | ||||
|             <div class="item-row separator"> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
|                         <write-comment | ||||
|                             :resource="resource" | ||||
|                             @update-comment="updateComment" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :parent="parent" | ||||
|                             :type="resource.resource.type" | ||||
|                             :id="resource.resource.id" | ||||
|                             action="show" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :parent="parent" | ||||
|                             :type="resource.resource.type" | ||||
|                             :id="resource.resource.id" | ||||
|                             action="edit" | ||||
|                             @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                             ref="onTheFly" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <button | ||||
|                             class="btn btn-sm btn-remove" | ||||
|                             :title="$t('action.remove')" | ||||
|                             @click.prevent="$emit('remove', resource)" | ||||
|                         /> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </template> | ||||
|     </person-render-box> | ||||
|  | ||||
|   <third-party-render-box | ||||
|     v-if="resource.resource.type === 'thirdparty'" | ||||
|     :thirdparty="resource.resource" | ||||
|     :options="{ | ||||
|       addLink: false, | ||||
|       addId: false, | ||||
|       addEntity: true, | ||||
|       addInfo: false, | ||||
|       hLevel: 3, | ||||
|     }" | ||||
|   > | ||||
|     <template #end-bloc> | ||||
|       <div class="item-row separator"> | ||||
|         <ul class="record_actions"> | ||||
|           <li> | ||||
|             <write-comment | ||||
|               :resource="resource" | ||||
|               @update-comment="updateComment" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :parent="parent" | ||||
|               :type="resource.resource.type" | ||||
|               :id="resource.resource.id" | ||||
|               action="show" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <on-the-fly | ||||
|               :parent="parent" | ||||
|               :type="resource.resource.type" | ||||
|               :id="resource.resource.id" | ||||
|               action="edit" | ||||
|               @save-form-on-the-fly="saveFormOnTheFly" | ||||
|               ref="onTheFly" | ||||
|             /> | ||||
|           </li> | ||||
|           <li> | ||||
|             <button | ||||
|               class="btn btn-sm btn-remove" | ||||
|               :title="$t('action.remove')" | ||||
|               @click.prevent="$emit('remove', resource)" | ||||
|             /> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </template> | ||||
|   </third-party-render-box> | ||||
|     <third-party-render-box | ||||
|         v-if="resource.resource.type === 'thirdparty'" | ||||
|         :thirdparty="resource.resource" | ||||
|         :options="{ | ||||
|             addLink: false, | ||||
|             addId: false, | ||||
|             addEntity: true, | ||||
|             addInfo: false, | ||||
|             hLevel: 3, | ||||
|         }" | ||||
|     > | ||||
|         <template #end-bloc> | ||||
|             <div class="item-row separator"> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li> | ||||
|                         <write-comment | ||||
|                             :resource="resource" | ||||
|                             @update-comment="updateComment" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :parent="parent" | ||||
|                             :type="resource.resource.type" | ||||
|                             :id="resource.resource.id" | ||||
|                             action="show" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <on-the-fly | ||||
|                             :parent="parent" | ||||
|                             :type="resource.resource.type" | ||||
|                             :id="resource.resource.id" | ||||
|                             action="edit" | ||||
|                             @save-form-on-the-fly="saveFormOnTheFly" | ||||
|                             ref="onTheFly" | ||||
|                         /> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <button | ||||
|                             class="btn btn-sm btn-remove" | ||||
|                             :title="$t('action.remove')" | ||||
|                             @click.prevent="$emit('remove', resource)" | ||||
|                         /> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </template> | ||||
|     </third-party-render-box> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -112,130 +112,130 @@ import WriteComment from "./WriteComment"; | ||||
| import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
|  | ||||
| export default { | ||||
|   name: "ResourceItem", | ||||
|   components: { | ||||
|     OnTheFly, | ||||
|     PersonRenderBox, | ||||
|     ThirdPartyRenderBox, | ||||
|     WriteComment, | ||||
|   }, | ||||
|   props: ["resource"], | ||||
|   emits: ["remove"], | ||||
|   computed: { | ||||
|     parent() { | ||||
|       return { | ||||
|         type: this.resource.type, | ||||
|         id: this.resource.id, | ||||
|         comment: this.resource.comment, | ||||
|         parent: { | ||||
|           type: this.$store.state.accompanyingCourse.type, | ||||
|           id: this.$store.state.accompanyingCourse.id, | ||||
|     name: "ResourceItem", | ||||
|     components: { | ||||
|         OnTheFly, | ||||
|         PersonRenderBox, | ||||
|         ThirdPartyRenderBox, | ||||
|         WriteComment, | ||||
|     }, | ||||
|     props: ["resource"], | ||||
|     emits: ["remove"], | ||||
|     computed: { | ||||
|         parent() { | ||||
|             return { | ||||
|                 type: this.resource.type, | ||||
|                 id: this.resource.id, | ||||
|                 comment: this.resource.comment, | ||||
|                 parent: { | ||||
|                     type: this.$store.state.accompanyingCourse.type, | ||||
|                     id: this.$store.state.accompanyingCourse.id, | ||||
|                 }, | ||||
|             }; | ||||
|         }, | ||||
|       }; | ||||
|     }, | ||||
|     hasCurrentHouseholdAddress() { | ||||
|       if (this.resource.resource.current_household_address !== null) { | ||||
|         return true; | ||||
|       } | ||||
|       return false; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     saveFormOnTheFly(payload) { | ||||
|       // console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data); | ||||
|       payload.target = "resource"; | ||||
|  | ||||
|       let body = { type: payload.type }; | ||||
|       if (payload.type === "person") { | ||||
|         body.firstName = payload.data.firstName; | ||||
|         body.lastName = payload.data.lastName; | ||||
|         if (payload.data.birthdate !== null) { | ||||
|           body.birthdate = payload.data.birthdate; | ||||
|         } | ||||
|         body.phonenumber = payload.data.phonenumber; | ||||
|         body.mobilenumber = payload.data.mobilenumber; | ||||
|         body.email = payload.data.email; | ||||
|         body.altNames = payload.data.altNames; | ||||
|         body.gender = { | ||||
|           id: payload.data.gender.id, | ||||
|           type: payload.data.gender.type, | ||||
|         }; | ||||
|         if (payload.data.civility !== null) { | ||||
|           body.civility = { | ||||
|             id: payload.data.civility.id, | ||||
|             type: payload.data.civility.type, | ||||
|           }; | ||||
|         } | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addPerson", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|         hasCurrentHouseholdAddress() { | ||||
|             if (this.resource.resource.current_household_address !== null) { | ||||
|                 return true; | ||||
|             } | ||||
|           }); | ||||
|       } else if (payload.type === "thirdparty") { | ||||
|         // console.log('data', payload.data) | ||||
|         body.firstname = payload.data.firstname; | ||||
|         body.name = payload.data.name; | ||||
|         body.email = payload.data.email; | ||||
|         body.telephone = payload.data.telephone; | ||||
|         body.telephone2 = payload.data.telephone2; | ||||
|         body.address = payload.data.address | ||||
|           ? { id: payload.data.address.address_id } | ||||
|           : null; | ||||
|         if (null !== payload.data.civility) { | ||||
|           body.civility = { | ||||
|             type: "chill_main_civility", | ||||
|             id: payload.data.civility.id, | ||||
|           }; | ||||
|         } | ||||
|         if (null !== payload.data.profession) { | ||||
|           body.profession = payload.data.profession; | ||||
|         } | ||||
|         // console.log('body', body); | ||||
|             return false; | ||||
|         }, | ||||
|     }, | ||||
|     methods: { | ||||
|         saveFormOnTheFly(payload) { | ||||
|             // console.log('saveFormOnTheFly: type', payload.type, ', data', payload.data); | ||||
|             payload.target = "resource"; | ||||
|  | ||||
|         makeFetch( | ||||
|           "PATCH", | ||||
|           `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|           body, | ||||
|         ) | ||||
|           .then((response) => { | ||||
|             this.$store.dispatch("addThirdparty", { | ||||
|               target: payload.target, | ||||
|               body: response, | ||||
|             }); | ||||
|             this.$refs.onTheFly.closeModal(); | ||||
|           }) | ||||
|           .catch((error) => { | ||||
|             if (error.name === "ValidationException") { | ||||
|               for (let v of error.violations) { | ||||
|                 this.$toast.open({ message: v }); | ||||
|               } | ||||
|             } else { | ||||
|               this.$toast.open({ message: "An error occurred" }); | ||||
|             let body = { type: payload.type }; | ||||
|             if (payload.type === "person") { | ||||
|                 body.firstName = payload.data.firstName; | ||||
|                 body.lastName = payload.data.lastName; | ||||
|                 if (payload.data.birthdate !== null) { | ||||
|                     body.birthdate = payload.data.birthdate; | ||||
|                 } | ||||
|                 body.phonenumber = payload.data.phonenumber; | ||||
|                 body.mobilenumber = payload.data.mobilenumber; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.altNames = payload.data.altNames; | ||||
|                 body.gender = { | ||||
|                     id: payload.data.gender.id, | ||||
|                     type: payload.data.gender.type, | ||||
|                 }; | ||||
|                 if (payload.data.civility !== null) { | ||||
|                     body.civility = { | ||||
|                         id: payload.data.civility.id, | ||||
|                         type: payload.data.civility.type, | ||||
|                     }; | ||||
|                 } | ||||
|  | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/person/person/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addPerson", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } else if (payload.type === "thirdparty") { | ||||
|                 // console.log('data', payload.data) | ||||
|                 body.firstname = payload.data.firstname; | ||||
|                 body.name = payload.data.name; | ||||
|                 body.email = payload.data.email; | ||||
|                 body.telephone = payload.data.telephone; | ||||
|                 body.telephone2 = payload.data.telephone2; | ||||
|                 body.address = payload.data.address | ||||
|                     ? { id: payload.data.address.address_id } | ||||
|                     : null; | ||||
|                 if (null !== payload.data.civility) { | ||||
|                     body.civility = { | ||||
|                         type: "chill_main_civility", | ||||
|                         id: payload.data.civility.id, | ||||
|                     }; | ||||
|                 } | ||||
|                 if (null !== payload.data.profession) { | ||||
|                     body.profession = payload.data.profession; | ||||
|                 } | ||||
|                 // console.log('body', body); | ||||
|  | ||||
|                 makeFetch( | ||||
|                     "PATCH", | ||||
|                     `/api/1.0/thirdparty/thirdparty/${payload.data.id}.json`, | ||||
|                     body, | ||||
|                 ) | ||||
|                     .then((response) => { | ||||
|                         this.$store.dispatch("addThirdparty", { | ||||
|                             target: payload.target, | ||||
|                             body: response, | ||||
|                         }); | ||||
|                         this.$refs.onTheFly.closeModal(); | ||||
|                     }) | ||||
|                     .catch((error) => { | ||||
|                         if (error.name === "ValidationException") { | ||||
|                             for (let v of error.violations) { | ||||
|                                 this.$toast.open({ message: v }); | ||||
|                             } | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             } | ||||
|           }); | ||||
|       } | ||||
|         }, | ||||
|         updateComment(resource) { | ||||
|             console.log("updateComment", resource); | ||||
|             this.$store.commit("updateResource", resource); | ||||
|         }, | ||||
|     }, | ||||
|     updateComment(resource) { | ||||
|       console.log("updateComment", resource); | ||||
|       this.$store.commit("updateResource", resource); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,32 +1,34 @@ | ||||
| <template> | ||||
|   <a | ||||
|     class="btn btn-sm btn-misc change-icon" | ||||
|     :title="$t('write_comment')" | ||||
|     @click="openModal" | ||||
|     ><i class="fa fa-pencil-square-o" /> | ||||
|   </a> | ||||
|     <a | ||||
|         class="btn btn-sm btn-misc change-icon" | ||||
|         :title="$t('write_comment')" | ||||
|         @click="openModal" | ||||
|         ><i class="fa fa-pencil-square-o" /> | ||||
|     </a> | ||||
|  | ||||
|   <teleport to="body"> | ||||
|     <modal | ||||
|       v-if="modal.showModal" | ||||
|       :modal-dialog-class="modal.modalDialogClass" | ||||
|       @close="modal.showModal = false" | ||||
|     > | ||||
|       <template #header> | ||||
|         <h3 class="modal-title"> | ||||
|           {{ $t("write_comment_about", { r: resource.resource.text }) }} | ||||
|         </h3> | ||||
|       </template> | ||||
|       <template #body> | ||||
|         <comment-editor v-model="content" /> | ||||
|       </template> | ||||
|       <template #footer> | ||||
|         <a class="btn btn-save" @click="saveAction"> | ||||
|           {{ $t("action.save") }} | ||||
|         </a> | ||||
|       </template> | ||||
|     </modal> | ||||
|   </teleport> | ||||
|     <teleport to="body"> | ||||
|         <modal | ||||
|             v-if="modal.showModal" | ||||
|             :modal-dialog-class="modal.modalDialogClass" | ||||
|             @close="modal.showModal = false" | ||||
|         > | ||||
|             <template #header> | ||||
|                 <h3 class="modal-title"> | ||||
|                     {{ | ||||
|                         $t("write_comment_about", { r: resource.resource.text }) | ||||
|                     }} | ||||
|                 </h3> | ||||
|             </template> | ||||
|             <template #body> | ||||
|                 <comment-editor v-model="content" /> | ||||
|             </template> | ||||
|             <template #footer> | ||||
|                 <a class="btn btn-save" @click="saveAction"> | ||||
|                     {{ $t("action.save") }} | ||||
|                 </a> | ||||
|             </template> | ||||
|         </modal> | ||||
|     </teleport> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -35,71 +37,71 @@ import { makeFetch } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import CommentEditor from "ChillMainAssets/vuejs/_components/CommentEditor/CommentEditor.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "WriteComment", | ||||
|   components: { | ||||
|     Modal, | ||||
|     CommentEditor, | ||||
|   }, | ||||
|   props: ["resource"], | ||||
|   emits: ["updateComment"], | ||||
|   data() { | ||||
|     return { | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-scrollable modal-xl", | ||||
|       }, | ||||
|       formdata: { | ||||
|         content: this.resource.comment, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   i18n: { | ||||
|     messages: { | ||||
|       fr: { | ||||
|         write_comment: "Écrire un commentaire", | ||||
|         write_comment_about: "Écrire un commentaire à propos de {r}", | ||||
|         comment_placeholder: "Commencez à écrire...", | ||||
|       }, | ||||
|     name: "WriteComment", | ||||
|     components: { | ||||
|         Modal, | ||||
|         CommentEditor, | ||||
|     }, | ||||
|   }, | ||||
|   computed: { | ||||
|     editor: () => ClassicEditor, | ||||
|     editorConfig: () => classicEditorConfig, | ||||
|     content: { | ||||
|       set(value) { | ||||
|         this.formdata.content = value; | ||||
|       }, | ||||
|       get() { | ||||
|         return this.formdata.content; | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     openModal() { | ||||
|       //console.log('write comment for', this.resource.resource.type, this.resource.resource.id); | ||||
|       this.modal.showModal = true; | ||||
|     }, | ||||
|     saveAction() { | ||||
|       //console.log('save comment', this.resource.id, this.formdata.content); | ||||
|       this.patchResource(this.resource.id, this.formdata.content); | ||||
|     }, | ||||
|     patchResource(id, comment) { | ||||
|       let url = `/api/1.0/person/accompanying-period/resource/${id}.json`, | ||||
|         body = { | ||||
|           type: "accompanying_period_resource", | ||||
|           comment: comment, | ||||
|     props: ["resource"], | ||||
|     emits: ["updateComment"], | ||||
|     data() { | ||||
|         return { | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-scrollable modal-xl", | ||||
|             }, | ||||
|             formdata: { | ||||
|                 content: this.resource.comment, | ||||
|             }, | ||||
|         }; | ||||
|       makeFetch("PATCH", url, body).then((r) => { | ||||
|         let resource = { | ||||
|           type: "accompanying_period_resource", | ||||
|           id: r.id, | ||||
|           comment: r.comment, | ||||
|           resource: r.resource, | ||||
|         }; | ||||
|         this.$emit("updateComment", resource); | ||||
|         this.modal.showModal = false; | ||||
|       }); | ||||
|     }, | ||||
|   }, | ||||
|     i18n: { | ||||
|         messages: { | ||||
|             fr: { | ||||
|                 write_comment: "Écrire un commentaire", | ||||
|                 write_comment_about: "Écrire un commentaire à propos de {r}", | ||||
|                 comment_placeholder: "Commencez à écrire...", | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|     computed: { | ||||
|         editor: () => ClassicEditor, | ||||
|         editorConfig: () => classicEditorConfig, | ||||
|         content: { | ||||
|             set(value) { | ||||
|                 this.formdata.content = value; | ||||
|             }, | ||||
|             get() { | ||||
|                 return this.formdata.content; | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|     methods: { | ||||
|         openModal() { | ||||
|             //console.log('write comment for', this.resource.resource.type, this.resource.resource.id); | ||||
|             this.modal.showModal = true; | ||||
|         }, | ||||
|         saveAction() { | ||||
|             //console.log('save comment', this.resource.id, this.formdata.content); | ||||
|             this.patchResource(this.resource.id, this.formdata.content); | ||||
|         }, | ||||
|         patchResource(id, comment) { | ||||
|             let url = `/api/1.0/person/accompanying-period/resource/${id}.json`, | ||||
|                 body = { | ||||
|                     type: "accompanying_period_resource", | ||||
|                     comment: comment, | ||||
|                 }; | ||||
|             makeFetch("PATCH", url, body).then((r) => { | ||||
|                 let resource = { | ||||
|                     type: "accompanying_period_resource", | ||||
|                     id: r.id, | ||||
|                     comment: r.comment, | ||||
|                     resource: r.resource, | ||||
|                 }; | ||||
|                 this.$emit("updateComment", resource); | ||||
|                 this.modal.showModal = false; | ||||
|             }); | ||||
|         }, | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,25 +1,25 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-70" />{{ $t("scopes.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-70" />{{ $t("scopes.title") }}</h2> | ||||
|  | ||||
|     <div class="mb-4"> | ||||
|       <div class="form-check" v-for="s in scopes" :key="s.id"> | ||||
|         <input | ||||
|           class="form-check-input" | ||||
|           type="checkbox" | ||||
|           v-model="checkedScopes" | ||||
|           :value="s" | ||||
|         /> | ||||
|         <label class="form-check-label"> | ||||
|           {{ localizeString(s.name) }} | ||||
|         </label> | ||||
|       </div> | ||||
|     </div> | ||||
|         <div class="mb-4"> | ||||
|             <div class="form-check" v-for="s in scopes" :key="s.id"> | ||||
|                 <input | ||||
|                     class="form-check-input" | ||||
|                     type="checkbox" | ||||
|                     v-model="checkedScopes" | ||||
|                     :value="s" | ||||
|                 /> | ||||
|                 <label class="form-check-label"> | ||||
|                     {{ localizeString(s.name) }} | ||||
|                 </label> | ||||
|             </div> | ||||
|         </div> | ||||
|  | ||||
|     <div v-if="!isScopeValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("scopes.add_at_least_one") }} | ||||
|         <div v-if="!isScopeValid" class="alert alert-warning to-confirm"> | ||||
|             {{ $t("scopes.add_at_least_one") }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -27,33 +27,38 @@ import { mapState, mapGetters } from "vuex"; | ||||
| import { localizeString } from "ChillMainAssets/lib/localizationHelper/localizationHelper"; | ||||
|  | ||||
| export default { | ||||
|   name: "Scopes", | ||||
|   computed: { | ||||
|     ...mapState(["scopes", "scopesAtStart"]), | ||||
|     ...mapGetters(["isScopeValid"]), | ||||
|     checkedScopes: { | ||||
|       get: function () { | ||||
|         return this.$store.state.accompanyingCourse.scopes; | ||||
|       }, | ||||
|       set: function (v) { | ||||
|         this.$store.dispatch("setScopes", v).catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|       }, | ||||
|     name: "Scopes", | ||||
|     computed: { | ||||
|         ...mapState(["scopes", "scopesAtStart"]), | ||||
|         ...mapGetters(["isScopeValid"]), | ||||
|         checkedScopes: { | ||||
|             get: function () { | ||||
|                 return this.$store.state.accompanyingCourse.scopes; | ||||
|             }, | ||||
|             set: function (v) { | ||||
|                 this.$store | ||||
|                     .dispatch("setScopes", v) | ||||
|                     .catch(({ name, violations }) => { | ||||
|                         if ( | ||||
|                             name === "ValidationException" || | ||||
|                             name === "AccessException" | ||||
|                         ) { | ||||
|                             violations.forEach((violation) => | ||||
|                                 this.$toast.open({ message: violation }), | ||||
|                             ); | ||||
|                         } else { | ||||
|                             this.$toast.open({ message: "An error occurred" }); | ||||
|                         } | ||||
|                     }); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     localizeString, | ||||
|     restore() { | ||||
|       console.log("restore"); | ||||
|     methods: { | ||||
|         localizeString, | ||||
|         restore() { | ||||
|             console.log("restore"); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,30 +1,30 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2><a id="section-60" />{{ $t("social_issue.title") }}</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2><a id="section-60" />{{ $t("social_issue.title") }}</h2> | ||||
|  | ||||
|     <div class="my-4"> | ||||
|       <!--label for="field">{{ $t('social_issue.label') }}</label | ||||
|         <div class="my-4"> | ||||
|             <!--label for="field">{{ $t('social_issue.label') }}</label | ||||
|         --> | ||||
|       <VueMultiselect | ||||
|         name="field" | ||||
|         :close-on-select="true" | ||||
|         :allow-empty="true" | ||||
|         :show-labels="false" | ||||
|         track-by="id" | ||||
|         label="text" | ||||
|         :multiple="true" | ||||
|         :searchable="true" | ||||
|         :placeholder="$t('social_issue.label')" | ||||
|         @update:model-value="updateSocialIssues" | ||||
|         :model-value="value" | ||||
|         :options="options" | ||||
|       /> | ||||
|     </div> | ||||
|             <VueMultiselect | ||||
|                 name="field" | ||||
|                 :close-on-select="true" | ||||
|                 :allow-empty="true" | ||||
|                 :show-labels="false" | ||||
|                 track-by="id" | ||||
|                 label="text" | ||||
|                 :multiple="true" | ||||
|                 :searchable="true" | ||||
|                 :placeholder="$t('social_issue.label')" | ||||
|                 @update:model-value="updateSocialIssues" | ||||
|                 :model-value="value" | ||||
|                 :options="options" | ||||
|             /> | ||||
|         </div> | ||||
|  | ||||
|     <div v-if="!isSocialIssueValid" class="alert alert-warning to-confirm"> | ||||
|       {{ $t("social_issue.not_valid") }} | ||||
|         <div v-if="!isSocialIssueValid" class="alert alert-warning to-confirm"> | ||||
|             {{ $t("social_issue.not_valid") }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -33,54 +33,59 @@ import { fetchResults } from "ChillMainAssets/lib/api/apiMethods"; | ||||
| import { mapGetters, mapState } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "SocialIssue", | ||||
|   components: { VueMultiselect }, | ||||
|   data() { | ||||
|     return { | ||||
|       options: [], | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       value: (state) => state.accompanyingCourse.socialIssues, | ||||
|     }), | ||||
|     ...mapGetters(["isSocialIssueValid"]), | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.getOptions(); | ||||
|   }, | ||||
|   methods: { | ||||
|     getOptions() { | ||||
|       fetchResults(`/api/1.0/person/social-work/social-issue.json`).then( | ||||
|         (response) => { | ||||
|           this.options = response; | ||||
|         }, | ||||
|       ); | ||||
|     name: "SocialIssue", | ||||
|     components: { VueMultiselect }, | ||||
|     data() { | ||||
|         return { | ||||
|             options: [], | ||||
|         }; | ||||
|     }, | ||||
|     updateSocialIssues(value) { | ||||
|       this.$store | ||||
|         .dispatch("updateSocialIssues", this.transformValue(value)) | ||||
|         .catch(({ name, violations }) => { | ||||
|           if (name === "ValidationException" || name === "AccessException") { | ||||
|             violations.forEach((violation) => | ||||
|               this.$toast.open({ message: violation }), | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             value: (state) => state.accompanyingCourse.socialIssues, | ||||
|         }), | ||||
|         ...mapGetters(["isSocialIssueValid"]), | ||||
|     }, | ||||
|     mounted() { | ||||
|         this.getOptions(); | ||||
|     }, | ||||
|     methods: { | ||||
|         getOptions() { | ||||
|             fetchResults(`/api/1.0/person/social-work/social-issue.json`).then( | ||||
|                 (response) => { | ||||
|                     this.options = response; | ||||
|                 }, | ||||
|             ); | ||||
|           } else { | ||||
|             this.$toast.open({ message: "An error occurred" }); | ||||
|           } | ||||
|         }); | ||||
|         }, | ||||
|         updateSocialIssues(value) { | ||||
|             this.$store | ||||
|                 .dispatch("updateSocialIssues", this.transformValue(value)) | ||||
|                 .catch(({ name, violations }) => { | ||||
|                     if ( | ||||
|                         name === "ValidationException" || | ||||
|                         name === "AccessException" | ||||
|                     ) { | ||||
|                         violations.forEach((violation) => | ||||
|                             this.$toast.open({ message: violation }), | ||||
|                         ); | ||||
|                     } else { | ||||
|                         this.$toast.open({ message: "An error occurred" }); | ||||
|                     } | ||||
|                 }); | ||||
|         }, | ||||
|         transformValue(updated) { | ||||
|             let stored = this.value; | ||||
|             let added = updated.filter((x) => stored.indexOf(x) === -1).shift(); | ||||
|             let removed = stored | ||||
|                 .filter((x) => updated.indexOf(x) === -1) | ||||
|                 .shift(); | ||||
|             let method = typeof removed === "undefined" ? "POST" : "DELETE"; | ||||
|             let changed = typeof removed === "undefined" ? added : removed; | ||||
|             let body = { type: "social_issue", id: changed.id }; | ||||
|             let payload = updated; | ||||
|             return { payload, body, method }; | ||||
|         }, | ||||
|     }, | ||||
|     transformValue(updated) { | ||||
|       let stored = this.value; | ||||
|       let added = updated.filter((x) => stored.indexOf(x) === -1).shift(); | ||||
|       let removed = stored.filter((x) => updated.indexOf(x) === -1).shift(); | ||||
|       let method = typeof removed === "undefined" ? "POST" : "DELETE"; | ||||
|       let changed = typeof removed === "undefined" ? added : removed; | ||||
|       let body = { type: "social_issue", id: changed.id }; | ||||
|       let payload = updated; | ||||
|       return { payload, body, method }; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| @@ -91,20 +96,20 @@ export default { | ||||
| @import "ChillPersonAssets/chill/scss/mixins"; | ||||
| @import "ChillMainAssets/chill/scss/chill_variables"; | ||||
| div#accompanying-course { | ||||
|   span.multiselect__tag { | ||||
|     @include badge_social($social-issue-color); | ||||
|     background: $chill-l-gray; | ||||
|     color: $dark; | ||||
|   } | ||||
|   span.multiselect__option--highlight { | ||||
|     &::after { | ||||
|       background: $green; | ||||
|     span.multiselect__tag { | ||||
|         @include badge_social($social-issue-color); | ||||
|         background: $chill-l-gray; | ||||
|         color: $dark; | ||||
|     } | ||||
|     &.multiselect__option--selected { | ||||
|       &::after { | ||||
|         background: $red; | ||||
|       } | ||||
|     span.multiselect__option--highlight { | ||||
|         &::after { | ||||
|             background: $green; | ||||
|         } | ||||
|         &.multiselect__option--selected { | ||||
|             &::after { | ||||
|                 background: $red; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,22 +1,22 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2> | ||||
|       <a id="section-110" /> | ||||
|       {{ $t("startdate.change") }} | ||||
|     </h2> | ||||
|     <div> | ||||
|       <div class="mb-3 row"> | ||||
|         <div class="col-sm-12 date-update"> | ||||
|           <input | ||||
|             class="form-control" | ||||
|             type="date" | ||||
|             id="startDate" | ||||
|             v-model="startDateInput" | ||||
|           /> | ||||
|     <div class="vue-component"> | ||||
|         <h2> | ||||
|             <a id="section-110" /> | ||||
|             {{ $t("startdate.change") }} | ||||
|         </h2> | ||||
|         <div> | ||||
|             <div class="mb-3 row"> | ||||
|                 <div class="col-sm-12 date-update"> | ||||
|                     <input | ||||
|                         class="form-control" | ||||
|                         type="date" | ||||
|                         id="startDate" | ||||
|                         v-model="startDateInput" | ||||
|                     /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -24,56 +24,69 @@ import { dateToISO, ISOToDatetime } from "ChillMainAssets/chill/js/date"; | ||||
| import { mapState } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "StartDate", | ||||
|   data() { | ||||
|     return { | ||||
|       lastRecordedDate: null, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       startDate: (state) => | ||||
|         dateToISO(ISOToDatetime(state.accompanyingCourse.openingDate.datetime)), | ||||
|     }), | ||||
|     startDateInput: { | ||||
|       get() { | ||||
|         return this.startDate; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.lastRecordedDate = value; | ||||
|  | ||||
|         setTimeout(() => { | ||||
|           console.log("timeout finished"); | ||||
|           if (this.lastRecordedDate === value) { | ||||
|             console.log("last recorded", this.lastRecordedDate, "value", value); | ||||
|             this.$store | ||||
|               .dispatch("updateStartDate", value) | ||||
|               .catch(({ name, violations }) => { | ||||
|                 if ( | ||||
|                   name === "ValidationException" || | ||||
|                   name === "AccessException" | ||||
|                 ) { | ||||
|                   violations.forEach((violation) => | ||||
|                     this.$toast.open({ message: violation }), | ||||
|                   ); | ||||
|                 } else { | ||||
|                   this.$toast.open({ message: "An error occurred" }); | ||||
|                 } | ||||
|               }); | ||||
|           } | ||||
|         }, 3000); | ||||
|       }, | ||||
|     name: "StartDate", | ||||
|     data() { | ||||
|         return { | ||||
|             lastRecordedDate: null, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             startDate: (state) => | ||||
|                 dateToISO( | ||||
|                     ISOToDatetime( | ||||
|                         state.accompanyingCourse.openingDate.datetime, | ||||
|                     ), | ||||
|                 ), | ||||
|         }), | ||||
|         startDateInput: { | ||||
|             get() { | ||||
|                 return this.startDate; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.lastRecordedDate = value; | ||||
|  | ||||
|                 setTimeout(() => { | ||||
|                     console.log("timeout finished"); | ||||
|                     if (this.lastRecordedDate === value) { | ||||
|                         console.log( | ||||
|                             "last recorded", | ||||
|                             this.lastRecordedDate, | ||||
|                             "value", | ||||
|                             value, | ||||
|                         ); | ||||
|                         this.$store | ||||
|                             .dispatch("updateStartDate", value) | ||||
|                             .catch(({ name, violations }) => { | ||||
|                                 if ( | ||||
|                                     name === "ValidationException" || | ||||
|                                     name === "AccessException" | ||||
|                                 ) { | ||||
|                                     violations.forEach((violation) => | ||||
|                                         this.$toast.open({ | ||||
|                                             message: violation, | ||||
|                                         }), | ||||
|                                     ); | ||||
|                                 } else { | ||||
|                                     this.$toast.open({ | ||||
|                                         message: "An error occurred", | ||||
|                                     }); | ||||
|                                 } | ||||
|                             }); | ||||
|                     } | ||||
|                 }, 3000); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .date-update { | ||||
|   display: flex; | ||||
|   justify-content: space-between; | ||||
|   &-btn { | ||||
|     margin-left: 1rem; | ||||
|   } | ||||
|     display: flex; | ||||
|     justify-content: space-between; | ||||
|     &-btn { | ||||
|         margin-left: 1rem; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,195 +1,207 @@ | ||||
| <template> | ||||
|   <teleport to="#content"> | ||||
|     <div id="navmap"> | ||||
|       <nav> | ||||
|         <a class="top" href="#top"> | ||||
|           <i class="fa fa-fw fa-square" /> | ||||
|           <span>{{ $t("nav.top") }}</span> | ||||
|         </a> | ||||
|         <item v-for="item of items" :key="item.key" :item="item" :step="step" /> | ||||
|       </nav> | ||||
|     </div> | ||||
|   </teleport> | ||||
|     <teleport to="#content"> | ||||
|         <div id="navmap"> | ||||
|             <nav> | ||||
|                 <a class="top" href="#top"> | ||||
|                     <i class="fa fa-fw fa-square" /> | ||||
|                     <span>{{ $t("nav.top") }}</span> | ||||
|                 </a> | ||||
|                 <item | ||||
|                     v-for="item of items" | ||||
|                     :key="item.key" | ||||
|                     :item="item" | ||||
|                     :step="step" | ||||
|                 /> | ||||
|             </nav> | ||||
|         </div> | ||||
|     </teleport> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Item from "./StickyNav/Item.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "StickyNav", | ||||
|   components: { | ||||
|     Item, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       header: document.querySelector("header nav.navbar"), | ||||
|       bannerName: document.querySelector("#header-accompanying_course-name"), | ||||
|       bannerDetails: document.querySelector( | ||||
|         "#header-accompanying_course-details", | ||||
|       ), | ||||
|       container: null, | ||||
|       heightSum: null, | ||||
|       stickyNav: null, | ||||
|       limit: 25, | ||||
|       anchors: null, | ||||
|       items: [], | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     accompanyingCourse() { | ||||
|       return this.$store.state.accompanyingCourse; | ||||
|     name: "StickyNav", | ||||
|     components: { | ||||
|         Item, | ||||
|     }, | ||||
|     step() { | ||||
|       return this.accompanyingCourse.step; | ||||
|     data() { | ||||
|         return { | ||||
|             header: document.querySelector("header nav.navbar"), | ||||
|             bannerName: document.querySelector( | ||||
|                 "#header-accompanying_course-name", | ||||
|             ), | ||||
|             bannerDetails: document.querySelector( | ||||
|                 "#header-accompanying_course-details", | ||||
|             ), | ||||
|             container: null, | ||||
|             heightSum: null, | ||||
|             stickyNav: null, | ||||
|             limit: 25, | ||||
|             anchors: null, | ||||
|             items: [], | ||||
|         }; | ||||
|     }, | ||||
|     top() { | ||||
|       return parseInt( | ||||
|         window | ||||
|           .getComputedStyle(this.stickyNav) | ||||
|           .getPropertyValue("top") | ||||
|           .slice(0, -2), | ||||
|       ); | ||||
|     computed: { | ||||
|         accompanyingCourse() { | ||||
|             return this.$store.state.accompanyingCourse; | ||||
|         }, | ||||
|         step() { | ||||
|             return this.accompanyingCourse.step; | ||||
|         }, | ||||
|         top() { | ||||
|             return parseInt( | ||||
|                 window | ||||
|                     .getComputedStyle(this.stickyNav) | ||||
|                     .getPropertyValue("top") | ||||
|                     .slice(0, -2), | ||||
|             ); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   mounted() { | ||||
|     this.ready(); | ||||
|     window.addEventListener("scroll", this.handleScroll); | ||||
|   }, | ||||
|   unmounted() { | ||||
|     window.removeEventListener("scroll", this.handleScroll); | ||||
|   }, | ||||
|   methods: { | ||||
|     ready() { | ||||
|       // load datas DOM when mounted ready | ||||
|       this.container = document.querySelector("#content"); | ||||
|       this.stickyNav = document.querySelector("#navmap"); | ||||
|       this.anchors = document.querySelectorAll("h2 a[id^='section']"); | ||||
|       this.initItemsMap(); | ||||
|     mounted() { | ||||
|         this.ready(); | ||||
|         window.addEventListener("scroll", this.handleScroll); | ||||
|     }, | ||||
|     unmounted() { | ||||
|         window.removeEventListener("scroll", this.handleScroll); | ||||
|     }, | ||||
|     methods: { | ||||
|         ready() { | ||||
|             // load datas DOM when mounted ready | ||||
|             this.container = document.querySelector("#content"); | ||||
|             this.stickyNav = document.querySelector("#navmap"); | ||||
|             this.anchors = document.querySelectorAll("h2 a[id^='section']"); | ||||
|             this.initItemsMap(); | ||||
|  | ||||
|       // TODO resizeObserver not supports IE ! | ||||
|       // Listen when elements change size, then recalculate heightSum and initItemsMap | ||||
|       const resizeObserver = new ResizeObserver(() => { | ||||
|         this.refreshPos(); | ||||
|       }); | ||||
|             // TODO resizeObserver not supports IE ! | ||||
|             // Listen when elements change size, then recalculate heightSum and initItemsMap | ||||
|             const resizeObserver = new ResizeObserver(() => { | ||||
|                 this.refreshPos(); | ||||
|             }); | ||||
|  | ||||
|       resizeObserver.observe(this.header); | ||||
|       resizeObserver.observe(this.bannerName); | ||||
|       resizeObserver.observe(this.bannerDetails); | ||||
|       resizeObserver.observe(this.container); | ||||
|             resizeObserver.observe(this.header); | ||||
|             resizeObserver.observe(this.bannerName); | ||||
|             resizeObserver.observe(this.bannerDetails); | ||||
|             resizeObserver.observe(this.container); | ||||
|         }, | ||||
|         initItemsMap() { | ||||
|             this.anchors.forEach((anchor) => { | ||||
|                 this.items.push({ | ||||
|                     pos: null, | ||||
|                     active: false, | ||||
|                     key: parseInt(anchor.id.slice(8).slice(0, -1)), | ||||
|                     id: "#" + anchor.id, | ||||
|                 }); | ||||
|             }); | ||||
|         }, | ||||
|         refreshPos() { | ||||
|             //console.log('refreshPos'); | ||||
|             this.heightSum = | ||||
|                 this.header.offsetHeight + | ||||
|                 this.bannerName.offsetHeight + | ||||
|                 this.bannerDetails.offsetHeight; | ||||
|  | ||||
|             this.anchors.forEach((anchor, i) => { | ||||
|                 this.items[i].pos = this.findPos(anchor)["y"]; | ||||
|             }); | ||||
|         }, | ||||
|         findPos(element) { | ||||
|             let posX = 0, | ||||
|                 posY = 0; | ||||
|             do { | ||||
|                 posX += element.offsetLeft; | ||||
|                 posY += element.offsetTop; | ||||
|                 element = element.offsetParent; | ||||
|             } while (element != null); | ||||
|  | ||||
|             let pos = []; | ||||
|             pos["x"] = posX; | ||||
|             pos["y"] = posY; | ||||
|  | ||||
|             return pos; | ||||
|         }, | ||||
|         handleScroll(event) { | ||||
|             let pos = this.findPos(this.stickyNav); | ||||
|             let top = this.heightSum + this.top - window.scrollY; | ||||
|             //console.log(window.scrollY); | ||||
|  | ||||
|             if (top > this.limit) { | ||||
|                 this.stickyNav.style.position = "absolute"; | ||||
|                 this.stickyNav.style.left = "10px"; | ||||
|             } else { | ||||
|                 this.stickyNav.style.position = "fixed"; | ||||
|                 this.stickyNav.style.left = pos["x"] + "px"; | ||||
|             } | ||||
|  | ||||
|             this.switchActive(); | ||||
|         }, | ||||
|         switchActive() { | ||||
|             this.items.forEach((item, i) => { | ||||
|                 let next = this.items[i + 1] ? this.items[i + 1].pos : "100000"; | ||||
|                 item.active = | ||||
|                     (window.scrollY >= item.pos) & (window.scrollY < next) | ||||
|                         ? true | ||||
|                         : false; | ||||
|             }, this); | ||||
|  | ||||
|             // last item never switch active because scroll reach bottom of page | ||||
|             if ( | ||||
|                 document.body.scrollHeight == | ||||
|                 window.scrollY + window.innerHeight | ||||
|             ) { | ||||
|                 this.items[this.items.length - 1].active = true; | ||||
|                 this.items[this.items.length - 2].active = false; | ||||
|             } else { | ||||
|                 this.items[this.items.length - 1].active = false; | ||||
|             } | ||||
|         }, | ||||
|     }, | ||||
|     initItemsMap() { | ||||
|       this.anchors.forEach((anchor) => { | ||||
|         this.items.push({ | ||||
|           pos: null, | ||||
|           active: false, | ||||
|           key: parseInt(anchor.id.slice(8).slice(0, -1)), | ||||
|           id: "#" + anchor.id, | ||||
|         }); | ||||
|       }); | ||||
|     }, | ||||
|     refreshPos() { | ||||
|       //console.log('refreshPos'); | ||||
|       this.heightSum = | ||||
|         this.header.offsetHeight + | ||||
|         this.bannerName.offsetHeight + | ||||
|         this.bannerDetails.offsetHeight; | ||||
|  | ||||
|       this.anchors.forEach((anchor, i) => { | ||||
|         this.items[i].pos = this.findPos(anchor)["y"]; | ||||
|       }); | ||||
|     }, | ||||
|     findPos(element) { | ||||
|       let posX = 0, | ||||
|         posY = 0; | ||||
|       do { | ||||
|         posX += element.offsetLeft; | ||||
|         posY += element.offsetTop; | ||||
|         element = element.offsetParent; | ||||
|       } while (element != null); | ||||
|  | ||||
|       let pos = []; | ||||
|       pos["x"] = posX; | ||||
|       pos["y"] = posY; | ||||
|  | ||||
|       return pos; | ||||
|     }, | ||||
|     handleScroll(event) { | ||||
|       let pos = this.findPos(this.stickyNav); | ||||
|       let top = this.heightSum + this.top - window.scrollY; | ||||
|       //console.log(window.scrollY); | ||||
|  | ||||
|       if (top > this.limit) { | ||||
|         this.stickyNav.style.position = "absolute"; | ||||
|         this.stickyNav.style.left = "10px"; | ||||
|       } else { | ||||
|         this.stickyNav.style.position = "fixed"; | ||||
|         this.stickyNav.style.left = pos["x"] + "px"; | ||||
|       } | ||||
|  | ||||
|       this.switchActive(); | ||||
|     }, | ||||
|     switchActive() { | ||||
|       this.items.forEach((item, i) => { | ||||
|         let next = this.items[i + 1] ? this.items[i + 1].pos : "100000"; | ||||
|         item.active = | ||||
|           (window.scrollY >= item.pos) & (window.scrollY < next) ? true : false; | ||||
|       }, this); | ||||
|  | ||||
|       // last item never switch active because scroll reach bottom of page | ||||
|       if (document.body.scrollHeight == window.scrollY + window.innerHeight) { | ||||
|         this.items[this.items.length - 1].active = true; | ||||
|         this.items[this.items.length - 2].active = false; | ||||
|       } else { | ||||
|         this.items[this.items.length - 1].active = false; | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss"> | ||||
| div#content { | ||||
|   position: relative; | ||||
|     position: relative; | ||||
|  | ||||
|   div#navmap { | ||||
|     position: absolute; | ||||
|     top: 30px; | ||||
|     left: 10px; //-10%; | ||||
|     nav { | ||||
|       font-size: small; | ||||
|       a { | ||||
|         display: block; | ||||
|         box-sizing: border-box; | ||||
|         margin-bottom: -3px; | ||||
|         color: #71859669; | ||||
|         text-decoration: none; | ||||
|         &.top { | ||||
|           color: #718596; | ||||
|     div#navmap { | ||||
|         position: absolute; | ||||
|         top: 30px; | ||||
|         left: 10px; //-10%; | ||||
|         nav { | ||||
|             font-size: small; | ||||
|             a { | ||||
|                 display: block; | ||||
|                 box-sizing: border-box; | ||||
|                 margin-bottom: -3px; | ||||
|                 color: #71859669; | ||||
|                 text-decoration: none; | ||||
|                 &.top { | ||||
|                     color: #718596; | ||||
|                 } | ||||
|                 span { | ||||
|                     display: none; | ||||
|                 } | ||||
|                 &:hover, | ||||
|                 &.active { | ||||
|                     span { | ||||
|                         display: inline; | ||||
|                         padding-left: 8px; | ||||
|                     } | ||||
|                 } | ||||
|                 &:hover { | ||||
|                     color: #718596b5; | ||||
|                 } | ||||
|                 &.active { | ||||
|                     color: #e2793d; //orange | ||||
|                     //color: #eec84a; //jaune | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         span { | ||||
|           display: none; | ||||
|         } | ||||
|         &:hover, | ||||
|         &.active { | ||||
|           span { | ||||
|             display: inline; | ||||
|             padding-left: 8px; | ||||
|           } | ||||
|         } | ||||
|         &:hover { | ||||
|           color: #718596b5; | ||||
|         } | ||||
|         &.active { | ||||
|           color: #e2793d; //orange | ||||
|           //color: #eec84a; //jaune | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @media only screen and (max-width: 768px) { | ||||
|   div#navmap { | ||||
|     display: none; | ||||
|   } | ||||
|     div#navmap { | ||||
|         display: none; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,22 +1,26 @@ | ||||
| <template> | ||||
|   <a v-if="item.key <= 8" :href="item.id" :class="{ active: isActive }"> | ||||
|     <i class="fa fa-fw fa-square" /> | ||||
|     <span>{{ item.key }}</span> | ||||
|   </a> | ||||
|   <a v-else-if="step === 'DRAFT'" :href="item.id" :class="{ active: isActive }"> | ||||
|     <i class="fa fa-fw fa-square" /> | ||||
|     <span>{{ item.key }}</span> | ||||
|   </a> | ||||
|     <a v-if="item.key <= 8" :href="item.id" :class="{ active: isActive }"> | ||||
|         <i class="fa fa-fw fa-square" /> | ||||
|         <span>{{ item.key }}</span> | ||||
|     </a> | ||||
|     <a | ||||
|         v-else-if="step === 'DRAFT'" | ||||
|         :href="item.id" | ||||
|         :class="{ active: isActive }" | ||||
|     > | ||||
|         <i class="fa fa-fw fa-square" /> | ||||
|         <span>{{ item.key }}</span> | ||||
|     </a> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| export default { | ||||
|   name: "Item", | ||||
|   props: ["item", "step"], | ||||
|   computed: { | ||||
|     isActive() { | ||||
|       return this.item.active; | ||||
|     name: "Item", | ||||
|     props: ["item", "step"], | ||||
|     computed: { | ||||
|         isActive() { | ||||
|             return this.item.active; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,146 +1,155 @@ | ||||
| <template> | ||||
|   <div class="vue-component"> | ||||
|     <h2>Tests</h2> | ||||
|     <div class="vue-component"> | ||||
|         <h2>Tests</h2> | ||||
|  | ||||
|     <!-- Modal --> | ||||
|     <ul class="record_actions"> | ||||
|       <li> | ||||
|         <button class="btn btn-create" @click="modal1.showModal = true"> | ||||
|           {{ $t("action.show_modal") }} | ||||
|         </button> | ||||
|       </li> | ||||
|       <li> | ||||
|         <button class="btn btn-create" @click="modal2.showModal = true"> | ||||
|           Ouvrir une seconde modale | ||||
|         </button> | ||||
|       </li> | ||||
|     </ul> | ||||
|         <!-- Modal --> | ||||
|         <ul class="record_actions"> | ||||
|             <li> | ||||
|                 <button class="btn btn-create" @click="modal1.showModal = true"> | ||||
|                     {{ $t("action.show_modal") }} | ||||
|                 </button> | ||||
|             </li> | ||||
|             <li> | ||||
|                 <button class="btn btn-create" @click="modal2.showModal = true"> | ||||
|                     Ouvrir une seconde modale | ||||
|                 </button> | ||||
|             </li> | ||||
|         </ul> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|       <modal | ||||
|         v-if="modal1.showModal" | ||||
|         :modal-dialog-class="modal1.modalDialogClass" | ||||
|         @close="modal1.showModal = false" | ||||
|       > | ||||
|         <template #header> | ||||
|           <h2 class="modal-title">Le titre de ma modale</h2> | ||||
|         </template> | ||||
|         <template #body> | ||||
|           <p> | ||||
|             Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus | ||||
|             luctus facilisis suscipit. Cras pulvinar, purus sagittis pulvinar | ||||
|             porta, enim ex posuere lacus, in pulvinar lectus magna in odio. | ||||
|             Nullam iaculis congue lorem ac suscipit. Proin ut rutrum augue. Ut | ||||
|             vehicula risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|             viverra. Morbi dictum placerat suscipit. | ||||
|           </p> | ||||
|           <p> | ||||
|             Quisque non erat tincidunt, lacinia justo ut, pulvinar nisl. Nunc id | ||||
|             enim ut sem pretium interdum consectetur eu quam. Vestibulum ante | ||||
|             ipsum primis in faucibus orci luctus et ultrices posuere cubilia | ||||
|             curae; Etiam posuere erat eget augue finibus luctus. Maecenas | ||||
|             auctor, tortor non luctus ultrices, neque neque porttitor ex, nec | ||||
|             lacinia lorem ligula et elit. Sed tempor nulla vitae lorem | ||||
|             sollicitudin dictum. Vestibulum nec arcu eget elit pulvinar pretium. | ||||
|             Phasellus facilisis metus sed diam luctus, feugiat scelerisque velit | ||||
|             dignissim. | ||||
|           </p> | ||||
|           <p> | ||||
|             Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus | ||||
|             luctus facilisis suscipit. Cras pulvinar, purus sagittis pulvinar | ||||
|             porta, enim ex posuere lacus, in pulvinar lectus magna in odio. | ||||
|             Nullam iaculis congue lorem ac suscipit. Proin ut rutrum augue. Ut | ||||
|             vehicula risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|             viverra. Morbi dictum placerat suscipit. | ||||
|           </p> | ||||
|           <p> | ||||
|             Quisque non erat tincidunt, lacinia justo ut, pulvinar nisl. Nunc id | ||||
|             enim ut sem pretium interdum consectetur eu quam. Vestibulum ante | ||||
|             ipsum primis in faucibus orci luctus et ultrices posuere cubilia | ||||
|             curae; Etiam posuere erat eget augue finibus luctus. Maecenas | ||||
|             auctor, tortor non luctus ultrices, neque neque porttitor ex, nec | ||||
|             lacinia lorem ligula et elit. Sed tempor nulla vitae lorem | ||||
|             sollicitudin dictum. Vestibulum nec arcu eget elit pulvinar pretium. | ||||
|             Phasellus facilisis metus sed diam luctus, feugiat scelerisque velit | ||||
|             dignissim. | ||||
|           </p> | ||||
|           <p> | ||||
|             Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus | ||||
|             luctus facilisis suscipit. Cras pulvinar, purus sagittis pulvinar | ||||
|             porta, enim ex posuere lacus, in pulvinar lectus magna in odio. | ||||
|             Nullam iaculis congue lorem ac suscipit. Proin ut rutrum augue. Ut | ||||
|             vehicula risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|             viverra. Morbi dictum placerat suscipit. | ||||
|           </p> | ||||
|           <p> | ||||
|             Quisque non erat tincidunt, lacinia justo ut, pulvinar nisl. Nunc id | ||||
|             enim ut sem pretium interdum consectetur eu quam. Vestibulum ante | ||||
|             ipsum primis in faucibus orci luctus et ultrices posuere cubilia | ||||
|             curae; Etiam posuere erat eget augue finibus luctus. Maecenas | ||||
|             auctor, tortor non luctus ultrices, neque neque porttitor ex, nec | ||||
|             lacinia lorem ligula et elit. Sed tempor nulla vitae lorem | ||||
|             sollicitudin dictum. Vestibulum nec arcu eget elit pulvinar pretium. | ||||
|             Phasellus facilisis metus sed diam luctus, feugiat scelerisque velit | ||||
|             dignissim. | ||||
|           </p> | ||||
|         </template> | ||||
|         <template #footer> | ||||
|           <button | ||||
|             class="btn btn-create" | ||||
|             @click=" | ||||
|               modal1.showModal = false; | ||||
|               modal2.showModal = true; | ||||
|             " | ||||
|           > | ||||
|             {{ $t("action.next") }} | ||||
|           </button> | ||||
|         </template> | ||||
|       </modal> | ||||
|     </teleport> | ||||
|         <teleport to="body"> | ||||
|             <modal | ||||
|                 v-if="modal1.showModal" | ||||
|                 :modal-dialog-class="modal1.modalDialogClass" | ||||
|                 @close="modal1.showModal = false" | ||||
|             > | ||||
|                 <template #header> | ||||
|                     <h2 class="modal-title">Le titre de ma modale</h2> | ||||
|                 </template> | ||||
|                 <template #body> | ||||
|                     <p> | ||||
|                         Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ||||
|                         Phasellus luctus facilisis suscipit. Cras pulvinar, | ||||
|                         purus sagittis pulvinar porta, enim ex posuere lacus, in | ||||
|                         pulvinar lectus magna in odio. Nullam iaculis congue | ||||
|                         lorem ac suscipit. Proin ut rutrum augue. Ut vehicula | ||||
|                         risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|                         viverra. Morbi dictum placerat suscipit. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Quisque non erat tincidunt, lacinia justo ut, pulvinar | ||||
|                         nisl. Nunc id enim ut sem pretium interdum consectetur | ||||
|                         eu quam. Vestibulum ante ipsum primis in faucibus orci | ||||
|                         luctus et ultrices posuere cubilia curae; Etiam posuere | ||||
|                         erat eget augue finibus luctus. Maecenas auctor, tortor | ||||
|                         non luctus ultrices, neque neque porttitor ex, nec | ||||
|                         lacinia lorem ligula et elit. Sed tempor nulla vitae | ||||
|                         lorem sollicitudin dictum. Vestibulum nec arcu eget elit | ||||
|                         pulvinar pretium. Phasellus facilisis metus sed diam | ||||
|                         luctus, feugiat scelerisque velit dignissim. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ||||
|                         Phasellus luctus facilisis suscipit. Cras pulvinar, | ||||
|                         purus sagittis pulvinar porta, enim ex posuere lacus, in | ||||
|                         pulvinar lectus magna in odio. Nullam iaculis congue | ||||
|                         lorem ac suscipit. Proin ut rutrum augue. Ut vehicula | ||||
|                         risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|                         viverra. Morbi dictum placerat suscipit. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Quisque non erat tincidunt, lacinia justo ut, pulvinar | ||||
|                         nisl. Nunc id enim ut sem pretium interdum consectetur | ||||
|                         eu quam. Vestibulum ante ipsum primis in faucibus orci | ||||
|                         luctus et ultrices posuere cubilia curae; Etiam posuere | ||||
|                         erat eget augue finibus luctus. Maecenas auctor, tortor | ||||
|                         non luctus ultrices, neque neque porttitor ex, nec | ||||
|                         lacinia lorem ligula et elit. Sed tempor nulla vitae | ||||
|                         lorem sollicitudin dictum. Vestibulum nec arcu eget elit | ||||
|                         pulvinar pretium. Phasellus facilisis metus sed diam | ||||
|                         luctus, feugiat scelerisque velit dignissim. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Lorem ipsum dolor sit amet, consectetur adipiscing elit. | ||||
|                         Phasellus luctus facilisis suscipit. Cras pulvinar, | ||||
|                         purus sagittis pulvinar porta, enim ex posuere lacus, in | ||||
|                         pulvinar lectus magna in odio. Nullam iaculis congue | ||||
|                         lorem ac suscipit. Proin ut rutrum augue. Ut vehicula | ||||
|                         risus nec hendrerit ullamcorper. Ut volutpat eu mi eget | ||||
|                         viverra. Morbi dictum placerat suscipit. | ||||
|                     </p> | ||||
|                     <p> | ||||
|                         Quisque non erat tincidunt, lacinia justo ut, pulvinar | ||||
|                         nisl. Nunc id enim ut sem pretium interdum consectetur | ||||
|                         eu quam. Vestibulum ante ipsum primis in faucibus orci | ||||
|                         luctus et ultrices posuere cubilia curae; Etiam posuere | ||||
|                         erat eget augue finibus luctus. Maecenas auctor, tortor | ||||
|                         non luctus ultrices, neque neque porttitor ex, nec | ||||
|                         lacinia lorem ligula et elit. Sed tempor nulla vitae | ||||
|                         lorem sollicitudin dictum. Vestibulum nec arcu eget elit | ||||
|                         pulvinar pretium. Phasellus facilisis metus sed diam | ||||
|                         luctus, feugiat scelerisque velit dignissim. | ||||
|                     </p> | ||||
|                 </template> | ||||
|                 <template #footer> | ||||
|                     <button | ||||
|                         class="btn btn-create" | ||||
|                         @click=" | ||||
|                             modal1.showModal = false; | ||||
|                             modal2.showModal = true; | ||||
|                         " | ||||
|                     > | ||||
|                         {{ $t("action.next") }} | ||||
|                     </button> | ||||
|                 </template> | ||||
|             </modal> | ||||
|         </teleport> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|       <modal | ||||
|         v-if="modal2.showModal" | ||||
|         :modal-dialog-class="modal2.modalDialogClass" | ||||
|         @close="modal2.showModal = false" | ||||
|       > | ||||
|         <template #header> | ||||
|           <h2 class="modal-title">Une autre modale</h2> | ||||
|         </template> | ||||
|         <template #body> | ||||
|           <p>modal 2</p> | ||||
|         </template> | ||||
|         <template #footer> | ||||
|           <button class="btn btn-create" @click="modal2.showModal = false"> | ||||
|             {{ $t("action.save") }} | ||||
|           </button> | ||||
|         </template> | ||||
|       </modal> | ||||
|     </teleport> | ||||
|     <!-- END Modal --> | ||||
|   </div> | ||||
|         <teleport to="body"> | ||||
|             <modal | ||||
|                 v-if="modal2.showModal" | ||||
|                 :modal-dialog-class="modal2.modalDialogClass" | ||||
|                 @close="modal2.showModal = false" | ||||
|             > | ||||
|                 <template #header> | ||||
|                     <h2 class="modal-title">Une autre modale</h2> | ||||
|                 </template> | ||||
|                 <template #body> | ||||
|                     <p>modal 2</p> | ||||
|                 </template> | ||||
|                 <template #footer> | ||||
|                     <button | ||||
|                         class="btn btn-create" | ||||
|                         @click="modal2.showModal = false" | ||||
|                     > | ||||
|                         {{ $t("action.save") }} | ||||
|                     </button> | ||||
|                 </template> | ||||
|             </modal> | ||||
|         </teleport> | ||||
|         <!-- END Modal --> | ||||
|     </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import Modal from "ChillMainAssets/vuejs/_components/Modal"; | ||||
|  | ||||
| export default { | ||||
|   name: "Test", | ||||
|   components: { | ||||
|     Modal, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       modal1: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-scrollable modal-xl", // modal-lg modal-md modal-sm | ||||
|       }, | ||||
|       modal2: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-centered modal-sm", // modal-lg modal-md modal-sm | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: {}, | ||||
|     name: "Test", | ||||
|     components: { | ||||
|         Modal, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             modal1: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-scrollable modal-xl", // modal-lg modal-md modal-sm | ||||
|             }, | ||||
|             modal2: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-centered modal-sm", // modal-lg modal-md modal-sm | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: {}, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,14 +0,0 @@ | ||||
| { | ||||
|   "name": "vendor_name/AccompanyingCourse", | ||||
|   "description": "description", | ||||
|   "minimum-stability": "stable", | ||||
|   "license": "proprietary", | ||||
|   "authors": [ | ||||
|     { | ||||
|       "name": "mat", | ||||
|       "email": "email@example.com" | ||||
|     } | ||||
|   ], | ||||
|   "require": { | ||||
|   } | ||||
| } | ||||
| @@ -1,135 +1,152 @@ | ||||
| <template> | ||||
|   <h2>{{ $t("pick_social_issue") }}</h2> | ||||
|     <h2>{{ $t("pick_social_issue") }}</h2> | ||||
|  | ||||
|   <div id="awc_create_form"> | ||||
|     <div id="picking" class=""> | ||||
|       <p>{{ $t("pick_social_issue_linked_with_action") }}</p> | ||||
|       <div v-for="si in socialIssues" :key="si.id"> | ||||
|         <input | ||||
|           type="radio" | ||||
|           :value="si.id" | ||||
|           name="socialIssue" | ||||
|           v-model="socialIssuePicked" | ||||
|         /><span class="badge bg-chill-l-gray text-dark">{{ si.text }}</span> | ||||
|       </div> | ||||
|       <div class="my-3"> | ||||
|         <div class="col-11"> | ||||
|           <vue-multiselect | ||||
|             name="otherIssues" | ||||
|             label="text" | ||||
|             track-by="id" | ||||
|             open-direction="bottom" | ||||
|             :close-on-select="true" | ||||
|             :preserve-search="false" | ||||
|             :reset-after="true" | ||||
|             :hide-selected="true" | ||||
|             :taggable="false" | ||||
|             :multiple="false" | ||||
|             :searchable="true" | ||||
|             :allow-empty="true" | ||||
|             :show-labels="false" | ||||
|             :loading="issueIsLoading" | ||||
|             :placeholder="$t('choose_other_social_issue')" | ||||
|             :options="socialIssuesOther" | ||||
|             @select="addIssueInList" | ||||
|           /> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div v-if="hasSocialIssuePicked" class="mb-3"> | ||||
|         <h2>{{ $t("pick_an_action") }}</h2> | ||||
|         <div class="col-11"> | ||||
|           <vue-multiselect | ||||
|             v-model="socialActionPicked" | ||||
|             label="text" | ||||
|             :options="socialActionsReachables" | ||||
|             :searchable="true" | ||||
|             :close-on-select="true" | ||||
|             :show-labels="true" | ||||
|             track-by="id" | ||||
|           /> | ||||
|         </div> | ||||
|       </div> | ||||
|  | ||||
|       <div v-if="isLoadingSocialActions"> | ||||
|         <i class="fa fa-circle-o-notch fa-spin fa-fw" /> | ||||
|       </div> | ||||
|  | ||||
|       <div v-if="hasSocialActionPicked" id="persons" class="mb-5"> | ||||
|         <h2>{{ $t("persons_involved") }}</h2> | ||||
|  | ||||
|         <ul> | ||||
|           <li v-for="p in personsReachables" :key="p.id"> | ||||
|             <div class="form-check"> | ||||
|               <input | ||||
|                 type="checkbox" | ||||
|                 :value="p.id" | ||||
|                 v-model="personsPicked" | ||||
|                 class="form-check-input" | ||||
|                 :id="'person_check' + p.id" | ||||
|               /> | ||||
|               <label class="form-check-label" :for="'person_check' + p.id"> | ||||
|                 <person-text :person="p" /> | ||||
|               </label> | ||||
|     <div id="awc_create_form"> | ||||
|         <div id="picking" class=""> | ||||
|             <p>{{ $t("pick_social_issue_linked_with_action") }}</p> | ||||
|             <div v-for="si in socialIssues" :key="si.id"> | ||||
|                 <input | ||||
|                     type="radio" | ||||
|                     :value="si.id" | ||||
|                     name="socialIssue" | ||||
|                     v-model="socialIssuePicked" | ||||
|                 /><span class="badge bg-chill-l-gray text-dark">{{ | ||||
|                     si.text | ||||
|                 }}</span> | ||||
|             </div> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </div> | ||||
|     <!-- <div v-if="hasSocialActionPicked" id="start_date"> | ||||
|             <div class="my-3"> | ||||
|                 <div class="col-11"> | ||||
|                     <vue-multiselect | ||||
|                         name="otherIssues" | ||||
|                         label="text" | ||||
|                         track-by="id" | ||||
|                         open-direction="bottom" | ||||
|                         :close-on-select="true" | ||||
|                         :preserve-search="false" | ||||
|                         :reset-after="true" | ||||
|                         :hide-selected="true" | ||||
|                         :taggable="false" | ||||
|                         :multiple="false" | ||||
|                         :searchable="true" | ||||
|                         :allow-empty="true" | ||||
|                         :show-labels="false" | ||||
|                         :loading="issueIsLoading" | ||||
|                         :placeholder="$t('choose_other_social_issue')" | ||||
|                         :options="socialIssuesOther" | ||||
|                         @select="addIssueInList" | ||||
|                     /> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div v-if="hasSocialIssuePicked" class="mb-3"> | ||||
|                 <h2>{{ $t("pick_an_action") }}</h2> | ||||
|                 <div class="col-11"> | ||||
|                     <vue-multiselect | ||||
|                         v-model="socialActionPicked" | ||||
|                         label="text" | ||||
|                         :options="socialActionsReachables" | ||||
|                         :searchable="true" | ||||
|                         :close-on-select="true" | ||||
|                         :show-labels="true" | ||||
|                         track-by="id" | ||||
|                     /> | ||||
|                 </div> | ||||
|             </div> | ||||
|  | ||||
|             <div v-if="isLoadingSocialActions"> | ||||
|                 <i class="fa fa-circle-o-notch fa-spin fa-fw" /> | ||||
|             </div> | ||||
|  | ||||
|             <div v-if="hasSocialActionPicked" id="persons" class="mb-5"> | ||||
|                 <h2>{{ $t("persons_involved") }}</h2> | ||||
|  | ||||
|                 <ul> | ||||
|                     <li v-for="p in personsReachables" :key="p.id"> | ||||
|                         <div class="form-check"> | ||||
|                             <input | ||||
|                                 type="checkbox" | ||||
|                                 :value="p.id" | ||||
|                                 v-model="personsPicked" | ||||
|                                 class="form-check-input" | ||||
|                                 :id="'person_check' + p.id" | ||||
|                             /> | ||||
|                             <label | ||||
|                                 class="form-check-label" | ||||
|                                 :for="'person_check' + p.id" | ||||
|                             > | ||||
|                                 <person-text :person="p" /> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
|         <!-- <div v-if="hasSocialActionPicked" id="start_date"> | ||||
|       <p><label>{{ $t('startDate') }}</label> <input type="date" v-model="startDate" /></p> | ||||
|     </div> --> | ||||
|     <div class="row"> | ||||
|       <div v-if="hasSocialActionPicked" id="start_date" class="mb-3 row"> | ||||
|         <label class="col-form-label col-sm-4">{{ $t("startDate") }}</label> | ||||
|         <div class="col-sm-8"> | ||||
|           <input class="form-control" type="date" v-model="startDate" /> | ||||
|         </div> | ||||
|       </div> | ||||
|         <div class="row"> | ||||
|             <div v-if="hasSocialActionPicked" id="start_date" class="mb-3 row"> | ||||
|                 <label class="col-form-label col-sm-4">{{ | ||||
|                     $t("startDate") | ||||
|                 }}</label> | ||||
|                 <div class="col-sm-8"> | ||||
|                     <input | ||||
|                         class="form-control" | ||||
|                         type="date" | ||||
|                         v-model="startDate" | ||||
|                     /> | ||||
|                 </div> | ||||
|             </div> | ||||
|  | ||||
|       <!-- <div v-if="hasSocialActionPicked" id="end_date"> | ||||
|             <!-- <div v-if="hasSocialActionPicked" id="end_date"> | ||||
|       <p><label>{{ $t('endDate') }}</label> <input type="date" v-model="endDate" /></p> | ||||
|     </div> --> | ||||
|       <div v-if="hasSocialActionPicked" id="end_date" class="mb-3 row"> | ||||
|         <label class="col-form-label col-sm-4">{{ $t("endDate") }}</label> | ||||
|         <div class="col-sm-8"> | ||||
|           <input class="form-control" type="date" v-model="endDate" /> | ||||
|             <div v-if="hasSocialActionPicked" id="end_date" class="mb-3 row"> | ||||
|                 <label class="col-form-label col-sm-4">{{ | ||||
|                     $t("endDate") | ||||
|                 }}</label> | ||||
|                 <div class="col-sm-8"> | ||||
|                     <input class="form-control" type="date" v-model="endDate" /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div id="confirm"> | ||||
|       <div v-if="hasErrors"> | ||||
|         <p>{{ $t("form_has_errors") }}</p> | ||||
|         <div id="confirm"> | ||||
|             <div v-if="hasErrors"> | ||||
|                 <p>{{ $t("form_has_errors") }}</p> | ||||
|  | ||||
|         <ul> | ||||
|           <li v-for="e in errors" :key="e.id"> | ||||
|             {{ e }} | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|                 <ul> | ||||
|                     <li v-for="e in errors" :key="e.id"> | ||||
|                         {{ e }} | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|  | ||||
|       <div> | ||||
|         <ul class="record_actions"> | ||||
|           <li class="cancel"> | ||||
|             <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|               {{ $t("action.cancel") }} | ||||
|             </button> | ||||
|           </li> | ||||
|           <li v-if="hasSocialActionPicked"> | ||||
|             <button | ||||
|               class="btn btn-save" | ||||
|               v-show="!isPostingWork" | ||||
|               @click="submit" | ||||
|             > | ||||
|               {{ $t("action.save") }} | ||||
|             </button> | ||||
|             <button class="btn btn-save" v-show="isPostingWork" disabled> | ||||
|               {{ $t("action.save") }} | ||||
|             </button> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|             <div> | ||||
|                 <ul class="record_actions"> | ||||
|                     <li class="cancel"> | ||||
|                         <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|                             {{ $t("action.cancel") }} | ||||
|                         </button> | ||||
|                     </li> | ||||
|                     <li v-if="hasSocialActionPicked"> | ||||
|                         <button | ||||
|                             class="btn btn-save" | ||||
|                             v-show="!isPostingWork" | ||||
|                             @click="submit" | ||||
|                         > | ||||
|                             {{ $t("action.save") }} | ||||
|                         </button> | ||||
|                         <button | ||||
|                             class="btn btn-save" | ||||
|                             v-show="isPostingWork" | ||||
|                             disabled | ||||
|                         > | ||||
|                             {{ $t("action.save") }} | ||||
|                         </button> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -138,127 +155,131 @@ import VueMultiselect from "vue-multiselect"; | ||||
| import PersonText from "ChillPersonAssets/vuejs/_components/Entity/PersonText.vue"; | ||||
|  | ||||
| const i18n = { | ||||
|   messages: { | ||||
|     fr: { | ||||
|       startDate: "Date de début", | ||||
|       endDate: "Date de fin", | ||||
|       form_has_errors: "Le formulaire comporte des erreurs", | ||||
|       pick_social_issue: "Choisir une problématique sociale", | ||||
|       pick_other_social_issue: "Veuillez choisir un autre problématique", | ||||
|       pick_an_action: "Choisir une action d'accompagnement", | ||||
|       pick_social_issue_linked_with_action: | ||||
|         "Indiquez la problématique sociale liée à l'action d'accompagnement", | ||||
|       persons_involved: "Usagers concernés", | ||||
|       choose_other_social_issue: "Veuillez choisir un autre problématique", | ||||
|     messages: { | ||||
|         fr: { | ||||
|             startDate: "Date de début", | ||||
|             endDate: "Date de fin", | ||||
|             form_has_errors: "Le formulaire comporte des erreurs", | ||||
|             pick_social_issue: "Choisir une problématique sociale", | ||||
|             pick_other_social_issue: "Veuillez choisir un autre problématique", | ||||
|             pick_an_action: "Choisir une action d'accompagnement", | ||||
|             pick_social_issue_linked_with_action: | ||||
|                 "Indiquez la problématique sociale liée à l'action d'accompagnement", | ||||
|             persons_involved: "Usagers concernés", | ||||
|             choose_other_social_issue: | ||||
|                 "Veuillez choisir un autre problématique", | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export default { | ||||
|   name: "App", | ||||
|   components: { | ||||
|     VueMultiselect, | ||||
|     PersonText, | ||||
|   }, | ||||
|   methods: { | ||||
|     submit() { | ||||
|       this.$store.dispatch("submit").catch(({ name, violations }) => { | ||||
|         if (name === "ValidationException" || name === "AccessException") { | ||||
|           violations.forEach((violation) => | ||||
|             this.$toast.open({ message: violation }), | ||||
|           ); | ||||
|         } else { | ||||
|           this.$toast.open({ message: "An error occurred" }); | ||||
|         } | ||||
|       }); | ||||
|     name: "App", | ||||
|     components: { | ||||
|         VueMultiselect, | ||||
|         PersonText, | ||||
|     }, | ||||
|     addIssueInList(value) { | ||||
|       this.$store.commit("addIssueInList", value); | ||||
|       this.$store.commit("removeIssueInOther", value); | ||||
|       this.$store.dispatch("pickSocialIssue", value.id); | ||||
|     methods: { | ||||
|         submit() { | ||||
|             this.$store.dispatch("submit").catch(({ name, violations }) => { | ||||
|                 if ( | ||||
|                     name === "ValidationException" || | ||||
|                     name === "AccessException" | ||||
|                 ) { | ||||
|                     violations.forEach((violation) => | ||||
|                         this.$toast.open({ message: violation }), | ||||
|                     ); | ||||
|                 } else { | ||||
|                     this.$toast.open({ message: "An error occurred" }); | ||||
|                 } | ||||
|             }); | ||||
|         }, | ||||
|         addIssueInList(value) { | ||||
|             this.$store.commit("addIssueInList", value); | ||||
|             this.$store.commit("removeIssueInOther", value); | ||||
|             this.$store.dispatch("pickSocialIssue", value.id); | ||||
|         }, | ||||
|         goToPrevious() { | ||||
|             let params = new URLSearchParams(window.location.search); | ||||
|             if (params.has("returnPath")) { | ||||
|                 window.location.replace(params.get("returnPath")); | ||||
|             } else { | ||||
|                 return; | ||||
|             } | ||||
|         }, | ||||
|     }, | ||||
|     goToPrevious() { | ||||
|       let params = new URLSearchParams(window.location.search); | ||||
|       if (params.has("returnPath")) { | ||||
|         window.location.replace(params.get("returnPath")); | ||||
|       } else { | ||||
|         return; | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   i18n, | ||||
|   computed: { | ||||
|     ...mapState([ | ||||
|       "socialIssues", | ||||
|       "socialIssuesOther", | ||||
|       "socialActionsReachables", | ||||
|       "errors", | ||||
|       "personsReachables", | ||||
|     ]), | ||||
|     ...mapGetters([ | ||||
|       "hasSocialIssuePicked", | ||||
|       "hasSocialActionPicked", | ||||
|       "isLoadingSocialActions", | ||||
|       "isPostingWork", | ||||
|       "hasErrors", | ||||
|     ]), | ||||
|     personsPicked: { | ||||
|       get() { | ||||
|         let s = this.$store.state.personsPicked.map((p) => p.id); | ||||
|     i18n, | ||||
|     computed: { | ||||
|         ...mapState([ | ||||
|             "socialIssues", | ||||
|             "socialIssuesOther", | ||||
|             "socialActionsReachables", | ||||
|             "errors", | ||||
|             "personsReachables", | ||||
|         ]), | ||||
|         ...mapGetters([ | ||||
|             "hasSocialIssuePicked", | ||||
|             "hasSocialActionPicked", | ||||
|             "isLoadingSocialActions", | ||||
|             "isPostingWork", | ||||
|             "hasErrors", | ||||
|         ]), | ||||
|         personsPicked: { | ||||
|             get() { | ||||
|                 let s = this.$store.state.personsPicked.map((p) => p.id); | ||||
|  | ||||
|         return s; | ||||
|       }, | ||||
|       set(v) { | ||||
|         this.$store.commit("setPersonsPickedIds", v); | ||||
|       }, | ||||
|     }, | ||||
|     socialIssuePicked: { | ||||
|       get() { | ||||
|         let s = this.$store.state.socialIssuePicked; | ||||
|                 return s; | ||||
|             }, | ||||
|             set(v) { | ||||
|                 this.$store.commit("setPersonsPickedIds", v); | ||||
|             }, | ||||
|         }, | ||||
|         socialIssuePicked: { | ||||
|             get() { | ||||
|                 let s = this.$store.state.socialIssuePicked; | ||||
|  | ||||
|         if (s === null) { | ||||
|           return null; | ||||
|         } | ||||
|                 if (s === null) { | ||||
|                     return null; | ||||
|                 } | ||||
|  | ||||
|         return s.id; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.dispatch("pickSocialIssue", value); | ||||
|       }, | ||||
|                 return s.id; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.dispatch("pickSocialIssue", value); | ||||
|             }, | ||||
|         }, | ||||
|         socialActionPicked: { | ||||
|             get() { | ||||
|                 return this.$store.state.socialActionPicked; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit("setSocialAction", value); | ||||
|             }, | ||||
|         }, | ||||
|         startDate: { | ||||
|             get() { | ||||
|                 return this.$store.state.startDate; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit("setStartDate", value); | ||||
|             }, | ||||
|         }, | ||||
|         endDate: { | ||||
|             get() { | ||||
|                 return this.$store.state.endDate; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit("setEndDate", value); | ||||
|             }, | ||||
|         }, | ||||
|         setSocialIssue: { | ||||
|             set() { | ||||
|                 this.$store.dispatch( | ||||
|                     "setSocialIssue", | ||||
|                     socialIssues[socialIssues.length - 1], | ||||
|                 ); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|     socialActionPicked: { | ||||
|       get() { | ||||
|         return this.$store.state.socialActionPicked; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setSocialAction", value); | ||||
|       }, | ||||
|     }, | ||||
|     startDate: { | ||||
|       get() { | ||||
|         return this.$store.state.startDate; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setStartDate", value); | ||||
|       }, | ||||
|     }, | ||||
|     endDate: { | ||||
|       get() { | ||||
|         return this.$store.state.endDate; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setEndDate", value); | ||||
|       }, | ||||
|     }, | ||||
|     setSocialIssue: { | ||||
|       set() { | ||||
|         this.$store.dispatch( | ||||
|           "setSocialIssue", | ||||
|           socialIssues[socialIssues.length - 1], | ||||
|         ); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| @@ -267,46 +288,46 @@ export default { | ||||
| @import "ChillPersonAssets/chill/scss/mixins"; | ||||
| @import "ChillMainAssets/chill/scss/chill_variables"; | ||||
| span.badge { | ||||
|   @include badge_social($social-issue-color); | ||||
|   font-size: 95%; | ||||
|   margin-bottom: 5px; | ||||
|   margin-right: 1em; | ||||
|   margin-left: 1em; | ||||
|     @include badge_social($social-issue-color); | ||||
|     font-size: 95%; | ||||
|     margin-bottom: 5px; | ||||
|     margin-right: 1em; | ||||
|     margin-left: 1em; | ||||
| } | ||||
| </style> | ||||
|  | ||||
| <style lang="scss"> | ||||
| #awc_create_form { | ||||
|   display: grid; | ||||
|   grid-template-areas: | ||||
|     "picking picking" | ||||
|     "start_date end_date" | ||||
|     "confirm confirm"; | ||||
|   grid-template-columns: 50% 50%; | ||||
|   column-gap: 1.5rem; | ||||
|     display: grid; | ||||
|     grid-template-areas: | ||||
|         "picking picking" | ||||
|         "start_date end_date" | ||||
|         "confirm confirm"; | ||||
|     grid-template-columns: 50% 50%; | ||||
|     column-gap: 1.5rem; | ||||
|  | ||||
|   #picking { | ||||
|     grid-area: picking; | ||||
|     #picking { | ||||
|         grid-area: picking; | ||||
|  | ||||
|     #persons { | ||||
|       ul { | ||||
|         padding: 0; | ||||
|         #persons { | ||||
|             ul { | ||||
|                 padding: 0; | ||||
|  | ||||
|         list-style-type: none; | ||||
|       } | ||||
|                 list-style-type: none; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   #start_date { | ||||
|     grid-area: start_date; | ||||
|   } | ||||
|     #start_date { | ||||
|         grid-area: start_date; | ||||
|     } | ||||
|  | ||||
|   #end_date { | ||||
|     grid-area: end_date; | ||||
|   } | ||||
|     #end_date { | ||||
|         grid-area: end_date; | ||||
|     } | ||||
|  | ||||
|   #confirm { | ||||
|     grid-area: confirm; | ||||
|   } | ||||
|     #confirm { | ||||
|         grid-area: confirm; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,67 +1,70 @@ | ||||
| <template> | ||||
|   <div> | ||||
|     <a id="evaluations"></a> | ||||
|     <div class="item-title" :title="evaluation.id || 'no id yet'"> | ||||
|       <span>{{ localizeString(evaluation.evaluation.title) }}</span> | ||||
|     </div> | ||||
|  | ||||
|     <div class="item-url mt-3 mb-4" v-if="evaluation.evaluation.url"> | ||||
|       <i class="fa fa-link fa-lg"></i> | ||||
|       <a :href="evaluation.evaluation.url" target="_blank">{{ | ||||
|         evaluation.evaluation.url | ||||
|       }}</a> | ||||
|     </div> | ||||
|  | ||||
|     <div> | ||||
|       <form-evaluation | ||||
|         ref="FormEvaluation" | ||||
|         :key="evaluation.key" | ||||
|         :evaluation="evaluation" | ||||
|         :docAnchorId="docAnchorId" | ||||
|       ></form-evaluation> | ||||
|         <a id="evaluations"></a> | ||||
|         <div class="item-title" :title="evaluation.id || 'no id yet'"> | ||||
|             <span>{{ localizeString(evaluation.evaluation.title) }}</span> | ||||
|         </div> | ||||
|  | ||||
|       <ul class="record_actions"> | ||||
|         <li v-if="evaluation.workflows_availables.length > 0"> | ||||
|           <list-workflow-modal | ||||
|             :workflows="evaluation.workflows" | ||||
|             :allowCreate="true" | ||||
|             relatedEntityClass="Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation" | ||||
|             :relatedEntityId="evaluation.id" | ||||
|             :workflowsAvailables="evaluation.workflows_availables" | ||||
|             @go-to-generate-workflow="goToGenerateWorkflow" | ||||
|           ></list-workflow-modal> | ||||
|         </li> | ||||
|         <li v-if="canDelete"> | ||||
|           <a | ||||
|             class="btn btn-delete" | ||||
|             @click="modal.showModal = true" | ||||
|             :title="$t('action.delete')" | ||||
|             >{{ $t("delete_evaluation") }}</a | ||||
|           > | ||||
|         </li> | ||||
|       </ul> | ||||
|         <div class="item-url mt-3 mb-4" v-if="evaluation.evaluation.url"> | ||||
|             <i class="fa fa-link fa-lg"></i> | ||||
|             <a :href="evaluation.evaluation.url" target="_blank">{{ | ||||
|                 evaluation.evaluation.url | ||||
|             }}</a> | ||||
|         </div> | ||||
|  | ||||
|         <div> | ||||
|             <form-evaluation | ||||
|                 ref="FormEvaluation" | ||||
|                 :key="evaluation.key" | ||||
|                 :evaluation="evaluation" | ||||
|                 :docAnchorId="docAnchorId" | ||||
|             ></form-evaluation> | ||||
|  | ||||
|             <ul class="record_actions"> | ||||
|                 <li v-if="evaluation.workflows_availables.length > 0"> | ||||
|                     <list-workflow-modal | ||||
|                         :workflows="evaluation.workflows" | ||||
|                         :allowCreate="true" | ||||
|                         relatedEntityClass="Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation" | ||||
|                         :relatedEntityId="evaluation.id" | ||||
|                         :workflowsAvailables="evaluation.workflows_availables" | ||||
|                         @go-to-generate-workflow="goToGenerateWorkflow" | ||||
|                     ></list-workflow-modal> | ||||
|                 </li> | ||||
|                 <li v-if="canDelete"> | ||||
|                     <a | ||||
|                         class="btn btn-delete" | ||||
|                         @click="modal.showModal = true" | ||||
|                         :title="$t('action.delete')" | ||||
|                         >{{ $t("delete_evaluation") }}</a | ||||
|                     > | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|  | ||||
|         <teleport to="body"> | ||||
|             <modal | ||||
|                 v-if="modal.showModal" | ||||
|                 :modalDialogClass="modal.modalDialogClass" | ||||
|                 @close="modal.showModal = false" | ||||
|             > | ||||
|                 <template v-slot:header> | ||||
|                     <h2 class="modal-title">{{ $t("delete.sure") }}</h2> | ||||
|                 </template> | ||||
|                 <template v-slot:body> | ||||
|                     <p>{{ $t("delete.sure_description") }}</p> | ||||
|                 </template> | ||||
|                 <template v-slot:footer> | ||||
|                     <button | ||||
|                         class="btn btn-danger" | ||||
|                         @click="removeEvaluation(evaluation)" | ||||
|                     > | ||||
|                         {{ $t("delete.ok") }} | ||||
|                     </button> | ||||
|                 </template> | ||||
|             </modal> | ||||
|         </teleport> | ||||
|     </div> | ||||
|  | ||||
|     <teleport to="body"> | ||||
|       <modal | ||||
|         v-if="modal.showModal" | ||||
|         :modalDialogClass="modal.modalDialogClass" | ||||
|         @close="modal.showModal = false" | ||||
|       > | ||||
|         <template v-slot:header> | ||||
|           <h2 class="modal-title">{{ $t("delete.sure") }}</h2> | ||||
|         </template> | ||||
|         <template v-slot:body> | ||||
|           <p>{{ $t("delete.sure_description") }}</p> | ||||
|         </template> | ||||
|         <template v-slot:footer> | ||||
|           <button class="btn btn-danger" @click="removeEvaluation(evaluation)"> | ||||
|             {{ $t("delete.ok") }} | ||||
|           </button> | ||||
|         </template> | ||||
|       </modal> | ||||
|     </teleport> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -72,112 +75,114 @@ import { buildLinkCreate } from "ChillMainAssets/lib/entity-workflow/api"; | ||||
| import { localizeString } from "ChillMainAssets/lib/localizationHelper/localizationHelper"; | ||||
|  | ||||
| const i18n = { | ||||
|   messages: { | ||||
|     fr: { | ||||
|       no_evaluation_associated: "Aucune évaluation associée", | ||||
|       add_an_evaluation: "Évaluations disponibles", | ||||
|       evaluation_has_no_evaluation: "Aucune évaluation disponible", | ||||
|       startDate: "Date d'ouverture", | ||||
|       endDate: "Date de fin", | ||||
|       maxDate: "Date d'échéance", | ||||
|       warningInterval: "Rappel (jours)", | ||||
|       comment: "Note publique", | ||||
|       documents: "Documents", | ||||
|       delete: { | ||||
|         sure: "Êtes-vous sûr?", | ||||
|         sure_description: | ||||
|           "Cette évaluation sera supprimée de cette action d'accompagnement", | ||||
|         ok: "Supprimer", | ||||
|       }, | ||||
|       delete_evaluation: "Supprimer l'évaluation", | ||||
|     messages: { | ||||
|         fr: { | ||||
|             no_evaluation_associated: "Aucune évaluation associée", | ||||
|             add_an_evaluation: "Évaluations disponibles", | ||||
|             evaluation_has_no_evaluation: "Aucune évaluation disponible", | ||||
|             startDate: "Date d'ouverture", | ||||
|             endDate: "Date de fin", | ||||
|             maxDate: "Date d'échéance", | ||||
|             warningInterval: "Rappel (jours)", | ||||
|             comment: "Note publique", | ||||
|             documents: "Documents", | ||||
|             delete: { | ||||
|                 sure: "Êtes-vous sûr?", | ||||
|                 sure_description: | ||||
|                     "Cette évaluation sera supprimée de cette action d'accompagnement", | ||||
|                 ok: "Supprimer", | ||||
|             }, | ||||
|             delete_evaluation: "Supprimer l'évaluation", | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export default { | ||||
|   name: "AddEvaluation", | ||||
|   components: { | ||||
|     FormEvaluation, | ||||
|     Modal, | ||||
|     ListWorkflowModal, | ||||
|   }, | ||||
|   props: ["evaluation", "docAnchorId"], | ||||
|   i18n, | ||||
|   data() { | ||||
|     return { | ||||
|       modal: { | ||||
|         showModal: false, | ||||
|         modalDialogClass: "modal-dialog-centered modal-md", | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     pickedEvaluations() { | ||||
|       return this.$store.state.evaluationsPicked; | ||||
|     name: "AddEvaluation", | ||||
|     components: { | ||||
|         FormEvaluation, | ||||
|         Modal, | ||||
|         ListWorkflowModal, | ||||
|     }, | ||||
|     canDelete() { | ||||
|       if (this.evaluation.workflows.length > 0) { | ||||
|         return false; | ||||
|       } | ||||
|     props: ["evaluation", "docAnchorId"], | ||||
|     i18n, | ||||
|     data() { | ||||
|         return { | ||||
|             modal: { | ||||
|                 showModal: false, | ||||
|                 modalDialogClass: "modal-dialog-centered modal-md", | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         pickedEvaluations() { | ||||
|             return this.$store.state.evaluationsPicked; | ||||
|         }, | ||||
|         canDelete() { | ||||
|             if (this.evaluation.workflows.length > 0) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|       for (let doc of this.evaluation.documents) { | ||||
|         if (doc.workflows.length > 0) { | ||||
|           return false; | ||||
|         } | ||||
|       } | ||||
|             for (let doc of this.evaluation.documents) { | ||||
|                 if (doc.workflows.length > 0) { | ||||
|                     return false; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|       return true; | ||||
|             return true; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     localizeString, | ||||
|     removeEvaluation(e) { | ||||
|       this.$store.commit("removeEvaluation", e); | ||||
|       return; | ||||
|     }, | ||||
|     toggleEditEvaluation() { | ||||
|       this.$store.commit("toggleEvaluationEdit", { key: this.evaluation.key }); | ||||
|     }, | ||||
|     submitForm() { | ||||
|       this.toggleEditEvaluation(); | ||||
|     }, | ||||
|     goToGenerateWorkflow({ workflowName }) { | ||||
|       const callback = (data) => { | ||||
|         let evaluationId = data.accompanyingPeriodWorkEvaluations.find( | ||||
|           (e) => e.key === this.evaluation.key, | ||||
|         ).id; | ||||
|         window.location.assign( | ||||
|           buildLinkCreate( | ||||
|             workflowName, | ||||
|             "Chill\\PersonBundle\\Entity\\AccompanyingPeriod\\AccompanyingPeriodWorkEvaluation", | ||||
|             evaluationId, | ||||
|           ), | ||||
|         ); | ||||
|       }; | ||||
|     methods: { | ||||
|         localizeString, | ||||
|         removeEvaluation(e) { | ||||
|             this.$store.commit("removeEvaluation", e); | ||||
|             return; | ||||
|         }, | ||||
|         toggleEditEvaluation() { | ||||
|             this.$store.commit("toggleEvaluationEdit", { | ||||
|                 key: this.evaluation.key, | ||||
|             }); | ||||
|         }, | ||||
|         submitForm() { | ||||
|             this.toggleEditEvaluation(); | ||||
|         }, | ||||
|         goToGenerateWorkflow({ workflowName }) { | ||||
|             const callback = (data) => { | ||||
|                 let evaluationId = data.accompanyingPeriodWorkEvaluations.find( | ||||
|                     (e) => e.key === this.evaluation.key, | ||||
|                 ).id; | ||||
|                 window.location.assign( | ||||
|                     buildLinkCreate( | ||||
|                         workflowName, | ||||
|                         "Chill\\PersonBundle\\Entity\\AccompanyingPeriod\\AccompanyingPeriodWorkEvaluation", | ||||
|                         evaluationId, | ||||
|                     ), | ||||
|                 ); | ||||
|             }; | ||||
|  | ||||
|       return this.$store.dispatch("submit", callback).catch((e) => { | ||||
|         console.log(e); | ||||
|         throw e; | ||||
|       }); | ||||
|             return this.$store.dispatch("submit", callback).catch((e) => { | ||||
|                 console.log(e); | ||||
|                 throw e; | ||||
|             }); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| div.item-title { | ||||
|   .evaluation-title { | ||||
|     cursor: default; | ||||
|     &::before { | ||||
|       content: ""; | ||||
|     .evaluation-title { | ||||
|         cursor: default; | ||||
|         &::before { | ||||
|             content: ""; | ||||
|         } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| div.item-url { | ||||
|   i { | ||||
|     color: unset !important; | ||||
|     margin-left: 1rem; | ||||
|     margin-right: 0.5rem; | ||||
|   } | ||||
|     i { | ||||
|         color: unset !important; | ||||
|         margin-left: 1rem; | ||||
|         margin-right: 0.5rem; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,167 +1,179 @@ | ||||
| <template> | ||||
|   <div v-if="hasResult" class="addResult"> | ||||
|     <p v-if="pickedResults.length === 0" class="chill-no-data-statement"> | ||||
|       Aucun résultat associé | ||||
|     </p> | ||||
|     <div v-if="hasResult" class="addResult"> | ||||
|         <p v-if="pickedResults.length === 0" class="chill-no-data-statement"> | ||||
|             Aucun résultat associé | ||||
|         </p> | ||||
|  | ||||
|     <ul class="list-suggest remove-items"> | ||||
|       <li v-for="r in pickedResults" @click="removeResult(r)" :key="r.id"> | ||||
|         <span> | ||||
|           {{ localizeString(r.title) }} | ||||
|         </span> | ||||
|       </li> | ||||
|     </ul> | ||||
|         <ul class="list-suggest remove-items"> | ||||
|             <li v-for="r in pickedResults" @click="removeResult(r)" :key="r.id"> | ||||
|                 <span> | ||||
|                     {{ localizeString(r.title) }} | ||||
|                 </span> | ||||
|             </li> | ||||
|         </ul> | ||||
|  | ||||
|     <div class="accordion" id="expandedSuggestions"> | ||||
|       <div class="accordion-item"> | ||||
|         <h2 class="accordion-header" id="heading_expanded_suggestions"> | ||||
|           <button | ||||
|             v-if="isExpanded" | ||||
|             class="accordion-button" | ||||
|             type="button" | ||||
|             data-bs-toggle="collapse" | ||||
|             aria-expanded="true" | ||||
|             @click="toggleSelect" | ||||
|           > | ||||
|             Masquer | ||||
|           </button> | ||||
|         <div class="accordion" id="expandedSuggestions"> | ||||
|             <div class="accordion-item"> | ||||
|                 <h2 class="accordion-header" id="heading_expanded_suggestions"> | ||||
|                     <button | ||||
|                         v-if="isExpanded" | ||||
|                         class="accordion-button" | ||||
|                         type="button" | ||||
|                         data-bs-toggle="collapse" | ||||
|                         aria-expanded="true" | ||||
|                         @click="toggleSelect" | ||||
|                     > | ||||
|                         Masquer | ||||
|                     </button> | ||||
|  | ||||
|           <button | ||||
|             v-else | ||||
|             class="accordion-button collapsed" | ||||
|             type="button" | ||||
|             data-bs-toggle="collapse" | ||||
|             aria-expanded="false" | ||||
|             @click="toggleSelect" | ||||
|           > | ||||
|             Résultats et orientations disponibles | ||||
|           </button> | ||||
|         </h2> | ||||
|         <div | ||||
|           class="accordion-collapse" | ||||
|           id="collapse_expanded_suggestions" | ||||
|           aria-labelledby="heading_expanded_suggestions" | ||||
|           data-bs-parent="#expandedSuggestions" | ||||
|         > | ||||
|           <template v-if="isExpanded"> | ||||
|             <ul class="list-suggest add-items"> | ||||
|               <li | ||||
|                 v-for="r in availableForCheckResults" | ||||
|                 @click="addResult(r)" | ||||
|                 :key="r.id" | ||||
|               > | ||||
|                 <span>{{ localizeString(r.title) }}</span> | ||||
|               </li> | ||||
|             </ul> | ||||
|           </template> | ||||
|                     <button | ||||
|                         v-else | ||||
|                         class="accordion-button collapsed" | ||||
|                         type="button" | ||||
|                         data-bs-toggle="collapse" | ||||
|                         aria-expanded="false" | ||||
|                         @click="toggleSelect" | ||||
|                     > | ||||
|                         Résultats et orientations disponibles | ||||
|                     </button> | ||||
|                 </h2> | ||||
|                 <div | ||||
|                     class="accordion-collapse" | ||||
|                     id="collapse_expanded_suggestions" | ||||
|                     aria-labelledby="heading_expanded_suggestions" | ||||
|                     data-bs-parent="#expandedSuggestions" | ||||
|                 > | ||||
|                     <template v-if="isExpanded"> | ||||
|                         <ul class="list-suggest add-items"> | ||||
|                             <li | ||||
|                                 v-for="r in availableForCheckResults" | ||||
|                                 @click="addResult(r)" | ||||
|                                 :key="r.id" | ||||
|                             > | ||||
|                                 <span>{{ localizeString(r.title) }}</span> | ||||
|                             </li> | ||||
|                         </ul> | ||||
|                     </template> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div v-if="!hasResult" class="noResult"> | ||||
|     <div class="chill-no-data-statement"> | ||||
|       {{ $t("goal_has_no_result") }} | ||||
|     <div v-if="!hasResult" class="noResult"> | ||||
|         <div class="chill-no-data-statement"> | ||||
|             {{ $t("goal_has_no_result") }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import { localizeString } from "ChillMainAssets/lib/localizationHelper/localizationHelper"; | ||||
|  | ||||
| const i18n = { | ||||
|   messages: { | ||||
|     fr: { | ||||
|       add_a_result: "Résultat - orientation disponibles", | ||||
|       goal_has_no_result: "Aucun résultat - orientation disponible", | ||||
|     messages: { | ||||
|         fr: { | ||||
|             add_a_result: "Résultat - orientation disponibles", | ||||
|             goal_has_no_result: "Aucun résultat - orientation disponible", | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
|  | ||||
| export default { | ||||
|   name: "AddResult", | ||||
|   props: ["destination", "goal", "availableResults"], | ||||
|   i18n, | ||||
|   data() { | ||||
|     return { | ||||
|       isExpanded: false, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     hasResult() { | ||||
|       if (this.destination === "action") { | ||||
|         return this.$store.state.resultsForAction.length > 0; | ||||
|       } else if (this.destination === "goal") { | ||||
|         return this.$store.getters.resultsForGoal(this.goal).length > 0; | ||||
|       } | ||||
|     name: "AddResult", | ||||
|     props: ["destination", "goal", "availableResults"], | ||||
|     i18n, | ||||
|     data() { | ||||
|         return { | ||||
|             isExpanded: false, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         hasResult() { | ||||
|             if (this.destination === "action") { | ||||
|                 return this.$store.state.resultsForAction.length > 0; | ||||
|             } else if (this.destination === "goal") { | ||||
|                 return this.$store.getters.resultsForGoal(this.goal).length > 0; | ||||
|             } | ||||
|  | ||||
|       throw Error(`this.destination is not implemented: ${this.destination}`); | ||||
|     }, | ||||
|     pickedResults() { | ||||
|       if (this.destination === "action") { | ||||
|         return this.$store.state.resultsPicked; | ||||
|       } else if (this.destination === "goal") { | ||||
|         return this.$store.getters.resultsPickedForGoal(this.goal); | ||||
|       } | ||||
|             throw Error( | ||||
|                 `this.destination is not implemented: ${this.destination}`, | ||||
|             ); | ||||
|         }, | ||||
|         pickedResults() { | ||||
|             if (this.destination === "action") { | ||||
|                 return this.$store.state.resultsPicked; | ||||
|             } else if (this.destination === "goal") { | ||||
|                 return this.$store.getters.resultsPickedForGoal(this.goal); | ||||
|             } | ||||
|  | ||||
|       throw Error(`this.destination is not implemented: ${this.destination}`); | ||||
|     }, | ||||
|     availableForCheckResults() { | ||||
|       if (this.destination === "action") { | ||||
|         let pickedIds = this.$store.state.resultsPicked.map((r) => r.id); | ||||
|             throw Error( | ||||
|                 `this.destination is not implemented: ${this.destination}`, | ||||
|             ); | ||||
|         }, | ||||
|         availableForCheckResults() { | ||||
|             if (this.destination === "action") { | ||||
|                 let pickedIds = this.$store.state.resultsPicked.map( | ||||
|                     (r) => r.id, | ||||
|                 ); | ||||
|  | ||||
|         return this.$store.state.resultsForAction.filter( | ||||
|           (r) => !pickedIds.includes(r.id), | ||||
|         ); | ||||
|       } else if (this.destination === "goal") { | ||||
|         let pickedIds = this.$store.getters | ||||
|           .resultsPickedForGoal(this.goal) | ||||
|           .map((r) => r.id); | ||||
|                 return this.$store.state.resultsForAction.filter( | ||||
|                     (r) => !pickedIds.includes(r.id), | ||||
|                 ); | ||||
|             } else if (this.destination === "goal") { | ||||
|                 let pickedIds = this.$store.getters | ||||
|                     .resultsPickedForGoal(this.goal) | ||||
|                     .map((r) => r.id); | ||||
|  | ||||
|         return this.$store.getters | ||||
|           .resultsForGoal(this.goal) | ||||
|           .filter((r) => !pickedIds.includes(r.id)); | ||||
|       } | ||||
|                 return this.$store.getters | ||||
|                     .resultsForGoal(this.goal) | ||||
|                     .filter((r) => !pickedIds.includes(r.id)); | ||||
|             } | ||||
|  | ||||
|       throw Error(`this.destination is not implemented: ${this.destination}`); | ||||
|             throw Error( | ||||
|                 `this.destination is not implemented: ${this.destination}`, | ||||
|             ); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     localizeString, | ||||
|     toggleSelect() { | ||||
|       this.isExpanded = !this.isExpanded; | ||||
|     methods: { | ||||
|         localizeString, | ||||
|         toggleSelect() { | ||||
|             this.isExpanded = !this.isExpanded; | ||||
|         }, | ||||
|         addResult(r) { | ||||
|             if (this.destination === "action") { | ||||
|                 this.$store.commit("addResultPicked", r); | ||||
|                 return; | ||||
|             } else if (this.destination === "goal") { | ||||
|                 this.$store.commit("addResultForGoalPicked", { | ||||
|                     goal: this.goal, | ||||
|                     result: r, | ||||
|                 }); | ||||
|                 return; | ||||
|             } | ||||
|             throw Error( | ||||
|                 `this.destination is not implemented: ${this.destination}`, | ||||
|             ); | ||||
|         }, | ||||
|         removeResult(r) { | ||||
|             if (this.destination === "action") { | ||||
|                 this.$store.commit("removeResultPicked", r); | ||||
|                 return; | ||||
|             } else if (this.destination === "goal") { | ||||
|                 this.$store.commit("removeResultForGoalPicked", { | ||||
|                     goal: this.goal, | ||||
|                     result: r, | ||||
|                 }); | ||||
|                 return; | ||||
|             } | ||||
|             throw Error( | ||||
|                 `this.destination is not implemented: ${this.destination}`, | ||||
|             ); | ||||
|         }, | ||||
|     }, | ||||
|     addResult(r) { | ||||
|       if (this.destination === "action") { | ||||
|         this.$store.commit("addResultPicked", r); | ||||
|         return; | ||||
|       } else if (this.destination === "goal") { | ||||
|         this.$store.commit("addResultForGoalPicked", { | ||||
|           goal: this.goal, | ||||
|           result: r, | ||||
|         }); | ||||
|         return; | ||||
|       } | ||||
|       throw Error(`this.destination is not implemented: ${this.destination}`); | ||||
|     }, | ||||
|     removeResult(r) { | ||||
|       if (this.destination === "action") { | ||||
|         this.$store.commit("removeResultPicked", r); | ||||
|         return; | ||||
|       } else if (this.destination === "goal") { | ||||
|         this.$store.commit("removeResultForGoalPicked", { | ||||
|           goal: this.goal, | ||||
|           result: r, | ||||
|         }); | ||||
|         return; | ||||
|       } | ||||
|       throw Error(`this.destination is not implemented: ${this.destination}`); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .accordion-button { | ||||
|   padding: 0.25rem; | ||||
|     padding: 0.25rem; | ||||
| } | ||||
| </style> | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,447 +1,445 @@ | ||||
| <template> | ||||
|   <fieldset class="mb-3" id="actionType"> | ||||
|     <div class="row"> | ||||
|       <legend class="col-sm-4 col-form-label"> | ||||
|         {{ $t("action.label") }} | ||||
|       </legend> | ||||
|       <div class="col-sm-8"> | ||||
|         <VueMultiselect | ||||
|           v-model="action" | ||||
|           :options="actions.options" | ||||
|           @select="selectAction" | ||||
|           @remove="unselectAction" | ||||
|           :multiple="true" | ||||
|           :close-on-select="false" | ||||
|           :placeholder="$t('action.placeholder')" | ||||
|           :custom-label="formatSocialAction" | ||||
|           track-by="id" | ||||
|           :searchable="true" | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|     <fieldset class="mb-3" id="actionType"> | ||||
|         <div class="row"> | ||||
|             <legend class="col-sm-4 col-form-label"> | ||||
|                 {{ $t("action.label") }} | ||||
|             </legend> | ||||
|             <div class="col-sm-8"> | ||||
|                 <VueMultiselect | ||||
|                     v-model="action" | ||||
|                     :options="actions.options" | ||||
|                     @select="selectAction" | ||||
|                     @remove="unselectAction" | ||||
|                     :multiple="true" | ||||
|                     :close-on-select="false" | ||||
|                     :placeholder="$t('action.placeholder')" | ||||
|                     :custom-label="formatSocialAction" | ||||
|                     track-by="id" | ||||
|                     :searchable="true" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </fieldset> | ||||
|  | ||||
|   <fieldset class="mb-3" id="goal"> | ||||
|     <div class="row"> | ||||
|       <legend class="col-sm-4 col-form-label"> | ||||
|         {{ $t("goal.label") }} | ||||
|       </legend> | ||||
|       <div class="col-sm-8"> | ||||
|         <VueMultiselect | ||||
|           v-model="goal" | ||||
|           :options="goals.options" | ||||
|           @select="selectGoal" | ||||
|           @remove="unselectGoal" | ||||
|           :multiple="true" | ||||
|           :close-on-select="false" | ||||
|           :placeholder="$t('goal.placeholder')" | ||||
|           label="title" | ||||
|           :custom-label="transTitle" | ||||
|           track-by="id" | ||||
|           :searchable="true" | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|     <fieldset class="mb-3" id="goal"> | ||||
|         <div class="row"> | ||||
|             <legend class="col-sm-4 col-form-label"> | ||||
|                 {{ $t("goal.label") }} | ||||
|             </legend> | ||||
|             <div class="col-sm-8"> | ||||
|                 <VueMultiselect | ||||
|                     v-model="goal" | ||||
|                     :options="goals.options" | ||||
|                     @select="selectGoal" | ||||
|                     @remove="unselectGoal" | ||||
|                     :multiple="true" | ||||
|                     :close-on-select="false" | ||||
|                     :placeholder="$t('goal.placeholder')" | ||||
|                     label="title" | ||||
|                     :custom-label="transTitle" | ||||
|                     track-by="id" | ||||
|                     :searchable="true" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </fieldset> | ||||
|  | ||||
|   <fieldset class="mb-3" id="result"> | ||||
|     <div class="row"> | ||||
|       <legend class="col-sm-4 col-form-label"> | ||||
|         {{ $t("result.label") }} | ||||
|       </legend> | ||||
|       <div class="col-sm-8"> | ||||
|         <VueMultiselect | ||||
|           v-model="result" | ||||
|           :options="results.options" | ||||
|           @select="selectResult" | ||||
|           @remove="unselectResult" | ||||
|           :multiple="true" | ||||
|           :close-on-select="false" | ||||
|           :placeholder="$t('result.placeholder')" | ||||
|           label="title" | ||||
|           :custom-label="transTitle" | ||||
|           track-by="id" | ||||
|           :searchable="true" | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </fieldset> | ||||
|     <fieldset class="mb-3" id="result"> | ||||
|         <div class="row"> | ||||
|             <legend class="col-sm-4 col-form-label"> | ||||
|                 {{ $t("result.label") }} | ||||
|             </legend> | ||||
|             <div class="col-sm-8"> | ||||
|                 <VueMultiselect | ||||
|                     v-model="result" | ||||
|                     :options="results.options" | ||||
|                     @select="selectResult" | ||||
|                     @remove="unselectResult" | ||||
|                     :multiple="true" | ||||
|                     :close-on-select="false" | ||||
|                     :placeholder="$t('result.placeholder')" | ||||
|                     label="title" | ||||
|                     :custom-label="transTitle" | ||||
|                     track-by="id" | ||||
|                     :searchable="true" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </fieldset> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import VueMultiselect from "vue-multiselect"; | ||||
| import { | ||||
|   getSocialActions, | ||||
|   getGoalByAction, | ||||
|   getResultByAction, | ||||
|   getResultByGoal, | ||||
|     getSocialActions, | ||||
|     getGoalByAction, | ||||
|     getResultByAction, | ||||
|     getResultByGoal, | ||||
| } from "./api"; | ||||
|  | ||||
| export default { | ||||
|   name: "App", | ||||
|   components: { | ||||
|     VueMultiselect, | ||||
|   }, | ||||
|   i18n: { | ||||
|     messages: { | ||||
|       fr: { | ||||
|     name: "App", | ||||
|     components: { | ||||
|         VueMultiselect, | ||||
|     }, | ||||
|     i18n: { | ||||
|         messages: { | ||||
|             fr: { | ||||
|                 action: { | ||||
|                     label: "Types d'actions", | ||||
|                     placeholder: "Choisissez une ou plusieurs actions", | ||||
|                 }, | ||||
|                 goal: { | ||||
|                     label: "Objectifs", | ||||
|                     placeholder: "Choisissez un ou plusieurs objectifs", | ||||
|                 }, | ||||
|                 result: { | ||||
|                     label: "Résultats", | ||||
|                     placeholder: "Choisissez un ou plusieurs résultats", | ||||
|                 }, | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             actions: { | ||||
|                 options: [], // array with multiselect options | ||||
|                 value: [], // array with selected values | ||||
|                 hiddenField: document.getElementById( | ||||
|                     "export_filters_social_work_type_filter_form_actionType", | ||||
|                 ), | ||||
|             }, | ||||
|             goals: { | ||||
|                 options: [], | ||||
|                 value: [], | ||||
|                 hiddenField: document.getElementById( | ||||
|                     "export_filters_social_work_type_filter_form_goal", | ||||
|                 ), | ||||
|             }, | ||||
|             results: { | ||||
|                 options: [], | ||||
|                 value: [], | ||||
|                 hiddenField: document.getElementById( | ||||
|                     "export_filters_social_work_type_filter_form_result", | ||||
|                 ), | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         action: { | ||||
|           label: "Types d'actions", | ||||
|           placeholder: "Choisissez une ou plusieurs actions", | ||||
|             get() { | ||||
|                 return this.actions.value; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.actions.value = value; | ||||
|                 this.rebuildHiddenFieldValues("actions"); | ||||
|             }, | ||||
|         }, | ||||
|         goal: { | ||||
|           label: "Objectifs", | ||||
|           placeholder: "Choisissez un ou plusieurs objectifs", | ||||
|             get() { | ||||
|                 return this.goals.value; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.goals.value = value; | ||||
|                 this.rebuildHiddenFieldValues("goals"); | ||||
|             }, | ||||
|         }, | ||||
|         result: { | ||||
|           label: "Résultats", | ||||
|           placeholder: "Choisissez un ou plusieurs résultats", | ||||
|             get() { | ||||
|                 return this.results.value; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.results.value = value; | ||||
|                 this.rebuildHiddenFieldValues("results"); | ||||
|             }, | ||||
|         }, | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       actions: { | ||||
|         options: [], // array with multiselect options | ||||
|         value: [], // array with selected values | ||||
|         hiddenField: document.getElementById( | ||||
|           "export_filters_social_work_type_filter_form_actionType", | ||||
|         ), | ||||
|       }, | ||||
|       goals: { | ||||
|         options: [], | ||||
|         value: [], | ||||
|         hiddenField: document.getElementById( | ||||
|           "export_filters_social_work_type_filter_form_goal", | ||||
|         ), | ||||
|       }, | ||||
|       results: { | ||||
|         options: [], | ||||
|         value: [], | ||||
|         hiddenField: document.getElementById( | ||||
|           "export_filters_social_work_type_filter_form_result", | ||||
|         ), | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     action: { | ||||
|       get() { | ||||
|         return this.actions.value; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.actions.value = value; | ||||
|         this.rebuildHiddenFieldValues("actions"); | ||||
|       }, | ||||
|     }, | ||||
|     goal: { | ||||
|       get() { | ||||
|         return this.goals.value; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.goals.value = value; | ||||
|         this.rebuildHiddenFieldValues("goals"); | ||||
|       }, | ||||
|     }, | ||||
|     result: { | ||||
|       get() { | ||||
|         return this.results.value; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.results.value = value; | ||||
|         this.rebuildHiddenFieldValues("results"); | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   async mounted() { | ||||
|     await this.getSocialActionsList(); | ||||
|     async mounted() { | ||||
|         await this.getSocialActionsList(); | ||||
|  | ||||
|     if ("" !== this.actions.hiddenField.value) { | ||||
|       const actionIds = this.actions.hiddenField.value.split(","); | ||||
|       for (const aid of actionIds) { | ||||
|         let action = this.actions.options.find( | ||||
|           (a) => Number.parseInt(aid) === a.id, | ||||
|         ); | ||||
|         if (undefined !== action) { | ||||
|           this.action.push(action); | ||||
|           await this.selectAction(action); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if ("" !== this.goals.hiddenField.value) { | ||||
|       const goalsIds = this.goals.hiddenField.value | ||||
|         .split(",") | ||||
|         .map((s) => Number.parseInt(s)); | ||||
|       for (const gid of goalsIds) { | ||||
|         let goal = this.goals.options.find((g) => gid === g.id); | ||||
|         if (undefined !== goal) { | ||||
|           this.goal.push(goal); | ||||
|           await this.selectGoal(goal); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     if ("" !== this.results.hiddenField.value) { | ||||
|       const resultsIds = this.results.hiddenField.value | ||||
|         .split(",") | ||||
|         .map((s) => Number.parseInt(s)); | ||||
|       for (const rid of resultsIds) { | ||||
|         let result = this.results.options.find((r) => rid === r.id); | ||||
|         if (undefined !== result) { | ||||
|           this.result.push(result); | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     async getSocialActionsList() { | ||||
|       let actions = await getSocialActions(); | ||||
|       this.actions.options = actions.toSorted(function (a, b) { | ||||
|         if (a.issue.ordering === b.issue.ordering) { | ||||
|           if (a.ordering === b.ordering) { | ||||
|             return 0; | ||||
|           } | ||||
|           if (a.ordering < b.ordering) { | ||||
|             return -1; | ||||
|           } | ||||
|           return 1; | ||||
|         if ("" !== this.actions.hiddenField.value) { | ||||
|             const actionIds = this.actions.hiddenField.value.split(","); | ||||
|             for (const aid of actionIds) { | ||||
|                 let action = this.actions.options.find( | ||||
|                     (a) => Number.parseInt(aid) === a.id, | ||||
|                 ); | ||||
|                 if (undefined !== action) { | ||||
|                     this.action.push(action); | ||||
|                     await this.selectAction(action); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (a.issue.ordering < b.issue.ordering) { | ||||
|           return -1; | ||||
|         if ("" !== this.goals.hiddenField.value) { | ||||
|             const goalsIds = this.goals.hiddenField.value | ||||
|                 .split(",") | ||||
|                 .map((s) => Number.parseInt(s)); | ||||
|             for (const gid of goalsIds) { | ||||
|                 let goal = this.goals.options.find((g) => gid === g.id); | ||||
|                 if (undefined !== goal) { | ||||
|                     this.goal.push(goal); | ||||
|                     await this.selectGoal(goal); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return 1; | ||||
|       }); | ||||
|  | ||||
|       return Promise.resolve(); | ||||
|         if ("" !== this.results.hiddenField.value) { | ||||
|             const resultsIds = this.results.hiddenField.value | ||||
|                 .split(",") | ||||
|                 .map((s) => Number.parseInt(s)); | ||||
|             for (const rid of resultsIds) { | ||||
|                 let result = this.results.options.find((r) => rid === r.id); | ||||
|                 if (undefined !== result) { | ||||
|                     this.result.push(result); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     }, | ||||
|     methods: { | ||||
|         async getSocialActionsList() { | ||||
|             let actions = await getSocialActions(); | ||||
|             this.actions.options = actions.toSorted(function (a, b) { | ||||
|                 if (a.issue.ordering === b.issue.ordering) { | ||||
|                     if (a.ordering === b.ordering) { | ||||
|                         return 0; | ||||
|                     } | ||||
|                     if (a.ordering < b.ordering) { | ||||
|                         return -1; | ||||
|                     } | ||||
|                     return 1; | ||||
|                 } | ||||
|  | ||||
|     formatSocialAction({ text, issue }) { | ||||
|       return text + " (" + issue.text + ")"; | ||||
|     }, | ||||
|                 if (a.issue.ordering < b.issue.ordering) { | ||||
|                     return -1; | ||||
|                 } | ||||
|  | ||||
|     /** | ||||
|      * Select/unselect in Action Multiselect | ||||
|      * @param value | ||||
|      */ | ||||
|     async selectAction(value) { | ||||
|       //console.log('----'); console.log('select action', value.id); | ||||
|       let children = this.getChildrensFromParent(value); | ||||
|       this.addSelectedElement("actions", children); | ||||
|                 return 1; | ||||
|             }); | ||||
|  | ||||
|       let parentAndChildren = [...[value], ...children]; | ||||
|       const promises = []; | ||||
|       parentAndChildren.forEach((elem) => { | ||||
|         promises.push( | ||||
|           getGoalByAction(elem.id).then((goals) => { | ||||
|             this.addElementInData("goals", goals); | ||||
|             return Promise.resolve(); | ||||
|           }), | ||||
|         ); | ||||
|         promises.push( | ||||
|           getResultByAction(elem.id).then((results) => { | ||||
|             this.addElementInData("results", results); | ||||
|         }, | ||||
|  | ||||
|         formatSocialAction({ text, issue }) { | ||||
|             return text + " (" + issue.text + ")"; | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Select/unselect in Action Multiselect | ||||
|          * @param value | ||||
|          */ | ||||
|         async selectAction(value) { | ||||
|             //console.log('----'); console.log('select action', value.id); | ||||
|             let children = this.getChildrensFromParent(value); | ||||
|             this.addSelectedElement("actions", children); | ||||
|  | ||||
|             let parentAndChildren = [...[value], ...children]; | ||||
|             const promises = []; | ||||
|             parentAndChildren.forEach((elem) => { | ||||
|                 promises.push( | ||||
|                     getGoalByAction(elem.id).then((goals) => { | ||||
|                         this.addElementInData("goals", goals); | ||||
|                         return Promise.resolve(); | ||||
|                     }), | ||||
|                 ); | ||||
|                 promises.push( | ||||
|                     getResultByAction(elem.id).then((results) => { | ||||
|                         this.addElementInData("results", results); | ||||
|                         return Promise.resolve(); | ||||
|                     }), | ||||
|                 ); | ||||
|             }); | ||||
|  | ||||
|             await Promise.all(promises); | ||||
|             return Promise.resolve(); | ||||
|           }), | ||||
|         ); | ||||
|       }); | ||||
|         }, | ||||
|  | ||||
|       await Promise.all(promises); | ||||
|       return Promise.resolve(); | ||||
|         unselectAction(value) { | ||||
|             getGoalByAction(value.id).then((goals) => { | ||||
|                 [this.results.options, this.results.value] = | ||||
|                     this.removeElementInData("goals", goals); | ||||
|             }); | ||||
|             getResultByAction(value.id).then((results) => { | ||||
|                 [this.results.options, this.results.value] = | ||||
|                     this.removeElementInData("results", results); | ||||
|             }); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Select/unselect in Goal Multiselect | ||||
|          * @param value | ||||
|          */ | ||||
|         async selectGoal(value) { | ||||
|             return getResultByGoal(value.id).then((results) => { | ||||
|                 this.addElementInData("results", results); | ||||
|             }); | ||||
|         }, | ||||
|  | ||||
|         unselectGoal(value) { | ||||
|             getResultByGoal(value.id).then( | ||||
|                 (results) => | ||||
|                     ([this.results.options, this.results.value] = | ||||
|                         this.removeElementInData("results", results)), | ||||
|             ).catch; | ||||
|         }, | ||||
|  | ||||
|         // selectResult(value) { | ||||
|         //console.log('----'); console.log('select result', value.id); | ||||
|         // }, | ||||
|  | ||||
|         // unselectResult(value) { | ||||
|         //console.log('----'); console.log('unselect result', value.id); | ||||
|         // }, | ||||
|  | ||||
|         /** | ||||
|          * Choose parent action will involve retaining the "children" actions. | ||||
|          * @param value | ||||
|          * @return array | ||||
|          */ | ||||
|         getChildrensFromParent(value) { | ||||
|             if (null === value.parent) { | ||||
|                 let excludeParent = this.actions.options.filter( | ||||
|                     (o) => o.parent !== null, | ||||
|                 ); | ||||
|                 let children = excludeParent.filter( | ||||
|                     (o) => o.parent.id === value.id, | ||||
|                 ); | ||||
|                 //console.log("get childrens", children.map(e => e.id)); | ||||
|                 return children; | ||||
|             } | ||||
|             return []; | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Add response elements in data target | ||||
|          * @param target string -> 'actions', 'goals' or 'results' | ||||
|          * @param response array of objects with fetch results | ||||
|          */ | ||||
|         addElementInData(target, response) { | ||||
|             let data = this[target]; | ||||
|             let dump = []; | ||||
|             response.forEach((elem) => { | ||||
|                 let found = data.options.some((e) => e.id === elem.id); | ||||
|                 if (!found) { | ||||
|                     data.options.push(elem); | ||||
|                     dump.push(elem.id); | ||||
|                 } | ||||
|             }); | ||||
|             if (dump.length > 0) { | ||||
|                 //console.log('push ' + dump.length + ' elems in', target, dump); | ||||
|             } | ||||
|             data.options.sort(); | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Remove response elements from data target | ||||
|          * @param target string -> 'actions', 'goals' or 'results' | ||||
|          * @param response array of objects with fetch results | ||||
|          * @returns data.<target>.options | ||||
|          */ | ||||
|         removeElementInData(target, response) { | ||||
|             let data = this[target]; | ||||
|             let dump = []; | ||||
|             response.forEach((elem) => { | ||||
|                 let found = data.options.some((e) => e.id === elem.id); | ||||
|                 if (found) { | ||||
|                     data.options = data.options.filter((e) => e.id !== elem.id); | ||||
|                     dump.push(elem.id); | ||||
|  | ||||
|                     this.removeSelectedElement(target, elem); | ||||
|                 } | ||||
|             }); | ||||
|             if (dump.length > 0) { | ||||
|                 //console.log('remove ' + dump.length + ' elems from ' + target + ' options', dump); | ||||
|             } | ||||
|             return [data.options, data.value]; | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * | ||||
|          * @param target | ||||
|          * @param elements | ||||
|          */ | ||||
|         addSelectedElement(target, elements) { | ||||
|             let data = this[target]; | ||||
|             let dump = []; | ||||
|             elements.forEach((elem) => { | ||||
|                 let selected = data.value.some((e) => e.id === elem.id); | ||||
|                 if (!selected) { | ||||
|                     data.value.push(elem); | ||||
|                     dump.push(elem.id); | ||||
|  | ||||
|                     // add in hiddenField | ||||
|                     this.rebuildHiddenFieldValues(target); | ||||
|                 } | ||||
|             }); | ||||
|             if (dump.length > 0) { | ||||
|                 //console.log('add ' + dump.length + ' selected elems in', target, dump); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Remove element from selected and from hiddenField | ||||
|          * @param target | ||||
|          * @param elem | ||||
|          */ | ||||
|         removeSelectedElement(target, elem) { | ||||
|             let data = this[target]; | ||||
|             let selected = data.value.some((e) => e.id === elem.id); | ||||
|             if (selected) { | ||||
|                 // remove from selected | ||||
|                 data.value = data.value.filter((e) => e.id !== elem.id); | ||||
|                 //console.log('remove ' + elem.id + ' from selected ' + target); | ||||
|  | ||||
|                 // remove from hiddenField | ||||
|                 this.rebuildHiddenFieldValues(target); | ||||
|  | ||||
|                 // in any cases, remove should be recursive | ||||
|                 this.unselectToNextField(target, elem); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * When unselect Action, it could remove elements in goals multiselect. | ||||
|          * In that case, we have to unselect Goal to remove elements in results too. | ||||
|          * @param target | ||||
|          * @param elem | ||||
|          */ | ||||
|         unselectToNextField(target, elem) { | ||||
|             if (target === "goals") { | ||||
|                 //console.log('!!!! target is goal: unselect goal', elem.id); | ||||
|                 this.unselectGoal(elem); | ||||
|                 //console.log('!!!! done'); | ||||
|             } | ||||
|         }, | ||||
|  | ||||
|         /** | ||||
|          * Rebuild values serie (string) in target HiddenField | ||||
|          * @param target | ||||
|          */ | ||||
|         rebuildHiddenFieldValues(target) { | ||||
|             let data = this[target]; | ||||
|             //console.log('rebuild hiddenFields ' + target + ' values :'); | ||||
|             data.hiddenField.value = ""; // reset | ||||
|             data.value.forEach((elem) => { | ||||
|                 data.hiddenField.value = this.addIdToValue( | ||||
|                     data.hiddenField.value, | ||||
|                     elem.id, | ||||
|                 ); | ||||
|             }); | ||||
|             //console.log(data.hiddenField); | ||||
|         }, | ||||
|  | ||||
|         addIdToValue(string, id) { | ||||
|             let array = string ? string.split(",") : []; | ||||
|             array.push(id.toString()); | ||||
|             let str = array.join(); | ||||
|             return str; | ||||
|         }, | ||||
|  | ||||
|         transTitle({ title }) { | ||||
|             return title.fr; //TODO multilang | ||||
|         }, | ||||
|     }, | ||||
|  | ||||
|     unselectAction(value) { | ||||
|       getGoalByAction(value.id).then((goals) => { | ||||
|         [this.results.options, this.results.value] = this.removeElementInData( | ||||
|           "goals", | ||||
|           goals, | ||||
|         ); | ||||
|       }); | ||||
|       getResultByAction(value.id).then((results) => { | ||||
|         [this.results.options, this.results.value] = this.removeElementInData( | ||||
|           "results", | ||||
|           results, | ||||
|         ); | ||||
|       }); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Select/unselect in Goal Multiselect | ||||
|      * @param value | ||||
|      */ | ||||
|     async selectGoal(value) { | ||||
|       return getResultByGoal(value.id).then((results) => { | ||||
|         this.addElementInData("results", results); | ||||
|       }); | ||||
|     }, | ||||
|  | ||||
|     unselectGoal(value) { | ||||
|       getResultByGoal(value.id).then( | ||||
|         (results) => | ||||
|           ([this.results.options, this.results.value] = | ||||
|             this.removeElementInData("results", results)), | ||||
|       ).catch; | ||||
|     }, | ||||
|  | ||||
|     // selectResult(value) { | ||||
|     //console.log('----'); console.log('select result', value.id); | ||||
|     // }, | ||||
|  | ||||
|     // unselectResult(value) { | ||||
|     //console.log('----'); console.log('unselect result', value.id); | ||||
|     // }, | ||||
|  | ||||
|     /** | ||||
|      * Choose parent action will involve retaining the "children" actions. | ||||
|      * @param value | ||||
|      * @return array | ||||
|      */ | ||||
|     getChildrensFromParent(value) { | ||||
|       if (null === value.parent) { | ||||
|         let excludeParent = this.actions.options.filter( | ||||
|           (o) => o.parent !== null, | ||||
|         ); | ||||
|         let children = excludeParent.filter((o) => o.parent.id === value.id); | ||||
|         //console.log("get childrens", children.map(e => e.id)); | ||||
|         return children; | ||||
|       } | ||||
|       return []; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Add response elements in data target | ||||
|      * @param target string -> 'actions', 'goals' or 'results' | ||||
|      * @param response array of objects with fetch results | ||||
|      */ | ||||
|     addElementInData(target, response) { | ||||
|       let data = this[target]; | ||||
|       let dump = []; | ||||
|       response.forEach((elem) => { | ||||
|         let found = data.options.some((e) => e.id === elem.id); | ||||
|         if (!found) { | ||||
|           data.options.push(elem); | ||||
|           dump.push(elem.id); | ||||
|         } | ||||
|       }); | ||||
|       if (dump.length > 0) { | ||||
|         //console.log('push ' + dump.length + ' elems in', target, dump); | ||||
|       } | ||||
|       data.options.sort(); | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Remove response elements from data target | ||||
|      * @param target string -> 'actions', 'goals' or 'results' | ||||
|      * @param response array of objects with fetch results | ||||
|      * @returns data.<target>.options | ||||
|      */ | ||||
|     removeElementInData(target, response) { | ||||
|       let data = this[target]; | ||||
|       let dump = []; | ||||
|       response.forEach((elem) => { | ||||
|         let found = data.options.some((e) => e.id === elem.id); | ||||
|         if (found) { | ||||
|           data.options = data.options.filter((e) => e.id !== elem.id); | ||||
|           dump.push(elem.id); | ||||
|  | ||||
|           this.removeSelectedElement(target, elem); | ||||
|         } | ||||
|       }); | ||||
|       if (dump.length > 0) { | ||||
|         //console.log('remove ' + dump.length + ' elems from ' + target + ' options', dump); | ||||
|       } | ||||
|       return [data.options, data.value]; | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param target | ||||
|      * @param elements | ||||
|      */ | ||||
|     addSelectedElement(target, elements) { | ||||
|       let data = this[target]; | ||||
|       let dump = []; | ||||
|       elements.forEach((elem) => { | ||||
|         let selected = data.value.some((e) => e.id === elem.id); | ||||
|         if (!selected) { | ||||
|           data.value.push(elem); | ||||
|           dump.push(elem.id); | ||||
|  | ||||
|           // add in hiddenField | ||||
|           this.rebuildHiddenFieldValues(target); | ||||
|         } | ||||
|       }); | ||||
|       if (dump.length > 0) { | ||||
|         //console.log('add ' + dump.length + ' selected elems in', target, dump); | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Remove element from selected and from hiddenField | ||||
|      * @param target | ||||
|      * @param elem | ||||
|      */ | ||||
|     removeSelectedElement(target, elem) { | ||||
|       let data = this[target]; | ||||
|       let selected = data.value.some((e) => e.id === elem.id); | ||||
|       if (selected) { | ||||
|         // remove from selected | ||||
|         data.value = data.value.filter((e) => e.id !== elem.id); | ||||
|         //console.log('remove ' + elem.id + ' from selected ' + target); | ||||
|  | ||||
|         // remove from hiddenField | ||||
|         this.rebuildHiddenFieldValues(target); | ||||
|  | ||||
|         // in any cases, remove should be recursive | ||||
|         this.unselectToNextField(target, elem); | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * When unselect Action, it could remove elements in goals multiselect. | ||||
|      * In that case, we have to unselect Goal to remove elements in results too. | ||||
|      * @param target | ||||
|      * @param elem | ||||
|      */ | ||||
|     unselectToNextField(target, elem) { | ||||
|       if (target === "goals") { | ||||
|         //console.log('!!!! target is goal: unselect goal', elem.id); | ||||
|         this.unselectGoal(elem); | ||||
|         //console.log('!!!! done'); | ||||
|       } | ||||
|     }, | ||||
|  | ||||
|     /** | ||||
|      * Rebuild values serie (string) in target HiddenField | ||||
|      * @param target | ||||
|      */ | ||||
|     rebuildHiddenFieldValues(target) { | ||||
|       let data = this[target]; | ||||
|       //console.log('rebuild hiddenFields ' + target + ' values :'); | ||||
|       data.hiddenField.value = ""; // reset | ||||
|       data.value.forEach((elem) => { | ||||
|         data.hiddenField.value = this.addIdToValue( | ||||
|           data.hiddenField.value, | ||||
|           elem.id, | ||||
|         ); | ||||
|       }); | ||||
|       //console.log(data.hiddenField); | ||||
|     }, | ||||
|  | ||||
|     addIdToValue(string, id) { | ||||
|       let array = string ? string.split(",") : []; | ||||
|       array.push(id.toString()); | ||||
|       let str = array.join(); | ||||
|       return str; | ||||
|     }, | ||||
|  | ||||
|     transTitle({ title }) { | ||||
|       return title.fr; //TODO multilang | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,53 +1,53 @@ | ||||
| <template> | ||||
|   <ol class="breadcrumb"> | ||||
|     <li | ||||
|       v-for="s in steps" | ||||
|       :key="s" | ||||
|       class="breadcrumb-item" | ||||
|       :class="{ active: step === s }" | ||||
|     > | ||||
|       {{ $t("household_members_editor.app.steps." + s) }} | ||||
|     </li> | ||||
|   </ol> | ||||
|   <concerned v-if="step === 'concerned'" /> | ||||
|   <household v-if="step === 'household'" @ready-to-go="goToNext" /> | ||||
|   <household-address v-if="step === 'household_address'" /> | ||||
|   <positioning v-if="step === 'positioning'" /> | ||||
|   <dates v-if="step === 'confirm'" /> | ||||
|   <confirmation v-if="step === 'confirm'" /> | ||||
|     <ol class="breadcrumb"> | ||||
|         <li | ||||
|             v-for="s in steps" | ||||
|             :key="s" | ||||
|             class="breadcrumb-item" | ||||
|             :class="{ active: step === s }" | ||||
|         > | ||||
|             {{ $t("household_members_editor.app.steps." + s) }} | ||||
|         </li> | ||||
|     </ol> | ||||
|     <concerned v-if="step === 'concerned'" /> | ||||
|     <household v-if="step === 'household'" @ready-to-go="goToNext" /> | ||||
|     <household-address v-if="step === 'household_address'" /> | ||||
|     <positioning v-if="step === 'positioning'" /> | ||||
|     <dates v-if="step === 'confirm'" /> | ||||
|     <confirmation v-if="step === 'confirm'" /> | ||||
|  | ||||
|   <ul class="record_actions sticky-form-buttons"> | ||||
|     <li class="cancel" v-if="step !== 'concerned'"> | ||||
|       <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|         {{ $t("household_members_editor.app.previous") }} | ||||
|       </button> | ||||
|     </li> | ||||
|     <li class="cancel" v-else-if="hasReturnPath"> | ||||
|       <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|         {{ $t("household_members_editor.app.cancel") }} | ||||
|       </button> | ||||
|     </li> | ||||
|     <li v-if="step !== 'confirm'"> | ||||
|       <button | ||||
|         class="btn btn-action" | ||||
|         @click="goToNext" | ||||
|         :disabled="!isNextAllowed" | ||||
|       > | ||||
|         {{ $t("household_members_editor.app.next") }} <i | ||||
|           class="fa fa-arrow-right" | ||||
|         /> | ||||
|       </button> | ||||
|     </li> | ||||
|     <li v-else> | ||||
|       <button | ||||
|         class="btn btn-save" | ||||
|         @click="confirm" | ||||
|         :disabled="hasWarnings || !lastStepIsSaveAllowed" | ||||
|       > | ||||
|         {{ $t("household_members_editor.app.save") }} | ||||
|       </button> | ||||
|     </li> | ||||
|   </ul> | ||||
|     <ul class="record_actions sticky-form-buttons"> | ||||
|         <li class="cancel" v-if="step !== 'concerned'"> | ||||
|             <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|                 {{ $t("household_members_editor.app.previous") }} | ||||
|             </button> | ||||
|         </li> | ||||
|         <li class="cancel" v-else-if="hasReturnPath"> | ||||
|             <button class="btn btn-cancel" @click="goToPrevious"> | ||||
|                 {{ $t("household_members_editor.app.cancel") }} | ||||
|             </button> | ||||
|         </li> | ||||
|         <li v-if="step !== 'confirm'"> | ||||
|             <button | ||||
|                 class="btn btn-action" | ||||
|                 @click="goToNext" | ||||
|                 :disabled="!isNextAllowed" | ||||
|             > | ||||
|                 {{ $t("household_members_editor.app.next") }} <i | ||||
|                     class="fa fa-arrow-right" | ||||
|                 /> | ||||
|             </button> | ||||
|         </li> | ||||
|         <li v-else> | ||||
|             <button | ||||
|                 class="btn btn-save" | ||||
|                 @click="confirm" | ||||
|                 :disabled="hasWarnings || !lastStepIsSaveAllowed" | ||||
|             > | ||||
|                 {{ $t("household_members_editor.app.save") }} | ||||
|             </button> | ||||
|         </li> | ||||
|     </ul> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -60,123 +60,123 @@ import Confirmation from "./components/Confirmation.vue"; | ||||
| import Positioning from "./components/Positioning"; | ||||
|  | ||||
| export default { | ||||
|   name: "App", | ||||
|   components: { | ||||
|     Positioning, | ||||
|     Concerned, | ||||
|     Household, | ||||
|     HouseholdAddress, | ||||
|     Dates, | ||||
|     Confirmation, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       step: "concerned", | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       hasWarnings: (state) => | ||||
|         state.warnings.length > 0 || state.errors.length > 0, | ||||
|     }), | ||||
|     steps() { | ||||
|       let s = ["concerned", "household"]; | ||||
|  | ||||
|       if (this.$store.getters.isHouseholdNew) { | ||||
|         s.push("household_address"); | ||||
|       } | ||||
|  | ||||
|       if (!this.$store.getters.isModeLeave) { | ||||
|         s.push("positioning"); | ||||
|       } | ||||
|  | ||||
|       s.push("confirm"); | ||||
|  | ||||
|       return s; | ||||
|     name: "App", | ||||
|     components: { | ||||
|         Positioning, | ||||
|         Concerned, | ||||
|         Household, | ||||
|         HouseholdAddress, | ||||
|         Dates, | ||||
|         Confirmation, | ||||
|     }, | ||||
|     hasReturnPath() { | ||||
|       let params = new URLSearchParams(window.location.search); | ||||
|     data() { | ||||
|         return { | ||||
|             step: "concerned", | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             hasWarnings: (state) => | ||||
|                 state.warnings.length > 0 || state.errors.length > 0, | ||||
|         }), | ||||
|         steps() { | ||||
|             let s = ["concerned", "household"]; | ||||
|  | ||||
|       return params.has("returnPath"); | ||||
|     }, | ||||
|     // return true if the next step is allowed | ||||
|     isNextAllowed() { | ||||
|       switch (this.$data.step) { | ||||
|         case "concerned": | ||||
|           return this.$store.state.concerned.length > 0; | ||||
|         case "household": | ||||
|           return this.$store.state.mode !== null; | ||||
|         case "household_address": | ||||
|           return ( | ||||
|             this.$store.getters.hasHouseholdAddress || | ||||
|             this.$store.getters.isHouseholdForceNoAddress | ||||
|           ); | ||||
|         case "positioning": | ||||
|           return ( | ||||
|             this.$store.getters.hasHouseholdOrLeave && | ||||
|             this.$store.getters.hasPersonsWellPositionnated | ||||
|           ); | ||||
|       } | ||||
|             if (this.$store.getters.isHouseholdNew) { | ||||
|                 s.push("household_address"); | ||||
|             } | ||||
|  | ||||
|       return false; | ||||
|     }, | ||||
|     lastStepIsSaveAllowed() { | ||||
|       let r = | ||||
|         !this.$store.getters.isHouseholdNew || | ||||
|         (this.$store.state.numberOfChildren !== null && | ||||
|           this.$store.state.householdCompositionType !== null); | ||||
|       console.log("is saved allowed ?", r); | ||||
|             if (!this.$store.getters.isModeLeave) { | ||||
|                 s.push("positioning"); | ||||
|             } | ||||
|  | ||||
|       return r; | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     goToNext() { | ||||
|       console.log("go to next"); | ||||
|       switch (this.$data.step) { | ||||
|         case "concerned": | ||||
|           this.$data.step = "household"; | ||||
|           break; | ||||
|         case "household": | ||||
|           if (this.$store.getters.isHouseholdNew) { | ||||
|             this.$data.step = "household_address"; | ||||
|             break; | ||||
|           } else if (this.$store.getters.isModeLeave) { | ||||
|             this.$data.step = "confirm"; | ||||
|             break; | ||||
|           } else { | ||||
|             this.$data.step = "positioning"; | ||||
|             break; | ||||
|           } | ||||
|         case "household_address": | ||||
|           this.$data.step = "positioning"; | ||||
|           break; | ||||
|         case "positioning": | ||||
|           this.$data.step = "confirm"; | ||||
|           break; | ||||
|       } | ||||
|     }, | ||||
|     goToPrevious() { | ||||
|       if (this.$data.step === "concerned") { | ||||
|         let params = new URLSearchParams(window.location.search); | ||||
|         if (params.has("returnPath")) { | ||||
|           window.location.replace(params.get("returnPath")); | ||||
|         } else { | ||||
|           return; | ||||
|         } | ||||
|       } | ||||
|             s.push("confirm"); | ||||
|  | ||||
|       let s = this.steps; | ||||
|       let index = s.indexOf(this.$data.step); | ||||
|       if (s[index - 1] === undefined) { | ||||
|         throw Error("step not found"); | ||||
|       } | ||||
|             return s; | ||||
|         }, | ||||
|         hasReturnPath() { | ||||
|             let params = new URLSearchParams(window.location.search); | ||||
|  | ||||
|       this.$data.step = s[index - 1]; | ||||
|             return params.has("returnPath"); | ||||
|         }, | ||||
|         // return true if the next step is allowed | ||||
|         isNextAllowed() { | ||||
|             switch (this.$data.step) { | ||||
|                 case "concerned": | ||||
|                     return this.$store.state.concerned.length > 0; | ||||
|                 case "household": | ||||
|                     return this.$store.state.mode !== null; | ||||
|                 case "household_address": | ||||
|                     return ( | ||||
|                         this.$store.getters.hasHouseholdAddress || | ||||
|                         this.$store.getters.isHouseholdForceNoAddress | ||||
|                     ); | ||||
|                 case "positioning": | ||||
|                     return ( | ||||
|                         this.$store.getters.hasHouseholdOrLeave && | ||||
|                         this.$store.getters.hasPersonsWellPositionnated | ||||
|                     ); | ||||
|             } | ||||
|  | ||||
|             return false; | ||||
|         }, | ||||
|         lastStepIsSaveAllowed() { | ||||
|             let r = | ||||
|                 !this.$store.getters.isHouseholdNew || | ||||
|                 (this.$store.state.numberOfChildren !== null && | ||||
|                     this.$store.state.householdCompositionType !== null); | ||||
|             console.log("is saved allowed ?", r); | ||||
|  | ||||
|             return r; | ||||
|         }, | ||||
|     }, | ||||
|     confirm() { | ||||
|       this.$store.dispatch("confirm"); | ||||
|     methods: { | ||||
|         goToNext() { | ||||
|             console.log("go to next"); | ||||
|             switch (this.$data.step) { | ||||
|                 case "concerned": | ||||
|                     this.$data.step = "household"; | ||||
|                     break; | ||||
|                 case "household": | ||||
|                     if (this.$store.getters.isHouseholdNew) { | ||||
|                         this.$data.step = "household_address"; | ||||
|                         break; | ||||
|                     } else if (this.$store.getters.isModeLeave) { | ||||
|                         this.$data.step = "confirm"; | ||||
|                         break; | ||||
|                     } else { | ||||
|                         this.$data.step = "positioning"; | ||||
|                         break; | ||||
|                     } | ||||
|                 case "household_address": | ||||
|                     this.$data.step = "positioning"; | ||||
|                     break; | ||||
|                 case "positioning": | ||||
|                     this.$data.step = "confirm"; | ||||
|                     break; | ||||
|             } | ||||
|         }, | ||||
|         goToPrevious() { | ||||
|             if (this.$data.step === "concerned") { | ||||
|                 let params = new URLSearchParams(window.location.search); | ||||
|                 if (params.has("returnPath")) { | ||||
|                     window.location.replace(params.get("returnPath")); | ||||
|                 } else { | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             let s = this.steps; | ||||
|             let index = s.indexOf(this.$data.step); | ||||
|             if (s[index - 1] === undefined) { | ||||
|                 throw Error("step not found"); | ||||
|             } | ||||
|  | ||||
|             this.$data.step = s[index - 1]; | ||||
|         }, | ||||
|         confirm() { | ||||
|             this.$store.dispatch("confirm"); | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,74 +1,88 @@ | ||||
| <template> | ||||
|   <h2 class="mt-4"> | ||||
|     {{ $t("household_members_editor.concerned.title") }} | ||||
|   </h2> | ||||
|     <h2 class="mt-4"> | ||||
|         {{ $t("household_members_editor.concerned.title") }} | ||||
|     </h2> | ||||
|  | ||||
|   <div v-if="noPerson"> | ||||
|     <div class="alert alert-info"> | ||||
|       {{ $t("household_members_editor.concerned.add_at_least_onePerson") }} | ||||
|     <div v-if="noPerson"> | ||||
|         <div class="alert alert-info"> | ||||
|             {{ | ||||
|                 $t("household_members_editor.concerned.add_at_least_onePerson") | ||||
|             }} | ||||
|         </div> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div v-else> | ||||
|     <p> | ||||
|       {{ | ||||
|         $t("household_members_editor.concerned.persons_will_be_moved") | ||||
|       }} : | ||||
|     </p> | ||||
|     <div v-else> | ||||
|         <p> | ||||
|             {{ | ||||
|                 $t("household_members_editor.concerned.persons_will_be_moved") | ||||
|             }} : | ||||
|         </p> | ||||
|  | ||||
|     <ul class="list-suggest remove-items inline"> | ||||
|       <li v-for="c in concerned" :key="c.person.id" @click="removeConcerned(c)"> | ||||
|         <span><person-text :person="c.person" /></span> | ||||
|       </li> | ||||
|     </ul> | ||||
|         <ul class="list-suggest remove-items inline"> | ||||
|             <li | ||||
|                 v-for="c in concerned" | ||||
|                 :key="c.person.id" | ||||
|                 @click="removeConcerned(c)" | ||||
|             > | ||||
|                 <span><person-text :person="c.person" /></span> | ||||
|             </li> | ||||
|         </ul> | ||||
|  | ||||
|     <div | ||||
|       class="alert alert-info" | ||||
|       v-if="concernedPersonsWithHouseholds.length > 0" | ||||
|     > | ||||
|       <p> | ||||
|         {{ $t("household_members_editor.concerned.persons_with_household") }} | ||||
|       </p> | ||||
|       <ul v-for="c in concernedPersonsWithHouseholds" :key="c.person.id"> | ||||
|         <li> | ||||
|           {{ c.person.text }} | ||||
|           {{ | ||||
|             $t( | ||||
|               "household_members_editor.concerned.already_belongs_to_household", | ||||
|             ) | ||||
|           }} | ||||
|           <a | ||||
|             target="_blank" | ||||
|             :href="this.makeHouseholdLink(c.person.current_household_id)" | ||||
|             >{{ c.person.current_household_id }}</a | ||||
|           >. | ||||
|         <div | ||||
|             class="alert alert-info" | ||||
|             v-if="concernedPersonsWithHouseholds.length > 0" | ||||
|         > | ||||
|             <p> | ||||
|                 {{ | ||||
|                     $t( | ||||
|                         "household_members_editor.concerned.persons_with_household", | ||||
|                     ) | ||||
|                 }} | ||||
|             </p> | ||||
|             <ul v-for="c in concernedPersonsWithHouseholds" :key="c.person.id"> | ||||
|                 <li> | ||||
|                     {{ c.person.text }} | ||||
|                     {{ | ||||
|                         $t( | ||||
|                             "household_members_editor.concerned.already_belongs_to_household", | ||||
|                         ) | ||||
|                     }} | ||||
|                     <a | ||||
|                         target="_blank" | ||||
|                         :href=" | ||||
|                             this.makeHouseholdLink( | ||||
|                                 c.person.current_household_id, | ||||
|                             ) | ||||
|                         " | ||||
|                         >{{ c.person.current_household_id }}</a | ||||
|                     >. | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <ul class="record_actions"> | ||||
|         <li class="add-persons"> | ||||
|             <add-persons | ||||
|                 button-title="household_members_editor.concerned.add_persons" | ||||
|                 modal-title="household_members_editor.concerned.search" | ||||
|                 :key="addPersons.key" | ||||
|                 :options="addPersons.options" | ||||
|                 @add-new-persons="addNewPersons" | ||||
|                 ref="addPersons" | ||||
|             > | ||||
|                 <!-- to cast child method --> | ||||
|             </add-persons> | ||||
|         </li> | ||||
|       </ul> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <ul class="record_actions"> | ||||
|     <li class="add-persons"> | ||||
|       <add-persons | ||||
|         button-title="household_members_editor.concerned.add_persons" | ||||
|         modal-title="household_members_editor.concerned.search" | ||||
|         :key="addPersons.key" | ||||
|         :options="addPersons.options" | ||||
|         @add-new-persons="addNewPersons" | ||||
|         ref="addPersons" | ||||
|       > | ||||
|         <!-- to cast child method --> | ||||
|       </add-persons> | ||||
|     </li> | ||||
|   </ul> | ||||
|     </ul> | ||||
| </template> | ||||
|  | ||||
| <style lang="scss"> | ||||
| .move_to { | ||||
|   .move_hint { | ||||
|     text-align: center; | ||||
|     display: inline-block; | ||||
|     padding: 0.4rem 0.5rem; | ||||
|   } | ||||
|     .move_hint { | ||||
|         text-align: center; | ||||
|         display: inline-block; | ||||
|         padding: 0.4rem 0.5rem; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|  | ||||
| @@ -78,61 +92,62 @@ import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons.vue"; | ||||
| import PersonText from "ChillPersonAssets/vuejs/_components/Entity/PersonText.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "Concerned", | ||||
|   components: { | ||||
|     AddPersons, | ||||
|     PersonText, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(["concerned", "household"]), | ||||
|     ...mapGetters(["persons"]), | ||||
|     noPerson() { | ||||
|       return this.$store.getters.persons.length === 0; | ||||
|     name: "Concerned", | ||||
|     components: { | ||||
|         AddPersons, | ||||
|         PersonText, | ||||
|     }, | ||||
|     concernedPersonsWithHouseholds() { | ||||
|       if (this.$store.state.household) { | ||||
|         return this.$store.state.concerned.filter( | ||||
|           (c) => | ||||
|             c.person.current_household_id !== null && | ||||
|             c.person.current_household_id !== this.$store.state.household.id, | ||||
|         ); | ||||
|       } else { | ||||
|         return []; | ||||
|       } | ||||
|     }, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       addPersons: { | ||||
|         key: "household_members_editor_concerned", | ||||
|         options: { | ||||
|           type: ["person"], | ||||
|           priority: null, | ||||
|           uniq: false, | ||||
|     computed: { | ||||
|         ...mapState(["concerned", "household"]), | ||||
|         ...mapGetters(["persons"]), | ||||
|         noPerson() { | ||||
|             return this.$store.getters.persons.length === 0; | ||||
|         }, | ||||
|         concernedPersonsWithHouseholds() { | ||||
|             if (this.$store.state.household) { | ||||
|                 return this.$store.state.concerned.filter( | ||||
|                     (c) => | ||||
|                         c.person.current_household_id !== null && | ||||
|                         c.person.current_household_id !== | ||||
|                             this.$store.state.household.id, | ||||
|                 ); | ||||
|             } else { | ||||
|                 return []; | ||||
|             } | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   methods: { | ||||
|     addNewPersons({ selected, modal }) { | ||||
|       selected.forEach(function (item) { | ||||
|         this.$store.dispatch("addConcerned", item.result); | ||||
|       }, this); | ||||
|       this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|       modal.showModal = false; | ||||
|     }, | ||||
|     removeConcerned(concerned) { | ||||
|       console.log("removedconcerned", concerned); | ||||
|     data() { | ||||
|         return { | ||||
|             addPersons: { | ||||
|                 key: "household_members_editor_concerned", | ||||
|                 options: { | ||||
|                     type: ["person"], | ||||
|                     priority: null, | ||||
|                     uniq: false, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     methods: { | ||||
|         addNewPersons({ selected, modal }) { | ||||
|             selected.forEach(function (item) { | ||||
|                 this.$store.dispatch("addConcerned", item.result); | ||||
|             }, this); | ||||
|             this.$refs.addPersons.resetSearch(); // to cast child method | ||||
|             modal.showModal = false; | ||||
|         }, | ||||
|         removeConcerned(concerned) { | ||||
|             console.log("removedconcerned", concerned); | ||||
|  | ||||
|       if (!concerned.allowRemove) { | ||||
|         return; | ||||
|       } | ||||
|             if (!concerned.allowRemove) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|       this.$store.dispatch("removePerson", concerned.person); | ||||
|             this.$store.dispatch("removePerson", concerned.person); | ||||
|         }, | ||||
|         makeHouseholdLink(id) { | ||||
|             return `/fr/person/household/${id}/summary`; | ||||
|         }, | ||||
|     }, | ||||
|     makeHouseholdLink(id) { | ||||
|       return `/fr/person/household/${id}/summary`; | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,20 +1,20 @@ | ||||
| <template> | ||||
|   <div v-if="hasWarning" class="alert alert-warning"> | ||||
|     {{ $t("household_members_editor.confirmation.there_are_warnings") }} | ||||
|   </div> | ||||
|     <div v-if="hasWarning" class="alert alert-warning"> | ||||
|         {{ $t("household_members_editor.confirmation.there_are_warnings") }} | ||||
|     </div> | ||||
|  | ||||
|   <p v-if="hasWarning"> | ||||
|     {{ $t("household_members_editor.confirmation.check_those_items") }} | ||||
|   </p> | ||||
|     <p v-if="hasWarning"> | ||||
|         {{ $t("household_members_editor.confirmation.check_those_items") }} | ||||
|     </p> | ||||
|  | ||||
|   <ul> | ||||
|     <li v-for="(msg, i) in warnings" class="warning" :key="i"> | ||||
|       {{ $t(msg.m, msg.a) }} | ||||
|     </li> | ||||
|     <li v-for="(msg, i) in errors" class="error" :key="i"> | ||||
|       {{ msg }} | ||||
|     </li> | ||||
|   </ul> | ||||
|     <ul> | ||||
|         <li v-for="(msg, i) in warnings" class="warning" :key="i"> | ||||
|             {{ $t(msg.m, msg.a) }} | ||||
|         </li> | ||||
|         <li v-for="(msg, i) in errors" class="error" :key="i"> | ||||
|             {{ msg }} | ||||
|         </li> | ||||
|     </ul> | ||||
| </template> | ||||
|  | ||||
| <style scoped lang="scss"></style> | ||||
| @@ -23,14 +23,14 @@ | ||||
| import { mapState } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "Confirmation", | ||||
|   computed: { | ||||
|     ...mapState({ | ||||
|       hasWarnings: (state) => | ||||
|         state.warnings.length > 0 || state.errors.length > 0, | ||||
|       warnings: (state) => state.warnings, | ||||
|       errors: (state) => state.errors, | ||||
|     }), | ||||
|   }, | ||||
|     name: "Confirmation", | ||||
|     computed: { | ||||
|         ...mapState({ | ||||
|             hasWarnings: (state) => | ||||
|                 state.warnings.length > 0 || state.errors.length > 0, | ||||
|             warnings: (state) => state.warnings, | ||||
|             errors: (state) => state.errors, | ||||
|         }), | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,35 +1,37 @@ | ||||
| <template> | ||||
|   <div class="flex-table mb-5" v-if="hasHousehold"> | ||||
|     <div class="item-bloc"> | ||||
|       <household-render-box :household="fakeHouseholdWithConcerned" /> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div class="flex-table" v-if="isModeLeave"> | ||||
|     <div class="item-bloc"> | ||||
|       <section> | ||||
|         <div class="item-row"> | ||||
|           <div class="item-col"> | ||||
|             <div class="h4"> | ||||
|               <span class="fa-stack fa-lg"> | ||||
|                 <i class="fa fa-home fa-stack-1x" /> | ||||
|                 <i class="fa fa-ban fa-stack-2x text-danger" /> | ||||
|               </span> | ||||
|               {{ | ||||
|                 $t("household_members_editor.household.leave_without_household") | ||||
|               }} | ||||
|             </div> | ||||
|           </div> | ||||
|     <div class="flex-table mb-5" v-if="hasHousehold"> | ||||
|         <div class="item-bloc"> | ||||
|             <household-render-box :household="fakeHouseholdWithConcerned" /> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="flex-table" v-if="isModeLeave"> | ||||
|         <div class="item-bloc"> | ||||
|             <section> | ||||
|                 <div class="item-row"> | ||||
|                     <div class="item-col"> | ||||
|                         <div class="h4"> | ||||
|                             <span class="fa-stack fa-lg"> | ||||
|                                 <i class="fa fa-home fa-stack-1x" /> | ||||
|                                 <i class="fa fa-ban fa-stack-2x text-danger" /> | ||||
|                             </span> | ||||
|                             {{ | ||||
|                                 $t( | ||||
|                                     "household_members_editor.household.leave_without_household", | ||||
|                                 ) | ||||
|                             }} | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <div class="item-row"> | ||||
|                     {{ | ||||
|                         $t( | ||||
|                             "household_members_editor.household.will_leave_any_household_explanation", | ||||
|                         ) | ||||
|                     }} | ||||
|                 </div> | ||||
|             </section> | ||||
|         </div> | ||||
|         <div class="item-row"> | ||||
|           {{ | ||||
|             $t( | ||||
|               "household_members_editor.household.will_leave_any_household_explanation", | ||||
|             ) | ||||
|           }} | ||||
|         </div> | ||||
|       </section> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -37,17 +39,17 @@ import { mapGetters } from "vuex"; | ||||
| import HouseholdRenderBox from "ChillPersonAssets/vuejs/_components/Entity/HouseholdRenderBox.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "CurrentHousehold", | ||||
|   components: { | ||||
|     HouseholdRenderBox, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapGetters([ | ||||
|       "hasHousehold", | ||||
|       "fakeHouseholdWithConcerned", | ||||
|       "isModeLeave", | ||||
|     ]), | ||||
|   }, | ||||
|     name: "CurrentHousehold", | ||||
|     components: { | ||||
|         HouseholdRenderBox, | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapGetters([ | ||||
|             "hasHousehold", | ||||
|             "fakeHouseholdWithConcerned", | ||||
|             "isModeLeave", | ||||
|         ]), | ||||
|     }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,83 +1,83 @@ | ||||
| <template> | ||||
|   <current-household /> | ||||
|     <current-household /> | ||||
|  | ||||
|   <h2>{{ $t("household_members_editor.dates.dates_title") }}</h2> | ||||
|     <h2>{{ $t("household_members_editor.dates.dates_title") }}</h2> | ||||
|  | ||||
|   <div class="mb-3 row"> | ||||
|     <label for="start_date" class="col-form-label col-sm-4 required"> | ||||
|       {{ $t("household_members_editor.dates.start_date") }} | ||||
|     </label> | ||||
|     <div class="col-sm-8"> | ||||
|       <input type="date" v-model="startDate" class="form-control" /> | ||||
|     </div> | ||||
|   </div> | ||||
|  | ||||
|   <div v-if="this.isHouseholdNew"> | ||||
|     <h2>{{ $t("household_members_editor.composition.composition") }}</h2> | ||||
|     <div class="mb-3 row"> | ||||
|       <label class="col-form-label col-sm-4 required">{{ | ||||
|         $t("household_members_editor.composition.household_composition") | ||||
|       }}</label> | ||||
|       <div class="col-sm-8"> | ||||
|         <select | ||||
|           v-model="householdCompositionType" | ||||
|           class="form-select form-control" | ||||
|         > | ||||
|           <option | ||||
|             v-for="t in householdCompositionTypes" | ||||
|             :key="t.id" | ||||
|             :value="t.id" | ||||
|           > | ||||
|             {{ localizeString(t.label) }} | ||||
|           </option> | ||||
|         </select> | ||||
|       </div> | ||||
|         <label for="start_date" class="col-form-label col-sm-4 required"> | ||||
|             {{ $t("household_members_editor.dates.start_date") }} | ||||
|         </label> | ||||
|         <div class="col-sm-8"> | ||||
|             <input type="date" v-model="startDate" class="form-control" /> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="mb-3 row"> | ||||
|       <label class="col-form-label col-sm-4 required">{{ | ||||
|         $t("household_members_editor.composition.number_of_children") | ||||
|       }}</label> | ||||
|       <div class="col-sm-8"> | ||||
|         <input | ||||
|           type="number" | ||||
|           v-model="numberOfChildren" | ||||
|           min="0" | ||||
|           max="30" | ||||
|           class="form-control" | ||||
|         /> | ||||
|       </div> | ||||
|  | ||||
|     <div v-if="this.isHouseholdNew"> | ||||
|         <h2>{{ $t("household_members_editor.composition.composition") }}</h2> | ||||
|         <div class="mb-3 row"> | ||||
|             <label class="col-form-label col-sm-4 required">{{ | ||||
|                 $t("household_members_editor.composition.household_composition") | ||||
|             }}</label> | ||||
|             <div class="col-sm-8"> | ||||
|                 <select | ||||
|                     v-model="householdCompositionType" | ||||
|                     class="form-select form-control" | ||||
|                 > | ||||
|                     <option | ||||
|                         v-for="t in householdCompositionTypes" | ||||
|                         :key="t.id" | ||||
|                         :value="t.id" | ||||
|                     > | ||||
|                         {{ localizeString(t.label) }} | ||||
|                     </option> | ||||
|                 </select> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="mb-3 row"> | ||||
|             <label class="col-form-label col-sm-4 required">{{ | ||||
|                 $t("household_members_editor.composition.number_of_children") | ||||
|             }}</label> | ||||
|             <div class="col-sm-8"> | ||||
|                 <input | ||||
|                     type="number" | ||||
|                     v-model="numberOfChildren" | ||||
|                     min="0" | ||||
|                     max="30" | ||||
|                     class="form-control" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div v-if="this.displayDependents" class="mb-3 row"> | ||||
|             <label class="col-form-label col-sm-4 required">{{ | ||||
|                 $t("household_members_editor.composition.number_of_dependents") | ||||
|             }}</label> | ||||
|             <div class="col-sm-8"> | ||||
|                 <input | ||||
|                     type="number" | ||||
|                     v-model="numberOfDependents" | ||||
|                     min="0" | ||||
|                     max="30" | ||||
|                     class="form-control" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div v-if="this.displayDependents" class="mb-3 row"> | ||||
|             <label class="col-form-label col-sm-4 required">{{ | ||||
|                 $t( | ||||
|                     "household_members_editor.composition.number_of_dependents_with_disabilities", | ||||
|                 ) | ||||
|             }}</label> | ||||
|             <div class="col-sm-8"> | ||||
|                 <input | ||||
|                     type="number" | ||||
|                     v-model="numberOfDependentsWithDisabilities" | ||||
|                     min="0" | ||||
|                     max="30" | ||||
|                     class="form-control" | ||||
|                 /> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div v-if="this.displayDependents" class="mb-3 row"> | ||||
|       <label class="col-form-label col-sm-4 required">{{ | ||||
|         $t("household_members_editor.composition.number_of_dependents") | ||||
|       }}</label> | ||||
|       <div class="col-sm-8"> | ||||
|         <input | ||||
|           type="number" | ||||
|           v-model="numberOfDependents" | ||||
|           min="0" | ||||
|           max="30" | ||||
|           class="form-control" | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div v-if="this.displayDependents" class="mb-3 row"> | ||||
|       <label class="col-form-label col-sm-4 required">{{ | ||||
|         $t( | ||||
|           "household_members_editor.composition.number_of_dependents_with_disabilities", | ||||
|         ) | ||||
|       }}</label> | ||||
|       <div class="col-sm-8"> | ||||
|         <input | ||||
|           type="number" | ||||
|           v-model="numberOfDependentsWithDisabilities" | ||||
|           min="0" | ||||
|           max="30" | ||||
|           class="form-control" | ||||
|         /> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -86,71 +86,74 @@ import { mapGetters, mapState } from "vuex"; | ||||
| import { localizeString } from "ChillMainAssets/lib/localizationHelper/localizationHelper"; | ||||
|  | ||||
| export default { | ||||
|   name: "Dates", | ||||
|   methods: { localizeString }, | ||||
|   components: { | ||||
|     CurrentHousehold, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(["householdCompositionTypes"]), | ||||
|     ...mapGetters(["isHouseholdNew"]), | ||||
|     displayDependents: { | ||||
|       get() { | ||||
|         return window.household_members_editor_data.displayDependents; | ||||
|       }, | ||||
|     name: "Dates", | ||||
|     methods: { localizeString }, | ||||
|     components: { | ||||
|         CurrentHousehold, | ||||
|     }, | ||||
|     householdCompositionType: { | ||||
|       get() { | ||||
|         if (this.$store.state.householdCompositionType !== null) { | ||||
|           return this.$store.state.householdCompositionType.id; | ||||
|         } | ||||
|         return null; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.dispatch("setHouseholdCompositionType", value); | ||||
|       }, | ||||
|     }, | ||||
|     numberOfChildren: { | ||||
|       get() { | ||||
|         return this.$store.state.numberOfChildren; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setNumberOfChildren", value); | ||||
|       }, | ||||
|     }, | ||||
|     numberOfDependents: { | ||||
|       get() { | ||||
|         return this.$store.state.numberOfDependents; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setNumberOfDependents", value); | ||||
|       }, | ||||
|     }, | ||||
|     numberOfDependentsWithDisabilities: { | ||||
|       get() { | ||||
|         return this.$store.state.numberOfDependentsWithDisabilities; | ||||
|       }, | ||||
|       set(value) { | ||||
|         this.$store.commit("setNumberOfDependentsWithDisabilities", value); | ||||
|       }, | ||||
|     }, | ||||
|     startDate: { | ||||
|       get() { | ||||
|         return this.$store.state.startDate; | ||||
|         // return [ | ||||
|         //   this.$store.state.startDate.getFullYear(), | ||||
|         //   (this.$store.state.startDate.getMonth() + 1).toString().padStart(2, '0'), | ||||
|         //   this.$store.state.startDate.getDate().toString().padStart(2, '0') | ||||
|         // ].join('-'); | ||||
|       }, | ||||
|       set(value) { | ||||
|         // let | ||||
|         //   [year, month, day] = value.split('-'), | ||||
|         //     dValue = new Date(year, month-1, day); | ||||
|     computed: { | ||||
|         ...mapState(["householdCompositionTypes"]), | ||||
|         ...mapGetters(["isHouseholdNew"]), | ||||
|         displayDependents: { | ||||
|             get() { | ||||
|                 return window.household_members_editor_data.displayDependents; | ||||
|             }, | ||||
|         }, | ||||
|         householdCompositionType: { | ||||
|             get() { | ||||
|                 if (this.$store.state.householdCompositionType !== null) { | ||||
|                     return this.$store.state.householdCompositionType.id; | ||||
|                 } | ||||
|                 return null; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.dispatch("setHouseholdCompositionType", value); | ||||
|             }, | ||||
|         }, | ||||
|         numberOfChildren: { | ||||
|             get() { | ||||
|                 return this.$store.state.numberOfChildren; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit("setNumberOfChildren", value); | ||||
|             }, | ||||
|         }, | ||||
|         numberOfDependents: { | ||||
|             get() { | ||||
|                 return this.$store.state.numberOfDependents; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit("setNumberOfDependents", value); | ||||
|             }, | ||||
|         }, | ||||
|         numberOfDependentsWithDisabilities: { | ||||
|             get() { | ||||
|                 return this.$store.state.numberOfDependentsWithDisabilities; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 this.$store.commit( | ||||
|                     "setNumberOfDependentsWithDisabilities", | ||||
|                     value, | ||||
|                 ); | ||||
|             }, | ||||
|         }, | ||||
|         startDate: { | ||||
|             get() { | ||||
|                 return this.$store.state.startDate; | ||||
|                 // return [ | ||||
|                 //   this.$store.state.startDate.getFullYear(), | ||||
|                 //   (this.$store.state.startDate.getMonth() + 1).toString().padStart(2, '0'), | ||||
|                 //   this.$store.state.startDate.getDate().toString().padStart(2, '0') | ||||
|                 // ].join('-'); | ||||
|             }, | ||||
|             set(value) { | ||||
|                 // let | ||||
|                 //   [year, month, day] = value.split('-'), | ||||
|                 //     dValue = new Date(year, month-1, day); | ||||
|  | ||||
|         this.$store.dispatch("setStartDate", value); | ||||
|       }, | ||||
|                 this.$store.dispatch("setStartDate", value); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,116 +1,130 @@ | ||||
| <template> | ||||
|   <h2 class="mt-4"> | ||||
|     {{ $t("household_members_editor.household_part") }} | ||||
|   </h2> | ||||
|     <h2 class="mt-4"> | ||||
|         {{ $t("household_members_editor.household_part") }} | ||||
|     </h2> | ||||
|  | ||||
|   <div class="alert alert-info" v-if="!hasHousehold"> | ||||
|     {{ $t("household_members_editor.household.no_household_choose_one") }} | ||||
|   </div> | ||||
|   <template v-else> | ||||
|     <current-household /> | ||||
|   </template> | ||||
|  | ||||
|   <div v-if="hasHouseholdSuggestion" class="householdSuggestions my-5"> | ||||
|     <h4 class="mb-3"> | ||||
|       {{ $t("household_members_editor.household.household_suggested") }} | ||||
|     </h4> | ||||
|     <p> | ||||
|       {{ | ||||
|         $t("household_members_editor.household.household_suggested_explanation") | ||||
|       }} | ||||
|     </p> | ||||
|     <div class="accordion" id="householdSuggestions"> | ||||
|       <div class="accordion-item"> | ||||
|         <h2 class="accordion-header" id="heading_household_suggestions"> | ||||
|           <button | ||||
|             v-if="!showHouseholdSuggestion" | ||||
|             class="accordion-button collapsed" | ||||
|             type="button" | ||||
|             data-bs-toggle="collapse" | ||||
|             aria-expanded="false" | ||||
|             @click="toggleHouseholdSuggestion" | ||||
|           > | ||||
|             {{ | ||||
|               $tc( | ||||
|                 "household_members_editor.show_household_suggestion", | ||||
|                 countHouseholdSuggestion, | ||||
|               ) | ||||
|             }} | ||||
|           </button> | ||||
|           <button | ||||
|             v-if="showHouseholdSuggestion" | ||||
|             class="accordion-button" | ||||
|             type="button" | ||||
|             data-bs-toggle="collapse" | ||||
|             aria-expanded="true" | ||||
|             @click="toggleHouseholdSuggestion" | ||||
|           > | ||||
|             {{ $t("household_members_editor.hide_household_suggestion") }} | ||||
|           </button> | ||||
|           <!-- disabled bootstrap behaviour:  data-bs-target="#collapse_household_suggestions" aria-controls="collapse_household_suggestions" --> | ||||
|         </h2> | ||||
|         <div | ||||
|           class="accordion-collapse" | ||||
|           id="collapse_household_suggestions" | ||||
|           aria-labelledby="heading_household_suggestions" | ||||
|           data-bs-parent="#householdSuggestions" | ||||
|         > | ||||
|           <div v-if="showHouseholdSuggestion"> | ||||
|             <div class="flex-table householdSuggestionList"> | ||||
|               <div | ||||
|                 v-for="(s, i) in getSuggestions" | ||||
|                 class="item-bloc" | ||||
|                 :key="`householdSuggestions-${i}`" | ||||
|               > | ||||
|                 <household-render-box :household="s.household" /> | ||||
|                 <ul class="record_actions"> | ||||
|                   <li> | ||||
|                     <button | ||||
|                       class="btn btn-sm btn-choose" | ||||
|                       @click="selectHousehold(s.household)" | ||||
|                     > | ||||
|                       {{ $t("household_members_editor.select_household") }} | ||||
|                     </button> | ||||
|                   </li> | ||||
|                 </ul> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     <div class="alert alert-info" v-if="!hasHousehold"> | ||||
|         {{ $t("household_members_editor.household.no_household_choose_one") }} | ||||
|     </div> | ||||
|   </div> | ||||
|     <template v-else> | ||||
|         <current-household /> | ||||
|     </template> | ||||
|  | ||||
|   <ul class="record_actions"> | ||||
|     <li v-if="hasHousehold"> | ||||
|       <button @click="resetMode" class="btn btn-sm btn-misc"> | ||||
|         {{ $t("household_members_editor.household.reset_mode") }} | ||||
|       </button> | ||||
|     </li> | ||||
|     <li v-if="!hasHousehold" class="add-persons"> | ||||
|       <add-persons | ||||
|         modal-title="Chercher un ménage existant" | ||||
|         button-title="Chercher un ménage existant" | ||||
|         :key="addPersons.key" | ||||
|         :options="addPersons.options" | ||||
|         @add-new-persons="pickHouseholdFound" | ||||
|         ref="pickHousehold" | ||||
|       > | ||||
|         <!-- to cast child method --> | ||||
|       </add-persons> | ||||
|     </li> | ||||
|     <li v-if="!hasHousehold"> | ||||
|       <button @click="setModeNew" class="btn btn-sm btn-create"> | ||||
|         {{ $t("household_members_editor.household.create_household") }} | ||||
|       </button> | ||||
|     </li> | ||||
|     <li v-if="isModeLeaveAllowed && !hasHousehold"> | ||||
|       <button @click="setModeLeave" class="btn btn-sm btn-misc"> | ||||
|         <i class="fa fa-sign-out" /> | ||||
|         {{ $t("household_members_editor.household.leave") }} | ||||
|       </button> | ||||
|     </li> | ||||
|   </ul> | ||||
|     <div v-if="hasHouseholdSuggestion" class="householdSuggestions my-5"> | ||||
|         <h4 class="mb-3"> | ||||
|             {{ $t("household_members_editor.household.household_suggested") }} | ||||
|         </h4> | ||||
|         <p> | ||||
|             {{ | ||||
|                 $t( | ||||
|                     "household_members_editor.household.household_suggested_explanation", | ||||
|                 ) | ||||
|             }} | ||||
|         </p> | ||||
|         <div class="accordion" id="householdSuggestions"> | ||||
|             <div class="accordion-item"> | ||||
|                 <h2 class="accordion-header" id="heading_household_suggestions"> | ||||
|                     <button | ||||
|                         v-if="!showHouseholdSuggestion" | ||||
|                         class="accordion-button collapsed" | ||||
|                         type="button" | ||||
|                         data-bs-toggle="collapse" | ||||
|                         aria-expanded="false" | ||||
|                         @click="toggleHouseholdSuggestion" | ||||
|                     > | ||||
|                         {{ | ||||
|                             $tc( | ||||
|                                 "household_members_editor.show_household_suggestion", | ||||
|                                 countHouseholdSuggestion, | ||||
|                             ) | ||||
|                         }} | ||||
|                     </button> | ||||
|                     <button | ||||
|                         v-if="showHouseholdSuggestion" | ||||
|                         class="accordion-button" | ||||
|                         type="button" | ||||
|                         data-bs-toggle="collapse" | ||||
|                         aria-expanded="true" | ||||
|                         @click="toggleHouseholdSuggestion" | ||||
|                     > | ||||
|                         {{ | ||||
|                             $t( | ||||
|                                 "household_members_editor.hide_household_suggestion", | ||||
|                             ) | ||||
|                         }} | ||||
|                     </button> | ||||
|                     <!-- disabled bootstrap behaviour:  data-bs-target="#collapse_household_suggestions" aria-controls="collapse_household_suggestions" --> | ||||
|                 </h2> | ||||
|                 <div | ||||
|                     class="accordion-collapse" | ||||
|                     id="collapse_household_suggestions" | ||||
|                     aria-labelledby="heading_household_suggestions" | ||||
|                     data-bs-parent="#householdSuggestions" | ||||
|                 > | ||||
|                     <div v-if="showHouseholdSuggestion"> | ||||
|                         <div class="flex-table householdSuggestionList"> | ||||
|                             <div | ||||
|                                 v-for="(s, i) in getSuggestions" | ||||
|                                 class="item-bloc" | ||||
|                                 :key="`householdSuggestions-${i}`" | ||||
|                             > | ||||
|                                 <household-render-box | ||||
|                                     :household="s.household" | ||||
|                                 /> | ||||
|                                 <ul class="record_actions"> | ||||
|                                     <li> | ||||
|                                         <button | ||||
|                                             class="btn btn-sm btn-choose" | ||||
|                                             @click=" | ||||
|                                                 selectHousehold(s.household) | ||||
|                                             " | ||||
|                                         > | ||||
|                                             {{ | ||||
|                                                 $t( | ||||
|                                                     "household_members_editor.select_household", | ||||
|                                                 ) | ||||
|                                             }} | ||||
|                                         </button> | ||||
|                                     </li> | ||||
|                                 </ul> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|  | ||||
|     <ul class="record_actions"> | ||||
|         <li v-if="hasHousehold"> | ||||
|             <button @click="resetMode" class="btn btn-sm btn-misc"> | ||||
|                 {{ $t("household_members_editor.household.reset_mode") }} | ||||
|             </button> | ||||
|         </li> | ||||
|         <li v-if="!hasHousehold" class="add-persons"> | ||||
|             <add-persons | ||||
|                 modal-title="Chercher un ménage existant" | ||||
|                 button-title="Chercher un ménage existant" | ||||
|                 :key="addPersons.key" | ||||
|                 :options="addPersons.options" | ||||
|                 @add-new-persons="pickHouseholdFound" | ||||
|                 ref="pickHousehold" | ||||
|             > | ||||
|                 <!-- to cast child method --> | ||||
|             </add-persons> | ||||
|         </li> | ||||
|         <li v-if="!hasHousehold"> | ||||
|             <button @click="setModeNew" class="btn btn-sm btn-create"> | ||||
|                 {{ $t("household_members_editor.household.create_household") }} | ||||
|             </button> | ||||
|         </li> | ||||
|         <li v-if="isModeLeaveAllowed && !hasHousehold"> | ||||
|             <button @click="setModeLeave" class="btn btn-sm btn-misc"> | ||||
|                 <i class="fa fa-sign-out" /> | ||||
|                 {{ $t("household_members_editor.household.leave") }} | ||||
|             </button> | ||||
|         </li> | ||||
|     </ul> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -120,154 +134,156 @@ import CurrentHousehold from "./CurrentHousehold"; | ||||
| import AddPersons from "ChillPersonAssets/vuejs/_components/AddPersons"; | ||||
|  | ||||
| export default { | ||||
|   name: "Household", | ||||
|   components: { | ||||
|     AddPersons, | ||||
|     CurrentHousehold, | ||||
|     HouseholdRenderBox, | ||||
|   }, | ||||
|   emits: ["readyToGo"], | ||||
|   data() { | ||||
|     return { | ||||
|       addPersons: { | ||||
|         key: "household_find", | ||||
|         options: { | ||||
|           type: ["household"], | ||||
|           priority: null, | ||||
|           uniq: true, | ||||
|           button: { | ||||
|             size: "btn-sm", | ||||
|             type: "btn-search", | ||||
|           }, | ||||
|         }, | ||||
|       }, | ||||
|       addAddress: { | ||||
|         key: "household_new", | ||||
|         options: { | ||||
|           useDate: { | ||||
|             validFrom: false, | ||||
|             validTo: false, | ||||
|           }, | ||||
|           onlyButton: true, | ||||
|           button: { | ||||
|             text: { | ||||
|               create: "household_members_editor.household.set_address", | ||||
|               edit: "household_members_editor.household.update_address", | ||||
|     name: "Household", | ||||
|     components: { | ||||
|         AddPersons, | ||||
|         CurrentHousehold, | ||||
|         HouseholdRenderBox, | ||||
|     }, | ||||
|     emits: ["readyToGo"], | ||||
|     data() { | ||||
|         return { | ||||
|             addPersons: { | ||||
|                 key: "household_find", | ||||
|                 options: { | ||||
|                     type: ["household"], | ||||
|                     priority: null, | ||||
|                     uniq: true, | ||||
|                     button: { | ||||
|                         size: "btn-sm", | ||||
|                         type: "btn-search", | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|           }, | ||||
|           title: { | ||||
|             create: "household_members_editor.household.create_new_address", | ||||
|             edit: "household_members_editor.household.update_address_title", | ||||
|           }, | ||||
|             addAddress: { | ||||
|                 key: "household_new", | ||||
|                 options: { | ||||
|                     useDate: { | ||||
|                         validFrom: false, | ||||
|                         validTo: false, | ||||
|                     }, | ||||
|                     onlyButton: true, | ||||
|                     button: { | ||||
|                         text: { | ||||
|                             create: "household_members_editor.household.set_address", | ||||
|                             edit: "household_members_editor.household.update_address", | ||||
|                         }, | ||||
|                     }, | ||||
|                     title: { | ||||
|                         create: "household_members_editor.household.create_new_address", | ||||
|                         edit: "household_members_editor.household.update_address_title", | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapGetters([ | ||||
|             "isModeNewAllowed", | ||||
|             "isModeLeaveAllowed", | ||||
|             "getSuggestions", | ||||
|             "hasHousehold", | ||||
|             "isHouseholdNew", | ||||
|             "hasHouseholdSuggestion", | ||||
|             "countHouseholdSuggestion", | ||||
|             "filterHouseholdSuggestionByAccompanyingPeriod", | ||||
|             "hasAddressSuggestion", | ||||
|             "countAddressSuggestion", | ||||
|             "filterAddressesSuggestion", | ||||
|             "hasHouseholdAddress", | ||||
|             "isModeLeave", | ||||
|             "getAddressContext", | ||||
|         ]), | ||||
|         ...mapState([ | ||||
|             "household", | ||||
|             "showHouseholdSuggestion", | ||||
|             "showAddressSuggestion", | ||||
|             "mode", | ||||
|         ]), | ||||
|         household() { | ||||
|             return this.$store.state.household; | ||||
|         }, | ||||
|         allowHouseholdSearch() { | ||||
|             return false; | ||||
|             return ( | ||||
|                 this.$store.state.allowHouseholdSearch && | ||||
|                 !this.$store.getters.hasHousehold | ||||
|             ); | ||||
|         }, | ||||
|         isHouseholdNewDesactivated() { | ||||
|             return ( | ||||
|                 this.$store.state.mode !== null && | ||||
|                 !this.$store.getters.isHouseholdNew | ||||
|             ); | ||||
|         }, | ||||
|         isHouseholdLeaveDesactivated() { | ||||
|             return ( | ||||
|                 this.$store.state.mode !== null && | ||||
|                 this.$store.state.mode !== "leave" | ||||
|             ); | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapGetters([ | ||||
|       "isModeNewAllowed", | ||||
|       "isModeLeaveAllowed", | ||||
|       "getSuggestions", | ||||
|       "hasHousehold", | ||||
|       "isHouseholdNew", | ||||
|       "hasHouseholdSuggestion", | ||||
|       "countHouseholdSuggestion", | ||||
|       "filterHouseholdSuggestionByAccompanyingPeriod", | ||||
|       "hasAddressSuggestion", | ||||
|       "countAddressSuggestion", | ||||
|       "filterAddressesSuggestion", | ||||
|       "hasHouseholdAddress", | ||||
|       "isModeLeave", | ||||
|       "getAddressContext", | ||||
|     ]), | ||||
|     ...mapState([ | ||||
|       "household", | ||||
|       "showHouseholdSuggestion", | ||||
|       "showAddressSuggestion", | ||||
|       "mode", | ||||
|     ]), | ||||
|     household() { | ||||
|       return this.$store.state.household; | ||||
|     }, | ||||
|     allowHouseholdSearch() { | ||||
|       return false; | ||||
|       return ( | ||||
|         this.$store.state.allowHouseholdSearch && | ||||
|         !this.$store.getters.hasHousehold | ||||
|       ); | ||||
|     methods: { | ||||
|         setModeNew() { | ||||
|             this.$store.dispatch("createHousehold"); | ||||
|             this.$emit("readyToGo"); | ||||
|         }, | ||||
|         setModeLeave() { | ||||
|             this.$store.dispatch("forceLeaveWithoutHousehold"); | ||||
|             this.$emit("readyToGo"); | ||||
|         }, | ||||
|         resetMode() { | ||||
|             this.$store.commit("resetMode"); | ||||
|         }, | ||||
|         addressChanged(payload) { | ||||
|             console.log("addressChanged", payload); | ||||
|             this.$store.dispatch("setHouseholdNewAddress", payload.address); | ||||
|         }, | ||||
|         selectHousehold(h) { | ||||
|             this.$store.dispatch("selectHousehold", h); | ||||
|             this.$emit("readyToGo"); | ||||
|         }, | ||||
|         pickHouseholdFound({ selected, modal }) { | ||||
|             selected.forEach(function (item) { | ||||
|                 this.selectHousehold(item.result); | ||||
|             }, this); | ||||
|             this.$refs.pickHousehold.resetSearch(); // to cast child method | ||||
|             modal.showModal = false; | ||||
|         }, | ||||
|         removeHouseholdAddress() { | ||||
|             this.$store.commit("removeHouseholdAddress"); | ||||
|         }, | ||||
|         toggleHouseholdSuggestion() { | ||||
|             this.$store.commit("toggleHouseholdSuggestion"); | ||||
|         }, | ||||
|     }, | ||||
|     isHouseholdNewDesactivated() { | ||||
|       return ( | ||||
|         this.$store.state.mode !== null && !this.$store.getters.isHouseholdNew | ||||
|       ); | ||||
|     }, | ||||
|     isHouseholdLeaveDesactivated() { | ||||
|       return ( | ||||
|         this.$store.state.mode !== null && this.$store.state.mode !== "leave" | ||||
|       ); | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     setModeNew() { | ||||
|       this.$store.dispatch("createHousehold"); | ||||
|       this.$emit("readyToGo"); | ||||
|     }, | ||||
|     setModeLeave() { | ||||
|       this.$store.dispatch("forceLeaveWithoutHousehold"); | ||||
|       this.$emit("readyToGo"); | ||||
|     }, | ||||
|     resetMode() { | ||||
|       this.$store.commit("resetMode"); | ||||
|     }, | ||||
|     addressChanged(payload) { | ||||
|       console.log("addressChanged", payload); | ||||
|       this.$store.dispatch("setHouseholdNewAddress", payload.address); | ||||
|     }, | ||||
|     selectHousehold(h) { | ||||
|       this.$store.dispatch("selectHousehold", h); | ||||
|       this.$emit("readyToGo"); | ||||
|     }, | ||||
|     pickHouseholdFound({ selected, modal }) { | ||||
|       selected.forEach(function (item) { | ||||
|         this.selectHousehold(item.result); | ||||
|       }, this); | ||||
|       this.$refs.pickHousehold.resetSearch(); // to cast child method | ||||
|       modal.showModal = false; | ||||
|     }, | ||||
|     removeHouseholdAddress() { | ||||
|       this.$store.commit("removeHouseholdAddress"); | ||||
|     }, | ||||
|     toggleHouseholdSuggestion() { | ||||
|       this.$store.commit("toggleHouseholdSuggestion"); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .filtered { | ||||
|   filter: grayscale(1) opacity(0.6); | ||||
|     filter: grayscale(1) opacity(0.6); | ||||
| } | ||||
|  | ||||
| .filteredButActive { | ||||
|   filter: grayscale(1) opacity(0.6); | ||||
|   &:hover { | ||||
|     filter: unset; | ||||
|   } | ||||
|     filter: grayscale(1) opacity(0.6); | ||||
|     &:hover { | ||||
|         filter: unset; | ||||
|     } | ||||
| } | ||||
|  | ||||
| div#household_members_editor div, | ||||
| div.householdSuggestionList { | ||||
|   &.flex-table { | ||||
|     margin: 0; | ||||
|     div.item-bloc div.item-row div.item-col { | ||||
|       &:first-child { | ||||
|         width: 25%; | ||||
|       } | ||||
|       &:last-child { | ||||
|         display: initial; | ||||
|       } | ||||
|     &.flex-table { | ||||
|         margin: 0; | ||||
|         div.item-bloc div.item-row div.item-col { | ||||
|             &:first-child { | ||||
|                 width: 25%; | ||||
|             } | ||||
|             &:last-child { | ||||
|                 display: initial; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   } | ||||
| } | ||||
| </style> | ||||
|   | ||||
| @@ -1,26 +1,30 @@ | ||||
| <template> | ||||
|   <current-household /> | ||||
|     <current-household /> | ||||
|  | ||||
|   <ul class="record_actions"> | ||||
|     <!-- <li v-if="!hasHouseholdAddress && !isHouseholdForceAddress"> | ||||
|     <ul class="record_actions"> | ||||
|         <!-- <li v-if="!hasHouseholdAddress && !isHouseholdForceAddress"> | ||||
|       <button class="btn btn-misc" @click="markNoAddress"> | ||||
|         {{ $t('household_members_editor.household_address.mark_no_address') }} | ||||
|       </button> | ||||
|     </li> --> | ||||
|     <li v-if="!hasHouseholdAddress"> | ||||
|       <add-address | ||||
|         :context="getAddressContext" | ||||
|         :key="addAddress.key" | ||||
|         :options="addAddress.options" | ||||
|         :address-changed-callback="addressChanged" | ||||
|       /> | ||||
|     </li> | ||||
|     <li v-if="hasHouseholdAddress"> | ||||
|       <button class="btn btn-remove" @click="removeHouseholdAddress"> | ||||
|         {{ $t("household_members_editor.household_address.remove_address") }} | ||||
|       </button> | ||||
|     </li> | ||||
|   </ul> | ||||
|         <li v-if="!hasHouseholdAddress"> | ||||
|             <add-address | ||||
|                 :context="getAddressContext" | ||||
|                 :key="addAddress.key" | ||||
|                 :options="addAddress.options" | ||||
|                 :address-changed-callback="addressChanged" | ||||
|             /> | ||||
|         </li> | ||||
|         <li v-if="hasHouseholdAddress"> | ||||
|             <button class="btn btn-remove" @click="removeHouseholdAddress"> | ||||
|                 {{ | ||||
|                     $t( | ||||
|                         "household_members_editor.household_address.remove_address", | ||||
|                     ) | ||||
|                 }} | ||||
|             </button> | ||||
|         </li> | ||||
|     </ul> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -29,56 +33,55 @@ import CurrentHousehold from "./CurrentHousehold"; | ||||
| import { mapGetters } from "vuex"; | ||||
|  | ||||
| export default { | ||||
|   name: "HouseholdAddress.vue", | ||||
|   components: { | ||||
|     CurrentHousehold, | ||||
|     AddAddress, | ||||
|   }, | ||||
|   data() { | ||||
|     return { | ||||
|       addAddress: { | ||||
|         key: "household_new", | ||||
|         options: { | ||||
|           useDate: { | ||||
|             validFrom: false, | ||||
|             validTo: false, | ||||
|           }, | ||||
|           onlyButton: true, | ||||
|           button: { | ||||
|             text: { | ||||
|               create: "household_members_editor.household_address.set_address", | ||||
|               edit: "household_members_editor.household_address.update_address", | ||||
|     name: "HouseholdAddress.vue", | ||||
|     components: { | ||||
|         CurrentHousehold, | ||||
|         AddAddress, | ||||
|     }, | ||||
|     data() { | ||||
|         return { | ||||
|             addAddress: { | ||||
|                 key: "household_new", | ||||
|                 options: { | ||||
|                     useDate: { | ||||
|                         validFrom: false, | ||||
|                         validTo: false, | ||||
|                     }, | ||||
|                     onlyButton: true, | ||||
|                     button: { | ||||
|                         text: { | ||||
|                             create: "household_members_editor.household_address.set_address", | ||||
|                             edit: "household_members_editor.household_address.update_address", | ||||
|                         }, | ||||
|                     }, | ||||
|                     title: { | ||||
|                         create: "household_members_editor.household_address.create_new_address", | ||||
|                         edit: "household_members_editor.household_address.update_address_title", | ||||
|                     }, | ||||
|                 }, | ||||
|             }, | ||||
|           }, | ||||
|           title: { | ||||
|             create: | ||||
|               "household_members_editor.household_address.create_new_address", | ||||
|             edit: "household_members_editor.household_address.update_address_title", | ||||
|           }, | ||||
|         }; | ||||
|     }, | ||||
|     computed: { | ||||
|         ...mapGetters([ | ||||
|             "isHouseholdNew", | ||||
|             "hasHouseholdAddress", | ||||
|             "getAddressContext", | ||||
|             "isHouseholdForceNoAddress", | ||||
|         ]), | ||||
|     }, | ||||
|     methods: { | ||||
|         addressChanged(payload) { | ||||
|             console.log("addressChanged", payload); | ||||
|             this.$store.dispatch("setHouseholdNewAddress", payload.address); | ||||
|         }, | ||||
|         markNoAddress() { | ||||
|             this.$store.commit("markHouseholdNoAddress"); | ||||
|         }, | ||||
|         removeHouseholdAddress() { | ||||
|             this.$store.commit("removeHouseholdAddress"); | ||||
|         }, | ||||
|       }, | ||||
|     }; | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapGetters([ | ||||
|       "isHouseholdNew", | ||||
|       "hasHouseholdAddress", | ||||
|       "getAddressContext", | ||||
|       "isHouseholdForceNoAddress", | ||||
|     ]), | ||||
|   }, | ||||
|   methods: { | ||||
|     addressChanged(payload) { | ||||
|       console.log("addressChanged", payload); | ||||
|       this.$store.dispatch("setHouseholdNewAddress", payload.address); | ||||
|     }, | ||||
|     markNoAddress() { | ||||
|       this.$store.commit("markHouseholdNoAddress"); | ||||
|     }, | ||||
|     removeHouseholdAddress() { | ||||
|       this.$store.commit("removeHouseholdAddress"); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,97 +1,104 @@ | ||||
| <template> | ||||
|   <div class="item-bloc"> | ||||
|     <div class="item-row"> | ||||
|       <div class="item-col"> | ||||
|         <div> | ||||
|           <person-render-box | ||||
|             render="badge" | ||||
|             :options="{}" | ||||
|             :person="conc.person" | ||||
|           /> | ||||
|           <span v-if="isHolder" class="badge bg-primary holder"> | ||||
|             {{ $t("household_members_editor.holder") }} | ||||
|           </span> | ||||
|     <div class="item-bloc"> | ||||
|         <div class="item-row"> | ||||
|             <div class="item-col"> | ||||
|                 <div> | ||||
|                     <person-render-box | ||||
|                         render="badge" | ||||
|                         :options="{}" | ||||
|                         :person="conc.person" | ||||
|                     /> | ||||
|                     <span v-if="isHolder" class="badge bg-primary holder"> | ||||
|                         {{ $t("household_members_editor.holder") }} | ||||
|                     </span> | ||||
|                 </div> | ||||
|                 <div v-if="conc.person.birthdate !== null"> | ||||
|                     {{ | ||||
|                         $t("person.born", { | ||||
|                             gender: conc.person.gender.genderTranslation, | ||||
|                         }) | ||||
|                     }} | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="item-col"> | ||||
|                 <ul class="list-content fa-ul"> | ||||
|                     <li> | ||||
|                         <i class="fa fa-li fa-map-marker" /> | ||||
|                         <span class="chill-no-data-statement" | ||||
|                             >Sans adresse</span | ||||
|                         > | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div v-if="conc.person.birthdate !== null"> | ||||
|           {{ | ||||
|             $t("person.born", { gender: conc.person.gender.genderTranslation }) | ||||
|           }} | ||||
|  | ||||
|         <div class="item-row comment"> | ||||
|             <comment-editor v-model="comment" /> | ||||
|         </div> | ||||
|  | ||||
|         <div class="item-row participation-details"> | ||||
|             <div v-if="conc.position.allowHolder" class="action"> | ||||
|                 <button | ||||
|                     class="btn" | ||||
|                     :class="{ | ||||
|                         'btn-primary': isHolder, | ||||
|                         'btn-secondary': !isHolder, | ||||
|                     }" | ||||
|                     @click="toggleHolder" | ||||
|                 > | ||||
|                     {{ | ||||
|                         $t( | ||||
|                             isHolder | ||||
|                                 ? "household_members_editor.is_holder" | ||||
|                                 : "household_members_editor.is_not_holder", | ||||
|                         ) | ||||
|                     }} | ||||
|                 </button> | ||||
|             </div> | ||||
|  | ||||
|             <div> | ||||
|                 <button @click="removePosition" class="btn btn-outline-primary"> | ||||
|                     {{ | ||||
|                         $t("household_members_editor.remove_position", { | ||||
|                             position: conc.position.label.fr, | ||||
|                         }) | ||||
|                     }} | ||||
|                 </button> | ||||
|             </div> | ||||
|  | ||||
|             <div> | ||||
|                 <button | ||||
|                     v-if="conc.allowRemove" | ||||
|                     @click="removeConcerned" | ||||
|                     class="btn btn-primary" | ||||
|                 > | ||||
|                     {{ $t("household_members_editor.remove_concerned") }} | ||||
|                 </button> | ||||
|             </div> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item-col"> | ||||
|         <ul class="list-content fa-ul"> | ||||
|           <li> | ||||
|             <i class="fa fa-li fa-map-marker" /> | ||||
|             <span class="chill-no-data-statement">Sans adresse</span> | ||||
|           </li> | ||||
|         </ul> | ||||
|       </div> | ||||
|     </div> | ||||
|  | ||||
|     <div class="item-row comment"> | ||||
|       <comment-editor v-model="comment" /> | ||||
|     </div> | ||||
|  | ||||
|     <div class="item-row participation-details"> | ||||
|       <div v-if="conc.position.allowHolder" class="action"> | ||||
|         <button | ||||
|           class="btn" | ||||
|           :class="{ 'btn-primary': isHolder, 'btn-secondary': !isHolder }" | ||||
|           @click="toggleHolder" | ||||
|         > | ||||
|           {{ | ||||
|             $t( | ||||
|               isHolder | ||||
|                 ? "household_members_editor.is_holder" | ||||
|                 : "household_members_editor.is_not_holder", | ||||
|             ) | ||||
|           }} | ||||
|         </button> | ||||
|       </div> | ||||
|  | ||||
|       <div> | ||||
|         <button @click="removePosition" class="btn btn-outline-primary"> | ||||
|           {{ | ||||
|             $t("household_members_editor.remove_position", { | ||||
|               position: conc.position.label.fr, | ||||
|             }) | ||||
|           }} | ||||
|         </button> | ||||
|       </div> | ||||
|  | ||||
|       <div> | ||||
|         <button | ||||
|           v-if="conc.allowRemove" | ||||
|           @click="removeConcerned" | ||||
|           class="btn btn-primary" | ||||
|         > | ||||
|           {{ $t("household_members_editor.remove_concerned") }} | ||||
|         </button> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <style scoped lang="scss"> | ||||
| .drag-icon { | ||||
|   height: 1.1em; | ||||
|   margin-right: 0.5em; | ||||
|     height: 1.1em; | ||||
|     margin-right: 0.5em; | ||||
| } | ||||
| div.participation-details { | ||||
|   display: flex; | ||||
|   flex-direction: row !important; | ||||
|   justify-content: flex-end; | ||||
|     display: flex; | ||||
|     flex-direction: row !important; | ||||
|     justify-content: flex-end; | ||||
|  | ||||
|   .action { | ||||
|     align-self: flex-start; | ||||
|     margin-right: auto; | ||||
|   } | ||||
|     .action { | ||||
|         align-self: flex-start; | ||||
|         margin-right: auto; | ||||
|     } | ||||
| } | ||||
|  | ||||
| .holder { | ||||
|   display: inline; | ||||
|   vertical-align: super; | ||||
|   font-size: 0.6em; | ||||
|     display: inline; | ||||
|     vertical-align: super; | ||||
|     font-size: 0.6em; | ||||
| } | ||||
| </style> | ||||
|  | ||||
| @@ -101,41 +108,44 @@ import PersonRenderBox from "ChillPersonAssets/vuejs/_components/Entity/PersonRe | ||||
| import CommentEditor from "ChillMainAssets/vuejs/_components/CommentEditor/CommentEditor.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "MemberDetails", | ||||
|   components: { | ||||
|     PersonRenderBox, | ||||
|     CommentEditor, | ||||
|   }, | ||||
|   props: ["conc"], | ||||
|   computed: { | ||||
|     ...mapGetters(["concByPersonId"]), | ||||
|     classicEditor: () => ClassicEditor, | ||||
|     editorConfig: () => classicEditorConfig, | ||||
|     isHolder() { | ||||
|       return this.conc.holder; | ||||
|     name: "MemberDetails", | ||||
|     components: { | ||||
|         PersonRenderBox, | ||||
|         CommentEditor, | ||||
|     }, | ||||
|     comment: { | ||||
|       get() { | ||||
|         return this.conc.comment; | ||||
|       }, | ||||
|       set(text) { | ||||
|         console.log("set comment"); | ||||
|         console.log("comment", text); | ||||
|     props: ["conc"], | ||||
|     computed: { | ||||
|         ...mapGetters(["concByPersonId"]), | ||||
|         classicEditor: () => ClassicEditor, | ||||
|         editorConfig: () => classicEditorConfig, | ||||
|         isHolder() { | ||||
|             return this.conc.holder; | ||||
|         }, | ||||
|         comment: { | ||||
|             get() { | ||||
|                 return this.conc.comment; | ||||
|             }, | ||||
|             set(text) { | ||||
|                 console.log("set comment"); | ||||
|                 console.log("comment", text); | ||||
|  | ||||
|         this.$store.dispatch("setComment", { conc: this.conc, comment: text }); | ||||
|       }, | ||||
|                 this.$store.dispatch("setComment", { | ||||
|                     conc: this.conc, | ||||
|                     comment: text, | ||||
|                 }); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     toggleHolder() { | ||||
|       this.$store.dispatch("toggleHolder", this.conc); | ||||
|     methods: { | ||||
|         toggleHolder() { | ||||
|             this.$store.dispatch("toggleHolder", this.conc); | ||||
|         }, | ||||
|         removePosition() { | ||||
|             this.$store.dispatch("removePosition", this.conc); | ||||
|         }, | ||||
|         removeConcerned() { | ||||
|             this.$store.dispatch("removeConcerned", this.conc); | ||||
|         }, | ||||
|     }, | ||||
|     removePosition() { | ||||
|       this.$store.dispatch("removePosition", this.conc); | ||||
|     }, | ||||
|     removeConcerned() { | ||||
|       this.$store.dispatch("removeConcerned", this.conc); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|   | ||||
| @@ -1,30 +1,30 @@ | ||||
| <template> | ||||
|   <comment-editor v-model="content" /> | ||||
|     <comment-editor v-model="content" /> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| import CommentEditor from "ChillMainAssets/vuejs/_components/CommentEditor/CommentEditor.vue"; | ||||
|  | ||||
| export default { | ||||
|   name: "PersonComment.vue", | ||||
|   components: { | ||||
|     CommentEditor, | ||||
|   }, | ||||
|   props: ["conc"], | ||||
|   computed: { | ||||
|     content: { | ||||
|       get() { | ||||
|         return this.$props.conc.comment || ""; | ||||
|       }, | ||||
|       set(value) { | ||||
|         console.log("set content", value); | ||||
|         this.$store.commit("setComment", { | ||||
|           conc: this.$props.conc, | ||||
|           comment: value, | ||||
|         }); | ||||
|       }, | ||||
|     name: "PersonComment.vue", | ||||
|     components: { | ||||
|         CommentEditor, | ||||
|     }, | ||||
|     props: ["conc"], | ||||
|     computed: { | ||||
|         content: { | ||||
|             get() { | ||||
|                 return this.$props.conc.comment || ""; | ||||
|             }, | ||||
|             set(value) { | ||||
|                 console.log("set content", value); | ||||
|                 this.$store.commit("setComment", { | ||||
|                     conc: this.$props.conc, | ||||
|                     comment: value, | ||||
|                 }); | ||||
|             }, | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
|   | ||||
| @@ -1,55 +1,57 @@ | ||||
| <template> | ||||
|   <current-household /> | ||||
|     <current-household /> | ||||
|  | ||||
|   <h2> | ||||
|     {{ $t("household_members_editor.positioning.persons_to_positionnate") }} | ||||
|   </h2> | ||||
|     <h2> | ||||
|         {{ $t("household_members_editor.positioning.persons_to_positionnate") }} | ||||
|     </h2> | ||||
|  | ||||
|   <div class="list-household-members flex-table"> | ||||
|     <div v-for="conc in concerned" class="item-bloc" :key="conc.person.id"> | ||||
|       <div class="pick-position item-row"> | ||||
|         <div class="person"> | ||||
|           <!-- <h3>{{ conc.person.text }}</h3> --> | ||||
|           <h3><person-text :person="conc.person" /></h3> | ||||
|     <div class="list-household-members flex-table"> | ||||
|         <div v-for="conc in concerned" class="item-bloc" :key="conc.person.id"> | ||||
|             <div class="pick-position item-row"> | ||||
|                 <div class="person"> | ||||
|                     <!-- <h3>{{ conc.person.text }}</h3> --> | ||||
|                     <h3><person-text :person="conc.person" /></h3> | ||||
|                 </div> | ||||
|                 <div class="holder"> | ||||
|                     <button | ||||
|                         class="btn" | ||||
|                         :disabled="!allowHolderForConcerned(conc)" | ||||
|                         :class="{ | ||||
|                             'btn-outline-chill-green': !conc.holder, | ||||
|                             'btn-chill-green': conc.holder, | ||||
|                         }" | ||||
|                         @click="toggleHolder(conc)" | ||||
|                     > | ||||
|                         {{ $t("household_members_editor.positioning.holder") }} | ||||
|                     </button> | ||||
|                 </div> | ||||
|                 <div | ||||
|                     v-for="(position, i) in positions" | ||||
|                     :key="`position-${i}`" | ||||
|                     class="position" | ||||
|                 > | ||||
|                     <button | ||||
|                         class="btn" | ||||
|                         :class="{ | ||||
|                             'btn-primary': conc.position === position, | ||||
|                             'btn-outline-primary': conc.position !== position, | ||||
|                         }" | ||||
|                         @click="moveToPosition(conc.person.id, position.id)" | ||||
|                     > | ||||
|                         {{ localizeString(position.label) }} | ||||
|                     </button> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="item-row"> | ||||
|                 <div class="col-12"> | ||||
|                     <h6> | ||||
|                         {{ $t("household_members_editor.positioning.comment") }} | ||||
|                     </h6> | ||||
|                     <person-comment :conc="conc" /> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="holder"> | ||||
|           <button | ||||
|             class="btn" | ||||
|             :disabled="!allowHolderForConcerned(conc)" | ||||
|             :class="{ | ||||
|               'btn-outline-chill-green': !conc.holder, | ||||
|               'btn-chill-green': conc.holder, | ||||
|             }" | ||||
|             @click="toggleHolder(conc)" | ||||
|           > | ||||
|             {{ $t("household_members_editor.positioning.holder") }} | ||||
|           </button> | ||||
|         </div> | ||||
|         <div | ||||
|           v-for="(position, i) in positions" | ||||
|           :key="`position-${i}`" | ||||
|           class="position" | ||||
|         > | ||||
|           <button | ||||
|             class="btn" | ||||
|             :class="{ | ||||
|               'btn-primary': conc.position === position, | ||||
|               'btn-outline-primary': conc.position !== position, | ||||
|             }" | ||||
|             @click="moveToPosition(conc.person.id, position.id)" | ||||
|           > | ||||
|             {{ localizeString(position.label) }} | ||||
|           </button> | ||||
|         </div> | ||||
|       </div> | ||||
|       <div class="item-row"> | ||||
|         <div class="col-12"> | ||||
|           <h6>{{ $t("household_members_editor.positioning.comment") }}</h6> | ||||
|           <person-comment :conc="conc" /> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   </div> | ||||
| </template> | ||||
|  | ||||
| <script> | ||||
| @@ -60,61 +62,61 @@ import PersonText from "../../_components/Entity/PersonText.vue"; | ||||
| import { localizeString } from "ChillMainAssets/lib/localizationHelper/localizationHelper"; | ||||
|  | ||||
| export default { | ||||
|   name: "Positioning", | ||||
|   components: { | ||||
|     CurrentHousehold, | ||||
|     PersonComment, | ||||
|     PersonText, | ||||
|   }, | ||||
|   computed: { | ||||
|     ...mapState(["concerned"]), | ||||
|     ...mapGetters([ | ||||
|       "persons", | ||||
|       "concUnpositionned", | ||||
|       "positions", | ||||
|       "concByPosition", | ||||
|     ]), | ||||
|     allPersonsPositionnated() { | ||||
|       return ( | ||||
|         this.$store.getters.persons.length > 0 && | ||||
|         this.$store.getters.concUnpositionned.length === 0 | ||||
|       ); | ||||
|     name: "Positioning", | ||||
|     components: { | ||||
|         CurrentHousehold, | ||||
|         PersonComment, | ||||
|         PersonText, | ||||
|     }, | ||||
|     allowHolderForConcerned: () => (conc) => { | ||||
|       console.log("allow holder for concerned", conc); | ||||
|       if (conc.position === null) { | ||||
|         return false; | ||||
|       } | ||||
|     computed: { | ||||
|         ...mapState(["concerned"]), | ||||
|         ...mapGetters([ | ||||
|             "persons", | ||||
|             "concUnpositionned", | ||||
|             "positions", | ||||
|             "concByPosition", | ||||
|         ]), | ||||
|         allPersonsPositionnated() { | ||||
|             return ( | ||||
|                 this.$store.getters.persons.length > 0 && | ||||
|                 this.$store.getters.concUnpositionned.length === 0 | ||||
|             ); | ||||
|         }, | ||||
|         allowHolderForConcerned: () => (conc) => { | ||||
|             console.log("allow holder for concerned", conc); | ||||
|             if (conc.position === null) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|       return conc.position.allowHolder; | ||||
|             return conc.position.allowHolder; | ||||
|         }, | ||||
|     }, | ||||
|   }, | ||||
|   methods: { | ||||
|     localizeString, | ||||
|     moveToPosition(person_id, position_id) { | ||||
|       this.$store.dispatch("markPosition", { person_id, position_id }); | ||||
|     methods: { | ||||
|         localizeString, | ||||
|         moveToPosition(person_id, position_id) { | ||||
|             this.$store.dispatch("markPosition", { person_id, position_id }); | ||||
|         }, | ||||
|         toggleHolder(conc) { | ||||
|             console.log("toggle holder", conc); | ||||
|             this.$store.dispatch("toggleHolder", conc); | ||||
|         }, | ||||
|     }, | ||||
|     toggleHolder(conc) { | ||||
|       console.log("toggle holder", conc); | ||||
|       this.$store.dispatch("toggleHolder", conc); | ||||
|     }, | ||||
|   }, | ||||
| }; | ||||
| </script> | ||||
|  | ||||
| <style lang="scss" scoped> | ||||
| .pick-position { | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
|   display: flex; | ||||
|   justify-content: flex-end; | ||||
|   align-items: center; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
|     display: flex; | ||||
|     justify-content: flex-end; | ||||
|     align-items: center; | ||||
|  | ||||
|   .person { | ||||
|     margin-right: auto; | ||||
|   } | ||||
|   .holder { | ||||
|     margin-right: 1.2rem; | ||||
|   } | ||||
|     .person { | ||||
|         margin-right: auto; | ||||
|     } | ||||
|     .holder { | ||||
|         margin-right: 1.2rem; | ||||
|     } | ||||
| } | ||||
| </style> | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user