mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Merge branch 'issue718_workflow_suggest_users' into 'master'
Issue718 workflow suggest users See merge request Chill-Projet/chill-bundles!499
This commit is contained in:
commit
88b4159ced
@ -95,6 +95,16 @@ class AccompanyingCourseDocumentWorkflowHandler implements EntityWorkflowHandler
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array
|
||||||
|
{
|
||||||
|
$suggestedUsers = $entityWorkflow->getUsersInvolved();
|
||||||
|
|
||||||
|
$referrer = $this->getRelatedEntity($entityWorkflow)->getCourse()->getUser();
|
||||||
|
$suggestedUsers[spl_object_hash($referrer)] = $referrer;
|
||||||
|
|
||||||
|
return $suggestedUsers;
|
||||||
|
}
|
||||||
|
|
||||||
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
||||||
{
|
{
|
||||||
return '@ChillDocStore/AccompanyingCourseDocument/_workflow.html.twig';
|
return '@ChillDocStore/AccompanyingCourseDocument/_workflow.html.twig';
|
||||||
|
@ -30,6 +30,7 @@ use Symfony\Component\HttpFoundation\Response;
|
|||||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||||
use Symfony\Component\Routing\Annotation\Route;
|
use Symfony\Component\Routing\Annotation\Route;
|
||||||
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
|
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
|
||||||
|
use Symfony\Component\Security\Core\Security;
|
||||||
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
use Symfony\Component\Validator\Validator\ValidatorInterface;
|
||||||
use Symfony\Component\Workflow\Registry;
|
use Symfony\Component\Workflow\Registry;
|
||||||
use Symfony\Component\Workflow\TransitionBlocker;
|
use Symfony\Component\Workflow\TransitionBlocker;
|
||||||
@ -48,11 +49,13 @@ class WorkflowController extends AbstractController
|
|||||||
|
|
||||||
private Registry $registry;
|
private Registry $registry;
|
||||||
|
|
||||||
|
private Security $security;
|
||||||
|
|
||||||
private TranslatorInterface $translator;
|
private TranslatorInterface $translator;
|
||||||
|
|
||||||
private ValidatorInterface $validator;
|
private ValidatorInterface $validator;
|
||||||
|
|
||||||
public function __construct(EntityWorkflowManager $entityWorkflowManager, EntityWorkflowRepository $entityWorkflowRepository, ValidatorInterface $validator, PaginatorFactory $paginatorFactory, Registry $registry, EntityManagerInterface $entityManager, TranslatorInterface $translator)
|
public function __construct(EntityWorkflowManager $entityWorkflowManager, EntityWorkflowRepository $entityWorkflowRepository, ValidatorInterface $validator, PaginatorFactory $paginatorFactory, Registry $registry, EntityManagerInterface $entityManager, TranslatorInterface $translator, Security $security)
|
||||||
{
|
{
|
||||||
$this->entityWorkflowManager = $entityWorkflowManager;
|
$this->entityWorkflowManager = $entityWorkflowManager;
|
||||||
$this->entityWorkflowRepository = $entityWorkflowRepository;
|
$this->entityWorkflowRepository = $entityWorkflowRepository;
|
||||||
@ -61,6 +64,7 @@ class WorkflowController extends AbstractController
|
|||||||
$this->registry = $registry;
|
$this->registry = $registry;
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
|
$this->security = $security;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -291,10 +295,18 @@ class WorkflowController extends AbstractController
|
|||||||
|
|
||||||
if (count($workflow->getEnabledTransitions($entityWorkflow)) > 0) {
|
if (count($workflow->getEnabledTransitions($entityWorkflow)) > 0) {
|
||||||
// possible transition
|
// possible transition
|
||||||
|
|
||||||
|
$usersInvolved = $entityWorkflow->getUsersInvolved();
|
||||||
|
$currentUserFound = array_search($this->security->getUser(), $usersInvolved, true);
|
||||||
|
|
||||||
|
if (false !== $currentUserFound) {
|
||||||
|
unset($usersInvolved[$currentUserFound]);
|
||||||
|
}
|
||||||
|
|
||||||
$transitionForm = $this->createForm(
|
$transitionForm = $this->createForm(
|
||||||
WorkflowStepType::class,
|
WorkflowStepType::class,
|
||||||
$entityWorkflow->getCurrentStep(),
|
$entityWorkflow->getCurrentStep(),
|
||||||
['transition' => true, 'entity_workflow' => $entityWorkflow]
|
['transition' => true, 'entity_workflow' => $entityWorkflow, 'suggested_users' => $usersInvolved]
|
||||||
);
|
);
|
||||||
|
|
||||||
$transitionForm->handleRequest($request);
|
$transitionForm->handleRequest($request);
|
||||||
|
@ -348,6 +348,23 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
|
|||||||
return $this->transitionningStep;
|
return $this->transitionningStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return User[]
|
||||||
|
*/
|
||||||
|
public function getUsersInvolved(): array
|
||||||
|
{
|
||||||
|
$usersInvolved = [];
|
||||||
|
$usersInvolved[spl_object_hash($this->getCreatedBy())] = $this->getCreatedBy();
|
||||||
|
|
||||||
|
foreach ($this->steps as $step) {
|
||||||
|
foreach ($step->getDestUser() as $u) {
|
||||||
|
$usersInvolved[spl_object_hash($u)] = $u;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $usersInvolved;
|
||||||
|
}
|
||||||
|
|
||||||
public function getWorkflowName(): string
|
public function getWorkflowName(): string
|
||||||
{
|
{
|
||||||
return $this->workflowName;
|
return $this->workflowName;
|
||||||
|
@ -19,6 +19,7 @@ use Symfony\Component\Form\FormInterface;
|
|||||||
use Symfony\Component\Form\FormView;
|
use Symfony\Component\Form\FormView;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,12 +29,15 @@ class PickUserDynamicType extends AbstractType
|
|||||||
{
|
{
|
||||||
private DenormalizerInterface $denormalizer;
|
private DenormalizerInterface $denormalizer;
|
||||||
|
|
||||||
|
private NormalizerInterface $normalizer;
|
||||||
|
|
||||||
private SerializerInterface $serializer;
|
private SerializerInterface $serializer;
|
||||||
|
|
||||||
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer)
|
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer, NormalizerInterface $normalizer)
|
||||||
{
|
{
|
||||||
$this->denormalizer = $denormalizer;
|
$this->denormalizer = $denormalizer;
|
||||||
$this->serializer = $serializer;
|
$this->serializer = $serializer;
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
@ -46,6 +50,11 @@ class PickUserDynamicType extends AbstractType
|
|||||||
$view->vars['multiple'] = $options['multiple'];
|
$view->vars['multiple'] = $options['multiple'];
|
||||||
$view->vars['types'] = ['user'];
|
$view->vars['types'] = ['user'];
|
||||||
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
||||||
|
$view->vars['suggested'] = [];
|
||||||
|
|
||||||
|
foreach ($options['suggested'] as $user) {
|
||||||
|
$view->vars['suggested'][] = $this->normalizer->normalize($user, 'json', ['groups' => 'read']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
@ -53,7 +62,8 @@ class PickUserDynamicType extends AbstractType
|
|||||||
$resolver
|
$resolver
|
||||||
->setDefault('multiple', false)
|
->setDefault('multiple', false)
|
||||||
->setAllowedTypes('multiple', ['bool'])
|
->setAllowedTypes('multiple', ['bool'])
|
||||||
->setDefault('compound', false);
|
->setDefault('compound', false)
|
||||||
|
->setDefault('suggested', []);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBlockPrefix()
|
public function getBlockPrefix()
|
||||||
|
@ -154,6 +154,7 @@ class WorkflowStepType extends AbstractType
|
|||||||
'label' => 'workflow.dest for next steps',
|
'label' => 'workflow.dest for next steps',
|
||||||
'multiple' => true,
|
'multiple' => true,
|
||||||
'mapped' => false,
|
'mapped' => false,
|
||||||
|
'suggested' => $options['suggested_users'],
|
||||||
])
|
])
|
||||||
->add('future_dest_emails', ChillCollectionType::class, [
|
->add('future_dest_emails', ChillCollectionType::class, [
|
||||||
'label' => 'workflow.dest by email',
|
'label' => 'workflow.dest by email',
|
||||||
@ -200,6 +201,7 @@ class WorkflowStepType extends AbstractType
|
|||||||
->setAllowedTypes('transition', 'bool')
|
->setAllowedTypes('transition', 'bool')
|
||||||
->setRequired('entity_workflow')
|
->setRequired('entity_workflow')
|
||||||
->setAllowedTypes('entity_workflow', EntityWorkflow::class)
|
->setAllowedTypes('entity_workflow', EntityWorkflow::class)
|
||||||
|
->setDefault('suggested_users', [])
|
||||||
->setDefault('constraints', [
|
->setDefault('constraints', [
|
||||||
new Callback(
|
new Callback(
|
||||||
function ($step, ExecutionContextInterface $context, $payload) {
|
function ($step, ExecutionContextInterface $context, $payload) {
|
||||||
|
@ -23,7 +23,7 @@ function loadDynamicPicker(element) {
|
|||||||
(input.value === '[]' || input.value === '') ?
|
(input.value === '[]' || input.value === '') ?
|
||||||
null : [ JSON.parse(input.value) ]
|
null : [ JSON.parse(input.value) ]
|
||||||
)
|
)
|
||||||
;
|
suggested = JSON.parse(el.dataset.suggested)
|
||||||
|
|
||||||
if (!isMultiple) {
|
if (!isMultiple) {
|
||||||
if (input.value === '[]'){
|
if (input.value === '[]'){
|
||||||
@ -37,6 +37,7 @@ function loadDynamicPicker(element) {
|
|||||||
':types="types" ' +
|
':types="types" ' +
|
||||||
':picked="picked" ' +
|
':picked="picked" ' +
|
||||||
':uniqid="uniqid" ' +
|
':uniqid="uniqid" ' +
|
||||||
|
':suggested="notPickedSuggested" ' +
|
||||||
'@addNewEntity="addNewEntity" ' +
|
'@addNewEntity="addNewEntity" ' +
|
||||||
'@removeEntity="removeEntity"></pick-entity>',
|
'@removeEntity="removeEntity"></pick-entity>',
|
||||||
components: {
|
components: {
|
||||||
@ -48,16 +49,31 @@ function loadDynamicPicker(element) {
|
|||||||
types: JSON.parse(el.dataset.types),
|
types: JSON.parse(el.dataset.types),
|
||||||
picked: picked === null ? [] : picked,
|
picked: picked === null ? [] : picked,
|
||||||
uniqid: el.dataset.uniqid,
|
uniqid: el.dataset.uniqid,
|
||||||
|
suggested: suggested
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
notPickedSuggested() {
|
||||||
|
if (this.multiple) {
|
||||||
|
const pickedIds = new Set();
|
||||||
|
for (const p of this.picked) {
|
||||||
|
pickedIds.add(`${p.type}${p.id}`);
|
||||||
|
}
|
||||||
|
return this.suggested.filter(e => !pickedIds.has(`${e.type}${e.id}`))
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.suggested.filter(e => e.type !== this.picked.type && e.id !== e.picked.id);
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
addNewEntity(entity) {
|
addNewEntity({entity}) {
|
||||||
if (this.multiple) {
|
if (this.multiple) {
|
||||||
if (!this.picked.some(el => {
|
if (!this.picked.some(el => {
|
||||||
return el.type === entity.type && el.id === entity.id;
|
return el.type === entity.type && el.id === entity.id;
|
||||||
})) {
|
})) {
|
||||||
this.picked.push(entity);
|
this.picked.push(entity);
|
||||||
input.value = JSON.stringify(this.picked);
|
input.value = JSON.stringify(this.picked);
|
||||||
|
console.log(entity)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!this.picked.some(el => {
|
if (!this.picked.some(el => {
|
||||||
@ -69,7 +85,10 @@ function loadDynamicPicker(element) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
removeEntity(entity) {
|
removeEntity({entity}) {
|
||||||
|
if (-1 === this.suggested.findIndex(e => e.type === entity.type && e.id === entity.id)) {
|
||||||
|
this.suggested.push(entity);
|
||||||
|
}
|
||||||
this.picked = this.picked.filter(e => !(e.type === entity.type && e.id === entity.id));
|
this.picked = this.picked.filter(e => !(e.type === entity.type && e.id === entity.id));
|
||||||
input.value = JSON.stringify(this.picked);
|
input.value = JSON.stringify(this.picked);
|
||||||
},
|
},
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
</add-persons>
|
</add-persons>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
<ul class="list-suggest add-items inline">
|
||||||
|
<li v-for="s in suggested" :key="s.id" @click="addNewSuggested(s)"><span>{{ s.text }}</span></li>
|
||||||
|
</ul>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@ -49,6 +52,10 @@ export default {
|
|||||||
// display picked entities.
|
// display picked entities.
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
|
},
|
||||||
|
suggested: {
|
||||||
|
type: Array,
|
||||||
|
default: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
emits: ['addNewEntity', 'removeEntity'],
|
emits: ['addNewEntity', 'removeEntity'],
|
||||||
@ -61,55 +68,58 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
addPersonsOptions() {
|
addPersonsOptions() {
|
||||||
return {
|
return {
|
||||||
uniq: !this.multiple,
|
uniq: !this.multiple,
|
||||||
type: this.types,
|
type: this.types,
|
||||||
priority: null,
|
priority: null,
|
||||||
button: {
|
button: {
|
||||||
size: 'btn-sm',
|
size: 'btn-sm',
|
||||||
class: 'btn-submit',
|
class: 'btn-submit',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
translatedListOfTypes() {
|
translatedListOfTypes() {
|
||||||
let trans = [];
|
let trans = [];
|
||||||
this.types.forEach(t => {
|
this.types.forEach(t => {
|
||||||
if (this.$props.multiple) {
|
if (this.$props.multiple) {
|
||||||
trans.push(appMessages.fr.pick_entity[t].toLowerCase());
|
trans.push(appMessages.fr.pick_entity[t].toLowerCase());
|
||||||
} else {
|
} else {
|
||||||
trans.push(appMessages.fr.pick_entity[t + '_one'].toLowerCase());
|
trans.push(appMessages.fr.pick_entity[t + '_one'].toLowerCase());
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
if (this.$props.multiple) {
|
if (this.$props.multiple) {
|
||||||
return appMessages.fr.pick_entity.modal_title + trans.join(', ');
|
return appMessages.fr.pick_entity.modal_title + trans.join(', ');
|
||||||
} else {
|
} else {
|
||||||
return appMessages.fr.pick_entity.modal_title_one + trans.join(', ');
|
return appMessages.fr.pick_entity.modal_title_one + trans.join(', ');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
listClasses() {
|
listClasses() {
|
||||||
return {
|
return {
|
||||||
'list-suggest': true,
|
'list-suggest': true,
|
||||||
'remove-items': this.$props.removableIfSet,
|
'remove-items': this.$props.removableIfSet,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
addNewEntity({ selected, modal }) {
|
addNewSuggested(entity) {
|
||||||
selected.forEach((item) => {
|
this.$emit('addNewEntity', {entity: entity});
|
||||||
this.$emit('addNewEntity', item.result);
|
},
|
||||||
}, this
|
addNewEntity({ selected, modal }) {
|
||||||
);
|
selected.forEach((item) => {
|
||||||
this.$refs.addPersons.resetSearch(); // to cast child method
|
this.$emit('addNewEntity', { entity: item.result});
|
||||||
modal.showModal = false;
|
}, this
|
||||||
},
|
);
|
||||||
removeEntity(entity) {
|
this.$refs.addPersons.resetSearch(); // to cast child method
|
||||||
if (!this.$props.removableIfSet) {
|
modal.showModal = false;
|
||||||
return;
|
},
|
||||||
}
|
removeEntity(entity) {
|
||||||
this.$emit('removeEntity', entity);
|
if (!this.$props.removableIfSet) {
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
this.$emit('removeEntity',{ entity: entity });
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -249,7 +249,11 @@
|
|||||||
|
|
||||||
{% block pick_entity_dynamic_widget %}
|
{% block pick_entity_dynamic_widget %}
|
||||||
<input type="hidden" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value|escape('html_attr') }}" {% endif %} data-input-uniqid="{{ form.vars['uniqid'] }}"/>
|
<input type="hidden" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value|escape('html_attr') }}" {% endif %} data-input-uniqid="{{ form.vars['uniqid'] }}"/>
|
||||||
<div data-module="pick-dynamic" data-types="{{ form.vars['types']|json_encode }}" data-multiple="{{ form.vars['multiple'] }}" data-uniqid="{{ form.vars['uniqid'] }}"></div>
|
<div data-module="pick-dynamic"
|
||||||
|
data-types="{{ form.vars['types']|json_encode }}"
|
||||||
|
data-multiple="{{ form.vars['multiple'] }}"
|
||||||
|
data-uniqid="{{ form.vars['uniqid'] }}"
|
||||||
|
data-suggested="{{ form.vars['suggested']|json_encode|escape('html_attr') }}"></div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block pick_postal_code_widget %}
|
{% block pick_postal_code_widget %}
|
||||||
@ -269,4 +273,4 @@
|
|||||||
{{ form_errors(form.fixedDate) }}
|
{{ form_errors(form.fixedDate) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -36,6 +36,11 @@ interface EntityWorkflowHandlerInterface
|
|||||||
*/
|
*/
|
||||||
public function getRoleShow(EntityWorkflow $entityWorkflow): ?string;
|
public function getRoleShow(EntityWorkflow $entityWorkflow): ?string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return User[]
|
||||||
|
*/
|
||||||
|
public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array;
|
||||||
|
|
||||||
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string;
|
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string;
|
||||||
|
|
||||||
public function getTemplateData(EntityWorkflow $entityWorkflow, array $options = []): array;
|
public function getTemplateData(EntityWorkflow $entityWorkflow, array $options = []): array;
|
||||||
|
@ -18,21 +18,25 @@ use Symfony\Component\Form\FormInterface;
|
|||||||
use Symfony\Component\Form\FormView;
|
use Symfony\Component\Form\FormView;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pick user dymically, using vuejs module "AddPerson".
|
* m* Pick user dymically, using vuejs module "AddPerson".
|
||||||
*/
|
*/
|
||||||
class PickPersonDynamicType extends AbstractType
|
class PickPersonDynamicType extends AbstractType
|
||||||
{
|
{
|
||||||
private DenormalizerInterface $denormalizer;
|
private DenormalizerInterface $denormalizer;
|
||||||
|
|
||||||
|
private DenormalizerInterface $normalizer;
|
||||||
|
|
||||||
private SerializerInterface $serializer;
|
private SerializerInterface $serializer;
|
||||||
|
|
||||||
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer)
|
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer, NormalizerInterface $normalizer)
|
||||||
{
|
{
|
||||||
$this->denormalizer = $denormalizer;
|
$this->denormalizer = $denormalizer;
|
||||||
$this->serializer = $serializer;
|
$this->serializer = $serializer;
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
@ -45,6 +49,11 @@ class PickPersonDynamicType extends AbstractType
|
|||||||
$view->vars['multiple'] = $options['multiple'];
|
$view->vars['multiple'] = $options['multiple'];
|
||||||
$view->vars['types'] = ['person'];
|
$view->vars['types'] = ['person'];
|
||||||
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
||||||
|
$view->vars['suggested'] = [];
|
||||||
|
|
||||||
|
foreach ($options['suggested'] as $person) {
|
||||||
|
$view->vars['suggested'][] = $this->normalizer->normalize($person, 'json', ['groups' => 'read']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
@ -52,7 +61,8 @@ class PickPersonDynamicType extends AbstractType
|
|||||||
$resolver
|
$resolver
|
||||||
->setDefault('multiple', false)
|
->setDefault('multiple', false)
|
||||||
->setAllowedTypes('multiple', ['bool'])
|
->setAllowedTypes('multiple', ['bool'])
|
||||||
->setDefault('compound', false);
|
->setDefault('compound', false)
|
||||||
|
->setDefault('suggested', []);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBlockPrefix()
|
public function getBlockPrefix()
|
||||||
|
@ -97,6 +97,21 @@ class AccompanyingPeriodWorkEvaluationDocumentWorkflowHandler implements EntityW
|
|||||||
return AccompanyingPeriodWorkEvaluationDocumentVoter::SEE;
|
return AccompanyingPeriodWorkEvaluationDocumentVoter::SEE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array
|
||||||
|
{
|
||||||
|
$suggestedUsers = $entityWorkflow->getUsersInvolved();
|
||||||
|
|
||||||
|
$referrer = $this->getRelatedEntity($entityWorkflow)
|
||||||
|
->getAccompanyingPeriodWorkEvaluation()
|
||||||
|
->getAccompanyingPeriodWork()
|
||||||
|
->getAccompanyingPeriod()
|
||||||
|
->getUser();
|
||||||
|
|
||||||
|
$suggestedUsers[spl_object_hash($referrer)] = $referrer;
|
||||||
|
|
||||||
|
return $suggestedUsers;
|
||||||
|
}
|
||||||
|
|
||||||
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
||||||
{
|
{
|
||||||
return '@ChillPerson/Workflow/_evaluation_document.html.twig';
|
return '@ChillPerson/Workflow/_evaluation_document.html.twig';
|
||||||
|
@ -87,6 +87,20 @@ class AccompanyingPeriodWorkEvaluationWorkflowHandler implements EntityWorkflowH
|
|||||||
return AccompanyingPeriodWorkEvaluationVoter::SEE;
|
return AccompanyingPeriodWorkEvaluationVoter::SEE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array
|
||||||
|
{
|
||||||
|
$suggestedUsers = $entityWorkflow->getUsersInvolved();
|
||||||
|
|
||||||
|
$referrer = $this->getRelatedEntity($entityWorkflow)
|
||||||
|
->getAccompanyingPeriodWork()
|
||||||
|
->getAccompanyingPeriod()
|
||||||
|
->getUser();
|
||||||
|
|
||||||
|
$suggestedUsers[spl_object_hash($referrer)] = $referrer;
|
||||||
|
|
||||||
|
return $suggestedUsers;
|
||||||
|
}
|
||||||
|
|
||||||
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
||||||
{
|
{
|
||||||
return '@ChillPerson/Workflow/_evaluation.html.twig';
|
return '@ChillPerson/Workflow/_evaluation.html.twig';
|
||||||
|
@ -94,6 +94,19 @@ class AccompanyingPeriodWorkWorkflowHandler implements EntityWorkflowHandlerInte
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSuggestedUsers(EntityWorkflow $entityWorkflow): array
|
||||||
|
{
|
||||||
|
$suggestedUsers = $entityWorkflow->getUsersInvolved();
|
||||||
|
|
||||||
|
$referrer = $this->getRelatedEntity($entityWorkflow)
|
||||||
|
->getAccompanyingPeriod()
|
||||||
|
->getUser();
|
||||||
|
|
||||||
|
$suggestedUsers[spl_object_hash($referrer)] = $referrer;
|
||||||
|
|
||||||
|
return $suggestedUsers;
|
||||||
|
}
|
||||||
|
|
||||||
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
public function getTemplate(EntityWorkflow $entityWorkflow, array $options = []): string
|
||||||
{
|
{
|
||||||
return '@ChillPerson/Workflow/_accompanying_period_work.html.twig';
|
return '@ChillPerson/Workflow/_accompanying_period_work.html.twig';
|
||||||
|
@ -18,6 +18,7 @@ use Symfony\Component\Form\FormInterface;
|
|||||||
use Symfony\Component\Form\FormView;
|
use Symfony\Component\Form\FormView;
|
||||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||||
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
|
||||||
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
use Symfony\Component\Serializer\SerializerInterface;
|
use Symfony\Component\Serializer\SerializerInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -27,12 +28,15 @@ class PickThirdpartyDynamicType extends AbstractType
|
|||||||
{
|
{
|
||||||
private DenormalizerInterface $denormalizer;
|
private DenormalizerInterface $denormalizer;
|
||||||
|
|
||||||
|
private NormalizerInterface $normalizer;
|
||||||
|
|
||||||
private SerializerInterface $serializer;
|
private SerializerInterface $serializer;
|
||||||
|
|
||||||
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer)
|
public function __construct(DenormalizerInterface $denormalizer, SerializerInterface $serializer, NormalizerInterface $normalizer)
|
||||||
{
|
{
|
||||||
$this->denormalizer = $denormalizer;
|
$this->denormalizer = $denormalizer;
|
||||||
$this->serializer = $serializer;
|
$this->serializer = $serializer;
|
||||||
|
$this->normalizer = $normalizer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||||
@ -45,6 +49,11 @@ class PickThirdpartyDynamicType extends AbstractType
|
|||||||
$view->vars['multiple'] = $options['multiple'];
|
$view->vars['multiple'] = $options['multiple'];
|
||||||
$view->vars['types'] = ['thirdparty'];
|
$view->vars['types'] = ['thirdparty'];
|
||||||
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
$view->vars['uniqid'] = uniqid('pick_user_dyn');
|
||||||
|
$view->vars['suggested'] = [];
|
||||||
|
|
||||||
|
foreach ($options['suggested'] as $tp) {
|
||||||
|
$view->vars['suggested'][] = $this->normalizer->normalize($tp, 'json', ['groups' => 'read']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function configureOptions(OptionsResolver $resolver)
|
public function configureOptions(OptionsResolver $resolver)
|
||||||
@ -52,7 +61,8 @@ class PickThirdpartyDynamicType extends AbstractType
|
|||||||
$resolver
|
$resolver
|
||||||
->setDefault('multiple', false)
|
->setDefault('multiple', false)
|
||||||
->setAllowedTypes('multiple', ['bool'])
|
->setAllowedTypes('multiple', ['bool'])
|
||||||
->setDefault('compound', false);
|
->setDefault('compound', false)
|
||||||
|
->setDefault('suggested', []);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getBlockPrefix()
|
public function getBlockPrefix()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user