diff --git a/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_address.scss b/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_address.scss index 1ee37632f..afe4e573f 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_address.scss +++ b/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_address.scss @@ -9,6 +9,12 @@ div.chill_address { margin: 0 0 0 1.5em; text-indent: -1.5em; } + + &.chill_address_address--multiline { + p { + display: block; + } + } } } diff --git a/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_record_actions.scss b/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_record_actions.scss index 64ee66077..ccbc5912a 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_record_actions.scss +++ b/src/Bundle/ChillMainBundle/Resources/public/modules/scratch/custom/_record_actions.scss @@ -9,6 +9,11 @@ ul.record_actions li { ul.record_actions, ul.record_actions_column { display: flex; justify-content: flex-end; + + &.record_actions--left { + justify-content: flex-start; + } + padding: 0.5em 0; flex-wrap: wrap-reverse; diff --git a/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss b/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss index 6aa0e1c8d..b91aadb42 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss +++ b/src/Bundle/ChillMainBundle/Resources/public/scss/chillmain.scss @@ -1,12 +1,48 @@ /* * NOTE 2021.04 - * scss/chill.scss is the main sass file for the new chill.2 + * scss/chillmain.scss is the main sass file for the new chill.2 * scratch will be replaced by bootstrap, please avoid to edit in modules/scratch/_custom.scss * - * when possible, try to use bootstrap class naming + * when possible, try to use bootstrap html class */ + +/* [hack] /!\ Contourne le positionnement problématique du div#content_conainter suivant, + * car sa position: relative le place au-dessus du bandeau et les liens sont incliquables */ +div.subheader { + height: 130px; +} + /* + * Specific rules + */ + +// [scratch] un bouton 'disabled' non clickable +.sc-button { + &.disabled { + cursor: default; + &.bt-remove { + background-color: #d9d9d9; + } + } +} + +// [debug] un affichage discret pour le debug +.discret { + color: grey; + margin-right: 1em; +} + +// reserre la hauteur des rangées de tableau (ul.record_actions prennait trop de place) +table { + ul.record_actions { + margin: 0; + padding: 0.5em; + } +} + +/* + * ACCOMPANYING_COURSE * Header custom for Accompanying Course */ @@ -25,7 +61,6 @@ div#header-accompanying_course-name { } } } - div#header-accompanying_course-details { background: none repeat scroll 0 0 #718596ab; color: #FFF; @@ -33,31 +68,158 @@ div#header-accompanying_course-details { padding-bottom: 1em; } -/* /!\ Contourne le positionnement problématique du div#content_conainter suivant, - * car sa position: relative le place au-dessus du bandeau et les liens sont incliquables */ -div.subheader { - height: 130px; +/* +* FLEX RESPONSIVE TABLE/BLOCK PRESENTATION +*/ +div.flex-bloc, +div.flex-table { + h2, h3, h4, dl, p { + margin: 0; + } + h2, h3, h4 { + color: var(--chill-blue); + } } -//// SCRATCH BUTTONS -.sc-button { - &.disabled { - cursor: default; - &.bt-remove { - background-color: #d9d9d9; +/* +* Bloc appearance +*/ +div.flex-bloc { + box-sizing: border-box; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: stretch; + align-content: stretch; + + div.item-bloc { + flex-grow: 0; flex-shrink: 1; flex-basis: 50%; + + margin: 0; + border: 1px solid #000; + padding: 1em; + + border-top: 0; + &:nth-child(1), &:nth-child(2) { + border-top: 1px solid #000; + } + border-left: 0; + &:nth-child(odd) { + border-left: 1px solid #000; + } + + //background-color: #e6e6e6; + display: flex; + flex-direction: column; + + div.item-row { + flex-grow: 1; flex-shrink: 1; flex-basis: auto; + display: flex; + flex-direction: column; + + div.item-col { + &:first-child { + flex-grow: 0; flex-shrink: 0; flex-basis: auto; + } + &:last-child { + flex-grow: 1; flex-shrink: 1; flex-basis: auto; + display: flex; + + .list-content { // ul, dl, or div + } + ul.record_actions { + margin: 0; + align-self: flex-end; + flex-grow: 1; flex-shrink: 0; flex-basis: auto; + li { + margin-right: 5px; + } + } + } + } + } + } + @media only screen and (max-width: 945px) { margin: auto -0.2em; } + @media only screen and (max-width: 935px) { margin: auto -0.5em; } + @media only screen and (max-width: 920px) { margin: auto -0.9em; } + @media only screen and (max-width: 900px) { + flex-direction: column; + margin: auto 0; + div.item-bloc { + border-left: 1px solid #000; + &:nth-child(2) { + border-top: 0; + } } } } -//// à ranger -.discret { - color: grey; - margin-right: 1em; -} +/* +* Table appearance +*/ +div.flex-table { + display: flex; + flex-direction: column; + align-items: stretch; + align-content: stretch; + + div.item-bloc { + display: flex; + flex-direction: column; + padding: 1em; + border: 1px solid #000; + border-top: 0; + &:first-child { + border-top: 1px solid #000; + } + &:nth-child(even) { + background-color: #e6e6e6; + } -table { - ul.record_actions { - margin: 0; - padding: 0.5em; + div.item-row { + display: flex; + flex-direction: row; + &:not(:first-child) { + margin-top: 0.5em; + border-top: 1px dotted #0000004f; + padding-top: 0.5em; + flex-direction: column; + } + + div.item-col { + &:first-child { + flex-grow: 0; flex-shrink: 0; flex-basis: 33%; + } + &:last-child { + flex-grow: 1; flex-shrink: 1; flex-basis: auto; + display: flex; + justify-content: flex-end; + + .list-content { // ul, dl, or div + } + ul.record_actions { + margin: 0; + align-self: flex-start; + flex-grow: 1; flex-shrink: 0; flex-basis: auto; + li { + margin-right: 5px; + } + } + } + } + @media only screen and (max-width: 900px) { + flex-direction: column; + div.item-col { + &:last-child { + ul.record_actions { + align-self: flex-end; + } + } + } + } + + // neutralize + div.chill_address div.chill_address_address p { text-indent: 0; } + } } -} +} diff --git a/src/Bundle/ChillMainBundle/Resources/views/Address/entity_render.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Address/entity_render.html.twig new file mode 100644 index 000000000..fa7a13645 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/Address/entity_render.html.twig @@ -0,0 +1,16 @@ +
+ {% if options['has_no_address'] == true and address.isNoAddress == true %} +
{{ 'address.consider homeless'|trans }}
+ {% endif %} +
+ {% if address.street is not empty %}

{{ address.street }}

{% endif %} + {% if address.streetNumber is not empty %}

{{ address.streetNumber }}

{% endif %} + {% if address.postCode is not empty %} +

{{ address.postCode.code }} {{ address.postCode.name }}

+

{{ address.postCode.country.name|localize_translatable_string }}

+ {% endif %} +
+{%- if options['with_valid_from'] == true -%} +{{ 'Since %date%'|trans( { '%date%' : address.validFrom|format_date('long') } ) }} +{%- endif -%} +
diff --git a/src/Bundle/ChillMainBundle/Resources/views/Address/macro.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Address/macro.html.twig index 5de175169..990dbc043 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Address/macro.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Address/macro.html.twig @@ -1,11 +1,12 @@ {%- macro _render(address, options) -%} {%- set options = { 'with_valid_from' : true }|merge(options|default({})) -%} {%- set options = { 'has_no_address' : false }|merge(options|default({})) -%} + {%- set options = { 'with_icon' : false }|merge(options|default({})) -%}
{% if options['has_no_address'] == true and address.isNoAddress == true %}
{{ 'address.consider homeless'|trans }}
{% endif %} -
+
{% if options['with_icon'] == true %}{% endif %} {% if address.street is not empty %}

{{ address.street }}

{% endif %} {% if address.streetNumber is not empty %}

{{ address.streetNumber }}

{% endif %} {% if address.postCode is not empty %} diff --git a/src/Bundle/ChillMainBundle/Templating/Entity/AddressRender.php b/src/Bundle/ChillMainBundle/Templating/Entity/AddressRender.php new file mode 100644 index 000000000..90a707e40 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Templating/Entity/AddressRender.php @@ -0,0 +1,67 @@ + true, + 'has_no_address' => false, + 'multiline' => true, + ]; + + public function __construct(EngineInterface $templating) + { + $this->templating = $templating; + } + + /** + * {@inheritDoc} + */ + public function supports($entity, array $options): bool + { + return $entity instanceof Address; + } + + /** + * @param Address addr + */ + public function renderString($addr, array $options): string + { + $lines = []; + if (!empty($addr->getStreet())) { + $lines[0] = $addr->getStreet(); + } + if (!empty($addr->getStreetNumber())) { + $lines[0] .= ", ".$addr->getStreetNumber(); + } + if (!empty($addr->getPostcode())) { + $lines[1] = \strtr("{postcode} {label}", [ + '{postcode}' => $addr->getPostcode()->getCode(), + '{label}' => $addr->getPostcode()->getName() + ]); + } + + return implode(" - ", $lines); + } + + /** + * {@inheritDoc} + * @param Address addr + */ + public function renderBox($addr, array $options): string + { + $options = \array_merge(self::DEFAULT_OPTIONS, $options); + + return $this->templating + ->render('@ChillMain/Address/entity_render.html.twig', [ + 'address' => $addr, + 'options' => $options + ]); + } +} diff --git a/src/Bundle/ChillMainBundle/Tests/Templating/Entity/AddressRenderTest.php b/src/Bundle/ChillMainBundle/Tests/Templating/Entity/AddressRenderTest.php new file mode 100644 index 000000000..79551d23c --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Templating/Entity/AddressRenderTest.php @@ -0,0 +1,55 @@ +get(EngineInterface::class); + $renderer = new AddressRender($engine); + + $this->assertEquals($expectedString, $renderer->renderString($addr, [])); + return; + $this->assertIsString($renderer->renderBox($addr, [])); + } + + + public function addressDataProvider(): \Iterator + { + $addr = new Address(); + $country = (new Country()) + ->setName([ "fr" => "Pays" ]) + ->setCountryCode("BE") + ; + $postCode = new PostalCode(); + $postCode->setName("Locality") + ->setCode("012345") + ->setCountry($country) + ; + + $addr->setStreet("Rue ABC") + ->setStreetNumber("5") + ->setPostcode($postCode) + ; + + yield[ $addr, "Rue ABC, 5 - 012345 Locality"]; + } + +} diff --git a/src/Bundle/ChillMainBundle/config/services/templating.yaml b/src/Bundle/ChillMainBundle/config/services/templating.yaml index 29dc676d1..9d103f690 100644 --- a/src/Bundle/ChillMainBundle/config/services/templating.yaml +++ b/src/Bundle/ChillMainBundle/config/services/templating.yaml @@ -41,3 +41,10 @@ services: Chill\MainBundle\Templating\ChillMarkdownRenderExtension: tags: - { name: twig.extension } + + Chill\MainBundle\Templating\Entity\AddressRender: + arguments: + - '@Symfony\Component\Templating\EngineInterface' + tags: + - { name: 'chill.render_entity' } + diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php index 6786cb05f..e5b0cdda7 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingCourseController.php @@ -72,7 +72,7 @@ class AccompanyingCourseController extends Controller $em->persist($period); $em->flush(); - return $this->redirectToRoute('chill_person_accompanying_course_show', [ + return $this->redirectToRoute('chill_person_accompanying_course_edit', [ 'accompanying_period_id' => $period->getId() ]); @@ -92,17 +92,16 @@ class AccompanyingCourseController extends Controller } /** - * Show page of Accompanying Course section + * Edit page of Accompanying Course section * - * the page show all blocks except one active edit block, managed by vuejs component - * that's why title of page is 'edit accompanying course' + * the page edit all blocks managed by vuejs component * - * @Route("/{_locale}/parcours/{accompanying_period_id}/show", name="chill_person_accompanying_course_show") + * @Route("/{_locale}/parcours/{accompanying_period_id}/edit", name="chill_person_accompanying_course_edit") * @ParamConverter("accompanyingCourse", options={"id": "accompanying_period_id"}) */ - public function showAction(AccompanyingPeriod $accompanyingCourse): Response + public function editAction(AccompanyingPeriod $accompanyingCourse): Response { - return $this->render('@ChillPerson/AccompanyingCourse/show.html.twig', [ + return $this->render('@ChillPerson/AccompanyingCourse/edit.html.twig', [ 'accompanyingCourse' => $accompanyingCourse ]); } diff --git a/src/Bundle/ChillPersonBundle/Entity/Person.php b/src/Bundle/ChillPersonBundle/Entity/Person.php index 1afa6278c..a4fb185fb 100644 --- a/src/Bundle/ChillPersonBundle/Entity/Person.php +++ b/src/Bundle/ChillPersonBundle/Entity/Person.php @@ -421,6 +421,31 @@ class Person implements HasCenterInterface return $this->accompanyingPeriodParticipations; } + /** + * Return a collection of participation, where the participation + * is still opened, not a draft, and the period is still opened + */ + public function getOpenedParticipations(): Collection + { + // create a criteria for filtering easily + $criteria = Criteria::create(); + $criteria + ->andWhere(Criteria::expr()->eq('endDate', NULL)) + ->orWhere(Criteria::expr()->gt('endDate', new \DateTime('now'))) + ; + + return $this->getAccompanyingPeriodParticipations() + ->matching($criteria) + ->filter(function (AccompanyingPeriodParticipation $app) { + $period = $app->getAccompanyingPeriod(); + return ( + NULL === $period->getClosingDate() + || new \DateTime('now') < $period->getClosingDate() + ) + && AccompanyingPeriod::STEP_DRAFT !== $period->getStep(); + }); + } + /** * Get the accompanying periods of a give person with the chronological order. */ diff --git a/src/Bundle/ChillPersonBundle/Menu/AccompanyingCourseMenuBuilder.php b/src/Bundle/ChillPersonBundle/Menu/AccompanyingCourseMenuBuilder.php index e9ce20b53..49543c42d 100644 --- a/src/Bundle/ChillPersonBundle/Menu/AccompanyingCourseMenuBuilder.php +++ b/src/Bundle/ChillPersonBundle/Menu/AccompanyingCourseMenuBuilder.php @@ -43,7 +43,7 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface ->setExtras(['order' => 10]); $menu->addChild($this->translator->trans('Edit Accompanying Course'), [ - 'route' => 'chill_person_accompanying_course_show', + 'route' => 'chill_person_accompanying_course_edit', 'routeParameters' => [ 'accompanying_period_id' => $period->getId() ]]) diff --git a/src/Bundle/ChillPersonBundle/Resources/public/index.js b/src/Bundle/ChillPersonBundle/Resources/public/index.js index f4bcba7fb..e3563b4ff 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/index.js @@ -1 +1,2 @@ -require('./sass/person.scss'); \ No newline at end of file +require('./sass/person.scss'); +require('./sass/person_with_period.scss'); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/sass/index.js b/src/Bundle/ChillPersonBundle/Resources/public/sass/index.js index 35945c7ff..89e749e5c 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/sass/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/sass/index.js @@ -1,5 +1,5 @@ require('./phone-alt-solid.svg'); require('./mobile-alt-solid.svg'); require('./person_by_phonenumber.scss'); - +require('./person_with_period.scss'); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/sass/person_with_period.scss b/src/Bundle/ChillPersonBundle/Resources/public/sass/person_with_period.scss new file mode 100644 index 000000000..6f52d2cae --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/public/sass/person_with_period.scss @@ -0,0 +1,50 @@ +/// complete and overwrite flex-table in chillmain.scss +div.list-with-period { + div.person { + ul.record_actions { + li { + margin-right: 0 !important; + } + } + } + div.periods { + div.header, + div.list-content { + width: calc(100% - 40px); + margin-left: 40px; + } + div.header { + position: relative; + a.sc-button { + position: absolute; + width: 30px; + height: 30px; + top: 10px; + left: -40px; + padding: 0; + i { + padding: 5px; + } + } + abbr.referrer { + font-size: 70%; + } + span.user { + margin-left: 1em; + } + } + div.list-content { + span.more { + font-style: italic; + } + } + } +} + +.chill-entity__person { + .chill-entity__person__first-name, + .chill-entity__person__last-name { + font-size: 1.3em; + font-weight: 700; + } +} diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue index c6783677a..32fbb86c2 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/Requestor.vue @@ -3,45 +3,47 @@

{{ $t('requestor.title') }}

-
+
+ -
{{ $t('requestor.type') }}
-
{{ accompanyingCourse.requestor.type }}
-
{{ $t('requestor.text') }}
-
{{ accompanyingCourse.requestor.text }}
-
{{ $t('requestor.is_anonymous') }}
-
{{ accompanyingCourse.requestorAnonymous }}
+
+

+ {{ accompanyingCourse.requestor.type }} + {{ accompanyingCourse.requestor.text }} +

-
-
{{ $t('requestor.person_id') }}
-
{{ accompanyingCourse.requestor.person_id }}
-
{{ $t('requestor.birthdate') }}
-
{{ $d(accompanyingCourse.requestor.birthdate.datetime, 'short') }}
-
{{ $t('requestor.center') }}
-
{{ accompanyingCourse.requestor.center.name }}
-
{{ $t('requestor.firstName') }}
-
{{ accompanyingCourse.requestor.firstName }}
-
{{ $t('requestor.lastName') }}
-
{{ accompanyingCourse.requestor.lastName }}
-
{{ $t('requestor.phonenumber') }}
-
{{ accompanyingCourse.requestor.phonenumber }}
-
{{ $t('requestor.mobilenumber') }}
-
{{ accompanyingCourse.requestor.mobilenumber }}
-
{{ $t('requestor.altNames') }}
-
{{ accompanyingCourse.requestor.altNames }}
-
- -
-
{{ $t('requestor.person_id') }}
-
{{ accompanyingCourse.requestor.thirdparty_id }}
-
{{ $t('requestor.address') }}
-
{{ accompanyingCourse.requestor.address.text }}
-
{{ $t('requestor.location') }}
-
{{ accompanyingCourse.requestor.address.postcode.name }}
+
+ +
{{ $t('requestor.birthdate') }}
+
{{ $d(accompanyingCourse.requestor.birthdate.datetime, 'short') }}
+ +
{{ $t('requestor.center') }}
+
{{ accompanyingCourse.requestor.center.name }}
+ +
{{ $t('requestor.phonenumber') }}
+
{{ accompanyingCourse.requestor.phonenumber }}
+
{{ $t('requestor.mobilenumber') }}
+
{{ accompanyingCourse.requestor.mobilenumber }}
+
+ +
+ +
{{ $t('requestor.address') }}
+
{{ accompanyingCourse.requestor.address.text }}
+ +
{{ $t('requestor.location') }}
+
{{ accompanyingCourse.requestor.address.postcode.name }}
+
+ +
    +
  • + +
  • +
    @@ -53,6 +55,7 @@
+
@@ -104,6 +107,13 @@ export default { get() { return this.$store.state.accompanyingCourse.requestorAnonymous; } + }, + url() { + return (this.accompanyingCourse.requestor.type === 'person') ? { + show: `/fr/person/${this.accompanyingCourse.requestor.id}/general`, + } : { + show: `/fr/thirdparty/thirdparty/${this.accompanyingCourse.requestor.id}/show`, + } } }, methods: { @@ -120,3 +130,28 @@ export default { } } + + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/StickyNav.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/StickyNav.vue index 117c4f09b..3bc1ea33a 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/StickyNav.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/components/StickyNav.vue @@ -184,7 +184,7 @@ div#navmap { } } @media only screen and (max-width: 768px) { - div.sticky-section { + div#navmap { display: none; } } diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js index 66b6d6683..2a7f19d61 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/index.js @@ -4,20 +4,47 @@ import { appMessages } from './js/i18n' import { initPromise } from './store' import App from './App.vue'; +import Banner from './components/Banner.vue'; -initPromise.then(store => { +const root = window.vueRootComponent; - //console.log('store in create_store', store); - //console.log('store accompanyingCourse', store.state.accompanyingCourse); - - const i18n = _createI18n(appMessages); - - const app = createApp({ - template: ``, - }) - .use(store) - .use(i18n) - .component('app', App) - .mount('#accompanying-course'); +/* +* Load all App component, for AccompanyingCourse edition page +*/ +if (root === 'app') { -}); + initPromise.then(store => { + + const i18n = _createI18n(appMessages); + + const app = createApp({ + template: ``, + }) + .use(store) + .use(i18n) + .component('app', App) + .mount('#accompanying-course'); + + }); +} + +/* +* Load only Banner sub-component, for all others AccompanyingCourse page +*/ +if (root === 'banner') { + + initPromise.then(store => { + + const i18n = _createI18n(appMessages); + + const app = createApp({ + template: ``, + }) + .use(store) + .use(i18n) + .component('banner', Banner) + .mount('#accompanying-course'); + + }); + +} diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js index c9121c5fd..279bfc2a4 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/AccompanyingCourse/store/index.js @@ -191,8 +191,9 @@ let initPromise = getAccompanyingCourse(id) //console.log('## action: confirmAccompanyingCourse'); confirmAccompanyingCourse(id) .then(response => new Promise((resolve, reject) => { + window.location.replace(`/fr/parcours/${id}`); + console.log('fetch resolve'); commit('confirmAccompanyingCourse', response); - console.log('fetch resolve'); // redirection with #top anchor resolve(); })).catch((error) => { commit('catchError', error) }); } diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/show.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/edit.html.twig similarity index 86% rename from src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/show.html.twig rename to src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/edit.html.twig index 23ffb5864..6aa978149 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/show.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/edit.html.twig @@ -10,13 +10,10 @@
{# <== insert accompanyingCourse vue component #} {% endblock %} -{% block css %} - {{ encore_entry_link_tags('accompanying_course') }} -{% endblock %} - {% block js %} {{ encore_entry_script_tags('accompanying_course') }} {% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/history.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/history.html.twig index 8d6ee2a30..f5f1fc067 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/history.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/history.html.twig @@ -8,19 +8,59 @@

{{ block('title') }}

-
-{{ accompanyingCourse.id }}
-{{ accompanyingCourse.openingDate|format_date('short') }}
-{{ accompanyingCourse.closingDate|format_date('short') }}
-{{ accompanyingCourse.closingMotive|chill_entity_render_box }}
-{{ accompanyingCourse.remark|raw }}
-{{ accompanyingCourse.user }}
-usagers:
-{% for p in accompanyingCourse.participations %}
-    {{ p.person.id }} | {{ p.person.fullnamecanonical }} | {{ p.startdate|format_date('short') }} | {{ p.enddate|format_date('short') }}
-{% endfor %}
-    
+ {# start test flex-table #} +
+ {% for p in accompanyingCourse.participations %} +
+
+
+

+ + {{ p.person.firstname ~ ' ' ~ p.person.lastname }} + +

+

+ + {{ 'Née le ' ~ p.person.birthdate|format_date('short') }} +

+
+
+
    +
  • + {{ p.startdate|format_date('short') }} → {{ p.enddate|format_date('short') }} +
  • +
  • + +32 488 660 685 +
  • +
  • + robert@brisefeuille.fake.co +
  • +
  • + 59, avenue Fernandez 79, boulevard Laurence Levy 1210 Saint-josse-ten-noode Belgique +
  • +
+
    +
  • +
  • +
+
+ +
+
+ Lorem ipsum dolor sit amet, incididunt ut labore et dolore magna aliqua. +
+
+ Rhoncus est pellentesque elit eu ultrices vitae auctor. +
+
+ Facilisis gravida neque convallis a cras semper auctor neque. +
+
+ {% endfor %} +
+ {# end test flex-table #} - {{ dump() }} + {# ==> insert accompanyingCourse vue component #} +
{% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/index.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/index.html.twig index e12037cd2..98f26987f 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/index.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/index.html.twig @@ -1,4 +1,5 @@ {% extends 'ChillPersonBundle:AccompanyingCourse:layout.html.twig' %} +{% import '@ChillMain/Address/macro.html.twig' as address %} {% block title %} {{ 'Resume Accompanying Course'|trans }} @@ -6,23 +7,172 @@ {% block content %} - {% if 'DRAFT' == accompanyingCourse.step %} -
- - {{ 'This accompanying course is still a draft'|trans }} - - {{ 'Edit & activate accompanying course'|trans }} - - -
- {% endif %} + {% if 'DRAFT' == accompanyingCourse.step %} +
+ + {{ 'This accompanying course is still a draft'|trans }} + + {{ 'Edit & activate accompanying course'|trans }} + + +
+ {% endif %} -

{{ 'Associated peoples'|trans }}

+

{{ 'Associated peoples'|trans }}

+
+ {% for p in accompanyingCourse.participations %} + {% if p.enddate is null %} +
+
+
+

{{ p.person.firstname ~ ' ' ~ p.person.lastname }}

+

+ {% set born = (p.person.gender == 'woman') ? 'née': 'né' %} + {% set gender = (p.person.gender == 'woman') ? 'fa-venus' : + (p.person.gender == 'man') ? 'fa-mars' : 'fa-neuter' %} + {% set genderTitle = (p.person.gender == 'woman') ? 'femme' : + (p.person.gender == 'homme') ? 'fa-mars' : 'neutre' %} + {{ born ~ ' le ' ~ p.person.birthdate|format_date('short') }} +

+
+
+
    +
  • + {% if p.person.mobilenumber %} + {{ p.person.mobilenumber }} + {% else %} + + {% if p.person.phonenumber %} + {{ p.person.phonenumber }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} + {% endif %} +
  • +
  • + + {%- if p.person.lastAddress is not empty -%} + {{ p.person.getLastAddress|chill_entity_render_box({'with_valid_from': false}) }} + {%- else -%} + {{ 'No address given'|trans }} + {%- endif -%} +
  • +
+
    +
  • + +
  • +
+
+
+
+ {% endif %} + {% endfor %} +
-

{{ 'Resources'|trans }}

-

{{ 'Social actions'|trans }}

- -

{{ 'Last events on accompanying course'|trans }}

+

{{ 'Resources'|trans }}

+
+ {% for r in accompanyingCourse.resources %} +
+ {% if r.person %} + +
+
+

+ {{ r.person.firstname ~ ' ' ~ r.person.lastname }} + {{ 'Usager' }} +

+

+ {% set born = (r.person.gender == 'woman') ? 'née': 'né' %} + {% set gender = (r.person.gender == 'woman') ? 'fa-venus' : + (r.person.gender == 'man') ? 'fa-mars' : 'fa-neuter' %} + {% set genderTitle = (r.person.gender == 'woman') ? 'femme' : + (r.person.gender == 'homme') ? 'fa-mars' : 'neutre' %} + {{ born ~ ' le ' ~ r.person.birthdate|format_date('short') }} +

+
+
+
    +
  • + {% if r.person.mobilenumber %} + {{ r.person.mobilenumber }} + {% else %} + + {% if r.person.phonenumber %} + {{ r.person.phonenumber }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} + {% endif %} +
  • +
  • + + {%- if r.person.lastAddress is not empty -%} + {{ r.person.getLastAddress|chill_entity_render_box({'with_valid_from': false}) }} + {%- else -%} + {{ 'No address given'|trans }} + {%- endif -%} +
  • +
+
    +
  • + +
  • +
+
+
+ + {% endif %} + {% if r.thirdParty %} + +
+
+

+ {{ r.thirdParty.name }} + {{ 'Tiers' }} +

+
+
+ +
    +
  • + +
  • +
+
+
+ + {% endif %} +
+ {% endfor %} +
+

{{ 'Social actions'|trans }}

+ +

{{ 'Last events on accompanying course'|trans }}

+ + + {# ==> insert accompanyingCourse vue component #} +
{% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/layout.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/layout.html.twig index 82def471c..0bab5d893 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/layout.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingCourse/layout.html.twig @@ -16,7 +16,13 @@ {% endblock %} {% block css %} + {{ encore_entry_link_tags('accompanying_course') }} {% endblock %} {% block js %} + + {{ encore_entry_script_tags('accompanying_course') }} {% endblock %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig new file mode 100644 index 000000000..afcd2799c --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig @@ -0,0 +1,15 @@ + + {%- if addLink and is_granted('CHILL_PERSON_SEE', person) -%} + {%- set showLink = true -%}{%- endif -%} + {{ person.firstName }} + {{ person.lastName }} + {%- if addAltNames -%} + {%- for n in person.altNames -%} + {%- if loop.first -%}({% else %} {%- endif -%} + + {{ n.label }} + + {%- if loop.last %}) {% endif -%} + {%- endfor -%} + {%- endif -%} + {%- if showLink is defined -%}{%- endif -%} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Entity/social_issue.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Entity/social_issue.html.twig new file mode 100644 index 000000000..2db894e3c --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/Entity/social_issue.html.twig @@ -0,0 +1,13 @@ +{% set reversed_parents = parents|reverse %} + diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig new file mode 100644 index 000000000..10c0e0bc7 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/Person/list_with_period.html.twig @@ -0,0 +1,178 @@ +

{{ title|default('Person search results')|trans }}

+ +

+ {{ '%total% persons matching the search pattern:'|transchoice( total, { '%total%' : total}) }} + + {{ pattern }} + +

+ +

{{ 'Results %start%-%end% of %total%'|trans({ '%start%' : start, '%end%': start + persons|length, '%total%' : total } ) }}

+ + + + +{% if persons|length > 0 %} + +
+ {% for person in persons %} + +
+
+ +
+
{{ person|chill_entity_render_box({'addLink': true}) }}
+
{{ 'Born the %date%'|transchoice(person.genderNumeric, { '%date%': person.birthdate|format_date("medium") }) }}
+
+ +
+
    +
  • + {{ person.center }} +
  • + +
  • + {% if person.mobilenumber is not empty %} + {{ person.mobilenumber|chill_format_phonenumber }} + {% else %} + + {% if person.phonenumber is not empty %} + {{ person.phonenumber|chill_format_phonenumber }} + {% else %} + {{ 'No data given'|trans }} + {% endif %} + {% endif %} +
  • + +
  • + + {% if person.getLastAddress is not null %} + {{ person.getLastAddress|chill_entity_render_box({'with_valid_from': false}) }} + {% else %} + {{ 'No address'|trans }} + {% endif %} +
  • + +
+ +
+ +
+ + {#- 'apps' is for AccompanyingPeriodParticipationS #} + {#- filter using acl -#} + {%- set apps = [] %} + {%- for app in person.openedParticipations %} + {%- if is_granted('CHILL_PERSON_ACCOMPANYING_PERIOD_SEE', app.accompanyingPeriod) %} + {%- set apps = apps|merge([app]) %} + {%- endif %} + {%- endfor %} + + {% if apps|length > 0 %} + {% for app in apps %} +
+ +
+ + + + {{ 'Since %date%'|trans({'%date%': app.startDate|format_date('medium') }) }} + {% if app.accompanyingPeriod.user is not null %} + + ref: + {{ app.accompanyingPeriod.user|chill_entity_render_box }} + + {% endif %} +
+ +
+ {% for issue in app.accompanyingPeriod.socialIssues|slice(0,2) %} + {{ issue|chill_entity_render_box }} + {% endfor %} + + {% if app.accompanyingPeriod.socialIssues|length > 2 %} + {{ 'and %number% other'|transchoice(app.accompanyingPeriod.socialIssues|length-2) }} + {% endif %} +
+ +
+ {% endfor %} + + {% endif %} + +
+ + {% endfor %} +
+ + + +{% else %} + +{% endif %} + +{% if preview == false %} + {{ chill_pagination(paginator) }} +{% endif %} diff --git a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php index 34f79bb87..fe938999a 100644 --- a/src/Bundle/ChillPersonBundle/Search/PersonSearch.php +++ b/src/Bundle/ChillPersonBundle/Search/PersonSearch.php @@ -120,7 +120,7 @@ class PersonSearch extends AbstractSearch implements ContainerAwareInterface, $paginator = $this->paginatorFactory->create($total); if ($format === 'html') { - return $this->container->get('templating')->render('ChillPersonBundle:Person:list.html.twig', + return $this->container->get('templating')->render('@ChillPerson/Person/list_with_period.html.twig', array( 'persons' => $this->search($terms, $start, $limit, $options), 'pattern' => $this->recomposePattern($terms, array('nationality', diff --git a/src/Bundle/ChillPersonBundle/Templating/Entity/SocialIssueRender.php b/src/Bundle/ChillPersonBundle/Templating/Entity/SocialIssueRender.php index 4a7ed0cb5..1923325f9 100644 --- a/src/Bundle/ChillPersonBundle/Templating/Entity/SocialIssueRender.php +++ b/src/Bundle/ChillPersonBundle/Templating/Entity/SocialIssueRender.php @@ -5,10 +5,12 @@ namespace Chill\PersonBundle\Templating\Entity; use Chill\MainBundle\Templating\Entity\ChillEntityRenderInterface; use Chill\PersonBundle\Entity\SocialWork\SocialIssue; use Chill\MainBundle\Templating\TranslatableStringHelper; +use Symfony\Component\Templating\EngineInterface; class SocialIssueRender implements ChillEntityRenderInterface { private TranslatableStringHelper $translatableStringHelper; + private EngineInterface $engine; public const SEPARATOR_KEY = 'default.separator'; @@ -16,14 +18,15 @@ class SocialIssueRender implements ChillEntityRenderInterface self::SEPARATOR_KEY => ' > ', ]; - public function __construct(TranslatableStringHelper $translatableStringHelper) + public function __construct(TranslatableStringHelper $translatableStringHelper, EngineInterface $engine) { $this->translatableStringHelper = $translatableStringHelper; + $this->engine = $engine; } public function supports($entity, array $options): bool { - return $entity instanceof SocialIssueRender; + return $entity instanceof SocialIssue; } public function renderString($socialIssue, array $options): string @@ -42,9 +45,27 @@ class SocialIssueRender implements ChillEntityRenderInterface return $str; } - - public function renderBox($entity, array $options): string + + protected function buildParents($socialIssue): array { - return "renderBox not implemented for social issue"; + $parents = []; + while ($socialIssue->hasParent()) { + $socialIssue = $parents[] = $socialIssue->getParent(); + } + + return $parents; + } + + public function renderBox($socialIssue, array $options): string + { + $options = \array_merge(self::DEFAULT_ARGS, $options); + // give some help to twig: an array of parents + $parents = $this->buildParents($socialIssue); + + return $this->engine->render('@ChillPerson/Entity/social_issue.html.twig', [ + 'socialIssue' => $socialIssue, + 'parents' => $parents, + 'options' => $options + ]); } } diff --git a/src/Bundle/ChillPersonBundle/config/services/templating.yaml b/src/Bundle/ChillPersonBundle/config/services/templating.yaml index 306cbb19f..1e4fe4d3e 100644 --- a/src/Bundle/ChillPersonBundle/config/services/templating.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/templating.yaml @@ -19,5 +19,6 @@ services: Chill\PersonBundle\Templating\Entity\SocialIssueRender: arguments: $translatableStringHelper: '@Chill\MainBundle\Templating\TranslatableStringHelper' + $engine: '@Symfony\Component\Templating\EngineInterface' tags: - 'chill.render_entity' diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 30536eaa7..12ba14b05 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -46,7 +46,7 @@ Add new phone: Ajouter un numéro de téléphone Remove phone: Supprimer 'Notes on contact information': 'Remarques sur les informations de contact' 'Remarks': 'Remarques' -'{0} Born the %date% | {1} Born the %date%': '{0} Né le %date% | {1} Née le %date%' +'Born the %date%': '{0} Né le %date% | {1} Née le %date%' 'Spoken languages': 'Langues parlées' 'Unknown spoken languages': 'Langues parlées inconnues' Male: Homme @@ -125,6 +125,8 @@ Reset: 'Remise à zéro' 'Person search results': 'Recherche de personnes' Person search results by phonenumber: Recherche de personnes par numéro de téléphone 'Search within persons': 'Recherche parmi les personnes' +Open person file: Ouvrir +and %number% other: '{0} et aucun autre| {1} et une autre |]1, Inf] et %number% autres' '%total% persons matching the search pattern:': '{0} Aucune personne ne correspond aux termes de recherche : | {1} Une personne a été trouvée par la recherche : | ]1,Inf] %total% personnes correspondent aux termes de recherche :' 'Last opening since %last_opening%': 'Dernière ouverture le %last_opening%.' 'Person accompanying period - %name%': 'Historique du dossier - %name%' @@ -170,6 +172,9 @@ Resources: Interlocuteurs privilégiés Social actions: Actions d'accompagnement Last events on accompanying course: Dernières actions de suivi Edit & activate accompanying course: Modifier et valider +See accompanying periods: Voir les périodes d'accompagnement +See accompanying period: Voir cette période d'accompagnement +Referrer: Référent # pickAPersonType Pick a person: Choisir une personne diff --git a/src/Bundle/parcours.html b/src/Bundle/parcours.html new file mode 100644 index 000000000..0a7dd3df4 --- /dev/null +++ b/src/Bundle/parcours.html @@ -0,0 +1,72 @@ +Controleur: + +activity_json = $this->serializer->serialize($activity, 'json', []); + +return render('@ChillActivity/...', [ + 'activity' => $activity, + 'activity_json' => $activity_json +]) + + +{# template twig de activity #} + +{{ form(activity) }} + +{% block js %} + +{{ encore_entry_script_tags('activity_form') }} +{% endblock %} + + +{# ----- + dans le fichier app.js: #} +