fix: repository metadata are not changing sections #722

This commit is contained in:
vnmedeiros 2022-08-31 16:59:02 -03:00
parent 03ba38c2be
commit e85cb6b3af
6 changed files with 75 additions and 12 deletions

View File

@ -488,8 +488,6 @@ class REST_Metadata_Controller extends REST_Controller {
$metadatum = $this->metadatum_repository->fetch($metadatum_id);
$error_message = __('Metadata with this ID was not found', 'tainacan');
if ($metadatum) {
// These conditions are for verify if endpoints are used correctly
if(!$collection_id && $metadatum->get_collection_id() !== 'default') {
@ -498,14 +496,14 @@ class REST_Metadata_Controller extends REST_Controller {
return new \WP_REST_Response( [
'error_message' => $error_message,
'metadatum_id' => $metadatum_id
] );
], 400 );
} elseif ($collection_id && $metadatum->get_collection_id() === 'default'){
$error_message = __('This metadata is not a collection metadata', 'tainacan');
return new \WP_REST_Response( [
'error_message' => $error_message,
'metadatum_id' => $metadatum_id
] );
], 400 );
}
if (isset($request['repository_level']) && $confirm_repository) {
@ -515,7 +513,7 @@ class REST_Metadata_Controller extends REST_Controller {
$prepared_metadata = $this->prepare_item_for_updating($metadatum, $attributes);
if($prepared_metadata->validate()){
$updated_metadata = $this->metadatum_repository->update($prepared_metadata);
$updated_metadata = $this->metadatum_repository->update($prepared_metadata, $attributes);
$response = $this->prepare_item_for_response($updated_metadata, $request);
@ -529,6 +527,7 @@ class REST_Metadata_Controller extends REST_Controller {
], 400);
}
$error_message = __('Metadata with this ID was not found', 'tainacan');
return new \WP_REST_Response( [
'error_message' => $error_message,
'metadatum_id' => $metadatum_id

View File

@ -450,7 +450,10 @@ class Metadatum extends Entity {
* @param [string] $value
* @return void
*/
function set_metadata_section_id( $value) {
function set_metadata_section_id($value) {
if( !is_array($value) ) {
$value = [$value];
}
return $this->set_mapped_property('metadata_section_id', $value);
}
@ -497,6 +500,15 @@ class Metadatum extends Entity {
return $this->get_required() === 'yes';
}
/**
* Return true if is repository level, else return false
*
* @return boolean
*/
function is_repository_level() {
return $this->get_collection_id() === 'default';
}
/**
* {@inheritdoc }
*

View File

@ -377,10 +377,36 @@ class Metadata_Sections extends Repository {
}
public function get_default_section_metadata_object_list (Entities\Collection $collection, $args = []) {
$metadata_repository = \Tainacan\Repositories\Metadata::get_instance();
$metadata_sections_ids = $this->fetch_ids();
$collection_metadata_sections_id = array_diff(array_map(function($el) {return $el->get_id();} , $this->fetch_by_collection($collection)), [\Tainacan\Entities\Metadata_Section::$default_section_slug]);
$args_exclude = array_merge(
array(
'meta_query' => array(
'relation' => 'AND',
array(
array(
'key' => 'collection_id',
'value' => 'default',
'compare' => '='
),
array(
'key' => 'metadata_section_id',
'value' => $collection_metadata_sections_id,
'compare' => 'IN'
)
)
)
)
);
$list_exclude = $metadata_repository->fetch_by_collection($collection, $args_exclude);
$not_post_ids = array_map(function($el) { return $el->get_id(); }, $list_exclude);
$args = array_merge(
$args,
array(
'post__not_in' => $not_post_ids,
'meta_query' => array(
array(
'relation' => 'OR',
@ -399,12 +425,11 @@ class Metadata_Sections extends Repository {
'key' => 'metadata_section_id',
'value' => $metadata_sections_ids,
'compare' => 'NOT IN'
),
)
)
)
)
);
$metadata_repository = \Tainacan\Repositories\Metadata::get_instance();
$metadata_list = $metadata_repository->fetch_by_collection($collection, $args);
return $metadata_list;
}

View File

@ -227,7 +227,7 @@ class Metadata extends Repository {
'default' => 'no'
],
'metadata_section_id' => [
'map' => 'meta',
'map' => 'meta_multi',
'title' => __( 'Metadata section', 'tainacan' ),
'type' => ['integer', 'string', 'array'],
'description' => __( 'The metadata section ID', 'tainacan' ),
@ -743,6 +743,30 @@ class Metadata extends Repository {
return $new_metadatum;
}
public function pre_update_metadata_repository_level($metadatum, $attributes) {
if (isset($attributes['target_collection_id']) && is_numeric($attributes['target_collection_id']) && $metadatum->is_repository_level()) {
$collection = \tainacan_collections()->fetch($attributes['target_collection_id'], 'OBJECT');
$new_metadata_section_id = $metadatum->get_metadata_section_id();
$new_metadata_section_id = is_array($new_metadata_section_id) ? $new_metadata_section_id[0] : $new_metadata_section_id;
if($collection instanceof \Tainacan\Entities\Collection) {
$collection_metadata_sections_id = array_filter(
array_map(function($el) {return $el->get_id();} , \tainacan_metadata_sections()->fetch_by_collection($collection)),
function($el) {return $el != \Tainacan\Entities\Metadata_Section::$default_section_slug;}
);
$old_value = get_post_meta($metadatum->get_id(), 'metadata_section_id');
$new_value = array_diff($old_value, $collection_metadata_sections_id);
$new_value[] = (string)$new_metadata_section_id;
$metadatum->set_metadata_section_id($new_value);
if(!$metadatum->validate()) {
throw new \Exception( $metadatum->get_errors() );
}
}
}
return $metadatum;
}
/**
* @param $object
* @param $new_values
@ -751,6 +775,7 @@ class Metadata extends Repository {
* @throws \Exception
*/
public function update( $object, $new_values = null ) {
$object = $this->pre_update_metadata_repository_level($object, $new_values);
return $this->insert( $object );
}

View File

@ -636,7 +636,7 @@ export default {
this.updateMetadatum({
collectionId: this.collectionId,
metadatumId: event.added.element.id,
isRepositoryLevel: false,
isRepositoryLevel: event.added.element.collection_id === 'default',
index: event.added.newIndex,
options: {},
includeOptionsAsHtml: true,

View File

@ -111,10 +111,12 @@ export const updateMetadatum = ({commit}, {collectionId, metadatumId, isReposito
return new Promise((resolve, reject) => {
let endpoint = '';
if (!isRepositoryLevel)
if (!isRepositoryLevel) {
endpoint = '/collection/' + collectionId + '/metadata/' + metadatumId;
else
} else {
endpoint = '/metadata/' + metadatumId;
options['target_collection_id'] = collectionId;
}
endpoint += '?context=edit';