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\Http\Exception\NotFoundException;
use Cake\Http\Exception\MethodNotAllowedException;
use Cake\Routing\Router;
class MetaTemplatesController extends AppController
{
@ -17,50 +19,6 @@ class MetaTemplatesController extends AppController
public $filterFields = ['name', 'uuid', 'scope', 'namespace'];
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()
{
if ($this->request->is('post')) {
@ -180,10 +138,12 @@ class MetaTemplatesController extends AppController
{
$metaTemplate = $this->MetaTemplates->get($template_id);
$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('newestMetaTemplate', $newestMetaTemplate);
$this->set('entities', $entities);
$this->set('amountOfEntitiesToUpdate', $amountOfEntitiesToUpdate);
}
public function migrateOldMetaTemplateToNewestVersionForEntity($template_id, $entity_id)
@ -232,9 +192,12 @@ class MetaTemplatesController extends AppController
$message,
$savedData,
[],
['redirect' => [
'controller' => $className,
'action' => 'view', $entity_id]
[
'redirect' => [
'controller' => $className,
'action' => 'view', $entity_id,
'url' => Router::url(['controller' => $className, 'action' => 'view', $entity_id])
]
]
);
$responsePayload = $this->CRUD->getResponsePayload();
@ -242,7 +205,7 @@ class MetaTemplatesController extends AppController
return $responsePayload;
}
}
$conflicts = $this->MetaTemplates->getMetaTemplateConflictsForMetaTemplate($metaTemplate, $newestMetaTemplate);
$conflicts = $this->MetaTemplates->getMetaFieldsConflictsUnderTemplate($entity->meta_fields, $newestMetaTemplate);
foreach ($conflicts as $conflict) {
if (!empty($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'])) {
continue;
}
foreach ($newestMetaTemplate->meta_template_fields as $newMetaTemplateField) {
foreach ($newestMetaTemplate->meta_template_fields as $i => $newMetaTemplateField) {
if ($metaTemplateField->field == $newMetaTemplateField->field && empty($newMetaTemplateField->metaFields)) {
$movedMetaTemplateFields[] = $metaTemplateField->id;
$copiedMetaFields = array_map(function ($e) use ($newMetaTemplateField) {
@ -298,14 +261,12 @@ class MetaTemplatesController extends AppController
]
],
'contain' => $this->containFields,
'afterFind' => function($data) use ($templatesUpdateStatus) {
foreach ($data as $i => $metaTemplate) {
if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) {
$templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate);
$metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate));
}
'afterFind' => function($metaTemplate) use ($templatesUpdateStatus) {
if (!empty($templatesUpdateStatus[$metaTemplate->uuid])) {
$templateStatus = $this->MetaTemplates->getStatusForMetaTemplate($templatesUpdateStatus[$metaTemplate->uuid]['template'], $metaTemplate);
$metaTemplate->set('updateStatus', $this->MetaTemplates->computeFullUpdateStatusForMetaTemplate($templateStatus, $metaTemplate));
}
return $data;
return $metaTemplate;
}
]);
$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
*
* @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
*/
public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId): array
public function getEntitiesHavingMetaFieldsFromTemplate(int $metaTemplateId, $limit=10, int &$totalAmount=0): array
{
$metaTemplate = $this->get($metaTemplateId);
$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();
return $entities;
}
@ -876,7 +881,7 @@ class MetaTemplatesTable extends AppTable
$this->updateMetaTemplate($metaTemplate, $template, $errors);
return !empty($errors) ? $errors[0] : true;
}
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id);
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null);
$conflictingEntities = [];
foreach ($entities as $entity) {
@ -935,7 +940,7 @@ class MetaTemplatesTable extends AppTable
$this->updateMetaTemplate($metaTemplate, $template, $errors);
return !empty($errors) ? $errors[0] : true;
}
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id);
$entities = $this->getEntitiesHavingMetaFieldsFromTemplate($metaTemplate->id, null);
foreach ($entities as $entity) {
$conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template);
@ -1002,11 +1007,18 @@ class MetaTemplatesTable extends AppTable
*/
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 = [];
$metaTemplateFieldByName = [];
$existingMetaTemplate = !is_array($template);
$metaTemplateFields = !$existingMetaTemplate ? $template['metaFields'] : $template->meta_template_fields;
foreach ($metaTemplateFields as $metaTemplateField) {
if (!is_array($template)) {
$metaTemplateField = $metaTemplateField->toArray();
}
$metaTemplateFieldByName[$metaTemplateField['field']] = $this->MetaTemplateFields->newEntity($metaTemplateField);
}
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.
* 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 array $templateField

View File

@ -28,6 +28,9 @@ foreach ($entities as $entity) {
__('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>';
echo $this->Bootstrap->modal([

View File

@ -1,5 +1,7 @@
<?
<?php
use Cake\Utility\Inflector;
use Cake\Routing\Router;
?>
<h3><?= h($oldMetaTemplate->name) ?></h3>
<div class="container-fluid">
@ -7,7 +9,13 @@
<div class="col">
<div class="panel">
<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([
'text' => __('Data to be migrated over'),
@ -32,7 +40,13 @@
<div class="col">
<div class="panel">
<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([
'text' => __('Data to be saved'),
@ -86,7 +100,10 @@ echo $this->Html->scriptBlock(sprintf(
function submitMigration() {
const $form = $('.to-save-container form')
console.log($form.attr('action'));
AJAXApi.quickPostForm($form[0])
// $form.submit()
AJAXApi.quickPostForm($form[0]).then((postResult) => {
if (postResult.additionalData.redirect.url !== undefined) {
window.location = postResult.additionalData.redirect.url
}
})
}
</script>

View File

@ -30,9 +30,13 @@ foreach ($metaTemplate->meta_template_fields as $metaTemplateField) {
} else {
$metaField = reset($metaTemplateField->metaFields);
$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,
];
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);
$fieldsHtml .= $this->element(
'genericElements/Form/fieldScaffold',