fix: [metaTemplate] Various fixed on meta-templates updates
parent
86946719c7
commit
a98c7f8f32
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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([
|
||||||
|
|
|
@ -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>
|
|
@ -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',
|
||||||
|
|
Loading…
Reference in New Issue