chg: [metaTemplate:updateStrategyDelete] Restored strategy to update a template and delete conflicting metafields

develop-unstable
Sami Mokaddem 2023-02-16 13:51:36 +01:00
parent 97a151aff5
commit adad45baf6
No known key found for this signature in database
GPG Key ID: 164C473F627A06FA
2 changed files with 26 additions and 25 deletions

View File

@ -22,13 +22,14 @@ class MetaTemplatesTable extends AppTable
public const UPDATE_STRATEGY_CREATE_NEW = 'create_new'; public const UPDATE_STRATEGY_CREATE_NEW = 'create_new';
public const UPDATE_STRATEGY_UPDATE_EXISTING = 'update_existing'; public const UPDATE_STRATEGY_UPDATE_EXISTING = 'update_existing';
public const UPDATE_STRATEGY_KEEP_BOTH = 'keep_both'; public const UPDATE_STRATEGY_KEEP_BOTH = 'keep_both';
public const UPDATE_STRATEGY_DELETE = 'delete_all'; public const UPDATE_STRATEGY_DELETE_ALL = 'delete_all';
public const DEFAULT_STRATEGY = MetaTemplatesTable::UPDATE_STRATEGY_UPDATE_EXISTING; public const DEFAULT_STRATEGY = MetaTemplatesTable::UPDATE_STRATEGY_UPDATE_EXISTING;
public const ALLOWED_STRATEGIES = [ public const ALLOWED_STRATEGIES = [
MetaTemplatesTable::UPDATE_STRATEGY_CREATE_NEW, MetaTemplatesTable::UPDATE_STRATEGY_CREATE_NEW,
MetaTemplatesTable::UPDATE_STRATEGY_UPDATE_EXISTING, MetaTemplatesTable::UPDATE_STRATEGY_UPDATE_EXISTING,
MetaTemplatesTable::UPDATE_STRATEGY_KEEP_BOTH, MetaTemplatesTable::UPDATE_STRATEGY_KEEP_BOTH,
MetaTemplatesTable::UPDATE_STRATEGY_DELETE_ALL,
]; ];
private $templatesOnDisk = null; private $templatesOnDisk = null;
@ -159,7 +160,7 @@ class MetaTemplatesTable extends AppTable
$files_processed[] = $templateOnDisk['uuid']; $files_processed[] = $templateOnDisk['uuid'];
} }
if (!empty($result['errors'])) { if (!empty($result['errors'])) {
$updatesErrors[] = $errors; $updatesErrors[] = implode(', ', Hash::extract($result['errors'], '{n}.message'));
} }
$results = [ $results = [
'update_errors' => $updatesErrors, 'update_errors' => $updatesErrors,
@ -868,6 +869,8 @@ class MetaTemplatesTable extends AppTable
$result = $this->updateMetaTemplate($metaTemplate, $template); $result = $this->updateMetaTemplate($metaTemplate, $template);
} else if ($strategy == MetaTemplatesTable::UPDATE_STRATEGY_CREATE_NEW) { } else if ($strategy == MetaTemplatesTable::UPDATE_STRATEGY_CREATE_NEW) {
$result = $this->executeStrategyCreateNew($template, $metaTemplate); $result = $this->executeStrategyCreateNew($template, $metaTemplate);
} else if ($strategy == MetaTemplatesTable::UPDATE_STRATEGY_DELETE_ALL) {
$result = $this->executeStrategyDeleteAll($template, $metaTemplate);
} else { } else {
$errors[] = new UpdateError(false, __('Invalid strategy {0}', $strategy)); $errors[] = new UpdateError(false, __('Invalid strategy {0}', $strategy));
return false; return false;
@ -969,7 +972,7 @@ class MetaTemplatesTable extends AppTable
unset($entity->meta_fields[$i]); unset($entity->meta_fields[$i]);
} }
} }
$this->MetaTemplateFields->MetaFields->unlink($entity, $metaFieldsToDelete); // FIXME $this->MetaTemplateFields->MetaFields->unlink($entity, $metaFieldsToDelete);
} }
} }
$success = $this->supersedeMetaFieldsWithMetaTemplateField($entity->meta_fields, $newestMetaTemplate); $success = $this->supersedeMetaFieldsWithMetaTemplateField($entity->meta_fields, $newestMetaTemplate);
@ -1013,9 +1016,7 @@ class MetaTemplatesTable extends AppTable
foreach ($entities as $entity) { foreach ($entities as $entity) {
$conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template); $conflicts = $this->getMetaFieldsConflictsUnderTemplate($entity['meta_fields'], $template);
$deletedCount = $this->MetaTemplateFields->MetaFields->deleteAll([ $this->MetaTemplateFields->MetaFields->unlink($entity, $conflicts);
'id IN' => $conflicts
]);
} }
$this->updateMetaTemplate($metaTemplate, $template, $errors); $this->updateMetaTemplate($metaTemplate, $template, $errors);
return !empty($errors) ? $errors[0] : true; return !empty($errors) ? $errors[0] : true;

View File

@ -1,7 +1,7 @@
<?php <?php
$create_new_allowed = true; $create_new_allowed = true;
$update_allowed = true; $update_allowed = true;
$delete_all_allowed = false; $delete_all_allowed = true;
$totalAllowed = $create_new_allowed + $update_allowed + $delete_all_allowed; $totalAllowed = $create_new_allowed + $update_allowed + $delete_all_allowed;
$maxWidth = 99 - ($create_new_allowed ? 33 : 0) - ($update_allowed ? 33 : 0) - ($delete_all_allowed ? 33 : 0); $maxWidth = 99 - ($create_new_allowed ? 33 : 0) - ($update_allowed ? 33 : 0) - ($delete_all_allowed ? 33 : 0);
$defaultStrategy = 'update_existing'; $defaultStrategy = 'update_existing';
@ -19,7 +19,7 @@ $form = $this->element('genericElements/Form/genericForm', [
'options' => [ 'options' => [
['value' => 'create_new', 'text' => 'create_new', 'id' => 'radio_create_new'], ['value' => 'create_new', 'text' => 'create_new', 'id' => 'radio_create_new'],
['value' => 'update_existing', 'text' => 'update', 'id' => 'radio_update'], ['value' => 'update_existing', 'text' => 'update', 'id' => 'radio_update'],
['value' => 'delete', 'text' => 'delete', 'id' => 'radio_delete'], ['value' => 'delete_all', 'text' => 'delete_all', 'id' => 'radio_delete_all'],
], ],
] ]
], ],
@ -33,6 +33,22 @@ $form = $this->element('genericElements/Form/genericForm', [
<div class="conflict-resolution-picker"> <div class="conflict-resolution-picker">
<div class="mt-3 d-flex justify-content-center"> <div class="mt-3 d-flex justify-content-center">
<div class="btn-group justify-content-center" role="group" aria-label="Basic radio toggle button group"> <div class="btn-group justify-content-center" role="group" aria-label="Basic radio toggle button group">
<?php if ($delete_all_allowed) : ?>
<input type="radio" class="btn-check" name="btnradio" id="btnradio3" autocomplete="off" value="delete" <?= $defaultStrategy == 'delete' ? 'checked' : '' ?>>
<label class="btn btn-outline-danger mw-<?= $maxWidth ?>" for="btnradio3">
<div>
<h5 class="mb-3">
<?= $defaultStrategy == 'delete' ? $this->Bootstrap->badge(['text' => 'recommended', 'variant' => 'success', 'class' => ['mb-3', 'fs-8']]) : '' ?>
<?= __('Delete conflicting fields') ?>
</h5>
<ul class="text-start fs-7">
<li><?= __('Meta-fields not satisfying the new meta-template definition will be deleted.') ?></li>
<li><?= __('All other meta-fields will be upgraded to the new meta-template.') ?></li>
</ul>
</div>
</label>
<?php endif; ?>
<?php if ($create_new_allowed) : ?> <?php if ($create_new_allowed) : ?>
<input type="radio" class="btn-check" name="btnradio" id="btnradio1" autocomplete="off" value="create_new" <?= $defaultStrategy == 'create_new' ? 'checked' : '' ?>> <input type="radio" class="btn-check" name="btnradio" id="btnradio1" autocomplete="off" value="create_new" <?= $defaultStrategy == 'create_new' ? 'checked' : '' ?>>
<label class="btn btn-outline-warning mw-<?= $maxWidth ?>" for="btnradio1"> <label class="btn btn-outline-warning mw-<?= $maxWidth ?>" for="btnradio1">
@ -66,22 +82,6 @@ $form = $this->element('genericElements/Form/genericForm', [
</div> </div>
</label> </label>
<?php endif; ?> <?php endif; ?>
<?php if ($delete_all_allowed) : ?>
<input type="radio" class="btn-check" name="btnradio" id="btnradio3" autocomplete="off" value="delete" <?= $defaultStrategy == 'delete' ? 'checked' : '' ?>>
<label class="btn btn-outline-danger mw-<?= $maxWidth ?>" for="btnradio3">
<div>
<h5 class="mb-3">
<?= $defaultStrategy == 'delete' ? $this->Bootstrap->badge(['text' => 'recommended', 'variant' => 'success', 'class' => ['mb-3', 'fs-8']]) : '' ?>
<?= __('Delete conflicting fields') ?>
</h5>
<ul class="text-start fs-7">
<li><?= __('Meta-fields not satisfying the new meta-template definition will be deleted.') ?></li>
<li><?= __('All other meta-fields will be upgraded to the new meta-template.') ?></li>
</ul>
</div>
</label>
<?php endif; ?>
</div> </div>
</div> </div>
</div> </div>
@ -95,7 +95,7 @@ $form = $this->element('genericElements/Form/genericForm', [
const $form = $('.conflict-resolution-form-container form') const $form = $('.conflict-resolution-form-container form')
const $create = $form.find('input#radio_create_new') const $create = $form.find('input#radio_create_new')
const $keep = $form.find('input#radio_update') const $keep = $form.find('input#radio_update')
const $delete = $form.find('input#radio_delete') const $delete = $form.find('input#radio_delete_all')
$(document).ready(function() { $(document).ready(function() {
$('.conflict-resolution-picker').find('input[type="radio"]').change(function() { $('.conflict-resolution-picker').find('input[type="radio"]').change(function() {