fix: [metaTemplate] Various fixed on meta-templates updates

pull/93/head
Sami Mokaddem 2022-01-20 12:00:39 +01:00
parent 86946719c7
commit a98c7f8f32
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
5 changed files with 66 additions and 69 deletions

View File

@ -10,6 +10,8 @@ use Cake\ORM\TableRegistry;
use \Cake\Database\Expression\QueryExpression; use \Cake\Database\Expression\QueryExpression;
use Cake\Http\Exception\NotFoundException; use Cake\Http\Exception\NotFoundException;
use Cake\Http\Exception\MethodNotAllowedException; use Cake\Http\Exception\MethodNotAllowedException;
use Cake\Routing\Router;
class MetaTemplatesController extends AppController class MetaTemplatesController extends AppController
{ {
@ -17,50 +19,6 @@ class MetaTemplatesController extends AppController
public $filterFields = ['name', 'uuid', 'scope', 'namespace']; public $filterFields = ['name', 'uuid', 'scope', 'namespace'];
public $containFields = ['MetaTemplateFields']; public $containFields = ['MetaTemplateFields'];
// public function update($template_uuid=null)
// {
// $metaTemplate = false;
// if (!is_null($template_uuid)) {
// $metaTemplate = $this->MetaTemplates->find()->where([
// 'uuid' => $template_uuid
// ])->first();
// if (empty($metaTemplate)) {
// throw new NotFoundException(__('Invalid {0}.', $this->MetaTemplates->getAlias()));
// }
// }
// if ($this->request->is('post')) {
// $updateStrategy = $this->request->getData('update_strategy', null);
// $result = $this->MetaTemplates->update($template_uuid, $updateStrategy);
// if ($this->ParamHandler->isRest()) {
// return $this->RestResponse->viewData($result, 'json');
// } else {
// if ($result['success']) {
// $message = __n('{0} templates updated.', 'The template has been updated.', empty($template_uuid), $result['files_processed']);
// } else {
// $message = __n('{0} templates could not be updated.', 'The template could not be updated.', empty($template_uuid), $result['files_processed']);
// }
// $this->CRUD->setResponseForController('update', $result['success'], $message, $result['files_processed'], $result['update_errors'], ['redirect' => $this->referer()]);
// $responsePayload = $this->CRUD->getResponsePayload();
// if (!empty($responsePayload)) {
// return $responsePayload;
// }
// }
// } else {
// if (!$this->ParamHandler->isRest()) {
// if (!is_null($template_uuid)) {
// $this->set('metaTemplate', $metaTemplate);
// $this->setUpdateStatus($metaTemplate->id);
// } else {
// $this->set('title', __('Update Meta Templates'));
// $this->set('question', __('Are you sure you wish to update the Meta Template definitions'));
// $templatesUpdateStatus = $this->MetaTemplates->getUpdateStatusForTemplates();
// $this->set('templatesUpdateStatus', $templatesUpdateStatus);
// $this->render('updateAll');
// }
// }
// }
// }
public function updateAllTemplates() public function updateAllTemplates()
{ {
if ($this->request->is('post')) { if ($this->request->is('post')) {
@ -180,10 +138,12 @@ class MetaTemplatesController extends AppController
{ {
$metaTemplate = $this->MetaTemplates->get($template_id); $metaTemplate = $this->MetaTemplates->get($template_id);
$newestMetaTemplate = $this->MetaTemplates->getNewestVersion($metaTemplate); $newestMetaTemplate = $this->MetaTemplates->getNewestVersion($metaTemplate);
$entities = $this->MetaTemplates->getEntitiesHavingMetaFieldsFromTemplate($template_id); $amountOfEntitiesToUpdate = 0;
$entities = $this->MetaTemplates->getEntitiesHavingMetaFieldsFromTemplate($template_id, 10, $amountOfEntitiesToUpdate);
$this->set('metaTemplate', $metaTemplate); $this->set('metaTemplate', $metaTemplate);
$this->set('newestMetaTemplate', $newestMetaTemplate); $this->set('newestMetaTemplate', $newestMetaTemplate);
$this->set('entities', $entities); $this->set('entities', $entities);
$this->set('amountOfEntitiesToUpdate', $amountOfEntitiesToUpdate);
} }
public function migrateOldMetaTemplateToNewestVersionForEntity($template_id, $entity_id) public function migrateOldMetaTemplateToNewestVersionForEntity($template_id, $entity_id)
@ -232,9 +192,12 @@ class MetaTemplatesController extends AppController
$message, $message,
$savedData, $savedData,
[], [],
['redirect' => [ [
'controller' => $className, 'redirect' => [
'action' => 'view', $entity_id] 'controller' => $className,
'action' => 'view', $entity_id,
'url' => Router::url(['controller' => $className, 'action' => 'view', $entity_id])
]
] ]
); );
$responsePayload = $this->CRUD->getResponsePayload(); $responsePayload = $this->CRUD->getResponsePayload();
@ -242,7 +205,7 @@ class MetaTemplatesController extends AppController
return $responsePayload; return $responsePayload;
} }
} }
$conflicts = $this->MetaTemplates->getMetaTemplateConflictsForMetaTemplate($metaTemplate, $newestMetaTemplate); $conflicts = $this->MetaTemplates->getMetaFieldsConflictsUnderTemplate($entity->meta_fields, $newestMetaTemplate);
foreach ($conflicts as $conflict) { foreach ($conflicts as $conflict) {
if (!empty($conflict['existing_meta_template_field'])) { if (!empty($conflict['existing_meta_template_field'])) {
$existingMetaTemplateField = $conflict['existing_meta_template_field']; $existingMetaTemplateField = $conflict['existing_meta_template_field'];
@ -257,7 +220,7 @@ class MetaTemplatesController extends AppController
if (!empty($conflicts[$metaTemplateField->field]['conflicts'])) { if (!empty($conflicts[$metaTemplateField->field]['conflicts'])) {
continue; continue;
} }
foreach ($newestMetaTemplate->meta_template_fields as $newMetaTemplateField) { foreach ($newestMetaTemplate->meta_template_fields as $i => $newMetaTemplateField) {
if ($metaTemplateField->field == $newMetaTemplateField->field && empty($newMetaTemplateField->metaFields)) { if ($metaTemplateField->field == $newMetaTemplateField->field && empty($newMetaTemplateField->metaFields)) {
$movedMetaTemplateFields[] = $metaTemplateField->id; $movedMetaTemplateFields[] = $metaTemplateField->id;
$copiedMetaFields = array_map(function ($e) use ($newMetaTemplateField) { $copiedMetaFields = array_map(function ($e) use ($newMetaTemplateField) {
@ -298,14 +261,12 @@ class MetaTemplatesController extends AppController
] ]
], ],
'contain' => $this->containFields, 'contain' => $this->containFields,
'afterFind' => function($data) use ($templatesUpdateStatus) { 'afterFind' => function($metaTemplate) use ($templatesUpdateStatus) {
foreach ($data as $i => $metaTemplate) { if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) {
if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) { $templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate);
$templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate); $metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate));
$metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate));
}
} }
return $data; return $metaTemplate;
} }
]); ]);
$responsePayload = $this->CRUD->getResponsePayload(); $responsePayload = $this->CRUD->getResponsePayload();

View File

@ -595,9 +595,10 @@ class MetaTemplatesTable extends AppTable
* Collect all enties having meta-fields belonging to the provided template * Collect all enties having meta-fields belonging to the provided template
* *
* @param integer $template_id * @param integer $template_id
* @param integer|bool $limit The limit of entities to be returned. Pass null to be ignore the limit
* @return array List of entities * @return array List of entities
*/ */
public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId): array public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId, $limit=10, int &$totalAmount=0): array
{ {
$metaTemplate = $this->get($metaTemplateId); $metaTemplate = $this->get($metaTemplateId);
$queryParentEntities = $this->MetaTemplateFields->MetaFields->find(); $queryParentEntities = $this->MetaTemplateFields->MetaFields->find();
@ -618,6 +619,10 @@ class MetaTemplatesTable extends AppTable
] ]
] ]
]); ]);
if (!is_null($limit)) {
$totalAmount = $entityQuery->all()->count();
$entityQuery->limit($limit);
}
$entities = $entityQuery->all()->toList(); $entities = $entityQuery->all()->toList();
return $entities; return $entities;
} }
@ -876,7 +881,7 @@ class MetaTemplatesTable extends AppTable
$this->updateMetaTemplate($metaTemplate, $template, $errors); $this->updateMetaTemplate($metaTemplate, $template, $errors);
return !empty($errors) ? $errors[0] : true; return !empty($errors) ? $errors[0] : true;
} }
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id); $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null);
$conflictingEntities = []; $conflictingEntities = [];
foreach ($entities as $entity) { foreach ($entities as $entity) {
@ -935,7 +940,7 @@ class MetaTemplatesTable extends AppTable
$this->updateMetaTemplate($metaTemplate, $template, $errors); $this->updateMetaTemplate($metaTemplate, $template, $errors);
return !empty($errors) ? $errors[0] : true; return !empty($errors) ? $errors[0] : true;
} }
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id); $entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null);
foreach ($entities as $entity) { foreach ($entities as $entity) {
$conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template); $conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template);
@ -1002,11 +1007,18 @@ class MetaTemplatesTable extends AppTable
*/ */
public function getMetaFieldsConflictsUnderTemplate(array $metaFields, $template): array public function getMetaFieldsConflictsUnderTemplate(array $metaFields, $template): array
{ {
if (!is_array($template) && get_class($template) == 'App\Model\Entity\MetaTemplate') {
$metaTemplateFields = $template->meta_template_fields;
$existingMetaTemplate = true;
} else {
$metaTemplateFields = $template['metaFields'];
}
$conflicting = []; $conflicting = [];
$metaTemplateFieldByName = []; $metaTemplateFieldByName = [];
$existingMetaTemplate = !is_array($template);
$metaTemplateFields = !$existingMetaTemplate ? $template['metaFields'] : $template->meta_template_fields;
foreach ($metaTemplateFields as $metaTemplateField) { foreach ($metaTemplateFields as $metaTemplateField) {
if (!is_array($template)) {
$metaTemplateField = $metaTemplateField->toArray();
}
$metaTemplateFieldByName[$metaTemplateField['field']] = $this->MetaTemplateFields->newEntity($metaTemplateField); $metaTemplateFieldByName[$metaTemplateField['field']] = $this->MetaTemplateFields->newEntity($metaTemplateField);
} }
foreach ($metaFields as $metaField) { foreach ($metaFields as $metaField) {
@ -1026,7 +1038,7 @@ class MetaTemplatesTable extends AppTable
/** /**
* Compute the potential conflict that would be introduced by updating an existing meta-template-field with the provided one. * Compute the potential conflict that would be introduced by updating an existing meta-template-field with the provided one.
* This will go through all instanciation of the existing meta-template-field and checking their validaty against the provided one. * This will go through all instanciation of the existing meta-template-field and checking their validity against the provided one.
* *
* @param \App\Model\Entity\MetaTemplateField $metaTemplateField * @param \App\Model\Entity\MetaTemplateField $metaTemplateField
* @param array $templateField * @param array $templateField

View File

@ -28,6 +28,9 @@ foreach ($entities as $entity) {
__('has {0} meta-fields to update', count($entity->meta_fields)) __('has {0} meta-fields to update', count($entity->meta_fields))
); );
} }
if ($amountOfEntitiesToUpdate > 0) {
$bodyHtml .= sprintf('<li class="list-inline-item fw-light fs-7">%s</li>', __('{0} more entities', h($amountOfEntitiesToUpdate)));
}
$bodyHtml .= '</ul>'; $bodyHtml .= '</ul>';
echo $this->Bootstrap->modal([ echo $this->Bootstrap->modal([

View File

@ -1,5 +1,7 @@
<? <?php
use Cake\Utility\Inflector;
use Cake\Routing\Router;
?> ?>
<h3><?= h($oldMetaTemplate->name) ?></h3> <h3><?= h($oldMetaTemplate->name) ?></h3>
<div class="container-fluid"> <div class="container-fluid">
@ -7,7 +9,13 @@
<div class="col"> <div class="col">
<div class="panel"> <div class="panel">
<h4 class="d-flex justify-content-between align-items-center"> <h4 class="d-flex justify-content-between align-items-center">
<?= __('Version {0}', h($oldMetaTemplate->version)) ?> <?php
$url = Router::url([
'action' => 'view',
$oldMetaTemplate->id
]);
?>
<a href="<?= $url ?>" class="text-decoration-none" target="__blank"><?= __('Version {0}', h($oldMetaTemplate->version)) ?></a>
<?= <?=
$this->Bootstrap->badge([ $this->Bootstrap->badge([
'text' => __('Data to be migrated over'), 'text' => __('Data to be migrated over'),
@ -32,7 +40,13 @@
<div class="col"> <div class="col">
<div class="panel"> <div class="panel">
<h4 class="d-flex justify-content-between align-items-center"> <h4 class="d-flex justify-content-between align-items-center">
<?= __('Version {0}', h($newMetaTemplate->version)) ?> <?php
$url = Router::url([
'action' => 'view',
$newMetaTemplate->id
]);
?>
<a href="<?= $url ?>" class="text-decoration-none" target="__blank"><?= __('Version {0}', h($newMetaTemplate->version)) ?></a>
<?= <?=
$this->Bootstrap->badge([ $this->Bootstrap->badge([
'text' => __('Data to be saved'), 'text' => __('Data to be saved'),
@ -86,7 +100,10 @@ echo $this->Html->scriptBlock(sprintf(
function submitMigration() { function submitMigration() {
const $form = $('.to-save-container form') const $form = $('.to-save-container form')
console.log($form.attr('action')); console.log($form.attr('action'));
AJAXApi.quickPostForm($form[0]) AJAXApi.quickPostForm($form[0]).then((postResult) => {
// $form.submit() if (postResult.additionalData.redirect.url !== undefined) {
window.location = postResult.additionalData.redirect.url
}
})
} }
</script> </script>

View File

@ -30,9 +30,13 @@ foreach ($metaTemplate->meta_template_fields as $metaTemplateField) {
} else { } else {
$metaField = reset($metaTemplateField->metaFields); $metaField = reset($metaTemplateField->metaFields);
$fieldData = [ $fieldData = [
'field' => sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, $metaField->id),
'label' => $metaTemplateField->label, 'label' => $metaTemplateField->label,
]; ];
if (isset($metaField->id)) {
$fieldData['field'] = sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, $metaField->id);
} else {
$fieldData['field'] = sprintf('MetaTemplates.%s.meta_template_fields.%s.metaFields.%s.value', $metaField->meta_template_id, $metaField->meta_template_field_id, array_key_first($metaTemplateField->metaFields));
}
$this->Form->setTemplates($backupTemplates); $this->Form->setTemplates($backupTemplates);
$fieldsHtml .= $this->element( $fieldsHtml .= $this->element(
'genericElements/Form/fieldScaffold', 'genericElements/Form/fieldScaffold',