feat: add option to edit properties of the metadata section #184

This commit is contained in:
vnmedeiros 2022-08-12 11:40:30 -03:00
parent c5ec733c2c
commit 6fe458b1e3
8 changed files with 89 additions and 22 deletions

View File

@ -622,7 +622,7 @@ class REST_Collections_Controller extends REST_Controller {
if ( !is_array($val) ) { if ( !is_array($val) ) {
return false; return false;
} }
if ( !isset($val['id']) || (!is_numeric($val['id']) && $val['id'] != 'default_section' ) ) { if ( !isset($val['id']) || (!is_numeric($val['id']) && $val['id'] != \Tainacan\Entities\Metadata_Section::$default_section_slug ) ) {
return false; return false;
} }
if ( !isset($val['enabled']) || !is_bool($val['enabled']) ) { if ( !isset($val['enabled']) || !is_bool($val['enabled']) ) {
@ -646,7 +646,7 @@ class REST_Collections_Controller extends REST_Controller {
*/ */
public function update_metadata_order( $request ) { public function update_metadata_order( $request ) {
$collection_id = $request['collection_id']; $collection_id = $request['collection_id'];
$metadata_section_id = isset($request['metadata_section_id']) ? $request['metadata_section_id'] : 'default_section'; $metadata_section_id = isset($request['metadata_section_id']) ? $request['metadata_section_id'] : \Tainacan\Entities\Metadata_Section::$default_section_slug;
$body = json_decode($request->get_body(), true); $body = json_decode($request->get_body(), true);

View File

@ -36,7 +36,7 @@ class REST_Metadata_Sections_Controller extends REST_Controller {
* @throws \Exception * @throws \Exception
*/ */
public function register_routes() { public function register_routes() {
register_rest_route($this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<metadata_section_id>[\d]+)', register_rest_route($this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<metadata_section_id>[\d|default_section]+)',
array( array(
array( array(
'methods' => \WP_REST_Server::READABLE, 'methods' => \WP_REST_Server::READABLE,
@ -85,7 +85,7 @@ class REST_Metadata_Sections_Controller extends REST_Controller {
'schema' => [$this, 'get_schema'] 'schema' => [$this, 'get_schema']
) )
); );
register_rest_route($this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<metadata_section_id>[\d]+)/metadata', register_rest_route($this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<metadata_section_id>[\d|default_section]+)/metadata',
array( array(
array( array(
'methods' => \WP_REST_Server::READABLE, 'methods' => \WP_REST_Server::READABLE,
@ -149,7 +149,7 @@ class REST_Metadata_Sections_Controller extends REST_Controller {
$item_arr['enabled'] = $item->get_enabled_for_collection(); $item_arr['enabled'] = $item->get_enabled_for_collection();
} }
$metadata_list = $item->get_id() == 'default_section' $metadata_list = $item->get_id() == \Tainacan\Entities\Metadata_Section::$default_section_slug
? $this->metadata_sections_repository->get_default_section_metadata_object_list($item->get_collection()) ? $this->metadata_sections_repository->get_default_section_metadata_object_list($item->get_collection())
: $item->get_metadata_object_list(); : $item->get_metadata_object_list();
$item_arr['metadata_object_list'] = []; $item_arr['metadata_object_list'] = [];
@ -434,14 +434,17 @@ class REST_Metadata_Sections_Controller extends REST_Controller {
if(!empty($body)){ if(!empty($body)){
$metadata_section_id = $request['metadata_section_id']; $metadata_section_id = $request['metadata_section_id'];
if($metadata_section_id == \Tainacan\Entities\Metadata_Section::$default_section_slug) {
$metadata_section = $this->metadata_sections_repository->get_default_section($collection_id);
} else {
$metadata_section = $this->metadata_sections_repository->fetch($metadata_section_id); $metadata_section = $this->metadata_sections_repository->fetch($metadata_section_id);
if ( $collection_id != $metadata_section->get_collection_id() ) { if ( $collection_id != $metadata_section->get_collection_id() ) {
return new \WP_REST_Response( [ return new \WP_REST_Response( [
'error_message' => __('This metadata section not found in collection', 'tainacan'), 'error_message' => __('This metadata section not found in collection', 'tainacan'),
'metadata_section_id' => $metadata_section_id 'metadata_section_id' => $metadata_section_id
] ); ] );
} }
}
if ($metadata_section) { if ($metadata_section) {
$attributes = []; $attributes = [];

View File

@ -604,6 +604,17 @@ class Collection extends Entity {
return $this->get_mapped_property( 'submission_use_recaptcha' ); return $this->get_mapped_property( 'submission_use_recaptcha' );
} }
/**
* Get the default metadata section properties.
*
* @param [string] $value
*
* @return void
*/
function get_default_metadata_section_properties( ) {
return $this->get_mapped_property( 'default_metadata_section_properties' );
}
/** /**
* Set the collection name * Set the collection name
* *
@ -866,6 +877,17 @@ class Collection extends Entity {
return $this->set_mapped_property( 'submission_use_recaptcha', $value); return $this->set_mapped_property( 'submission_use_recaptcha', $value);
} }
/**
* Set the default metadata section properties.
*
* @param [string] $value
*
* @return void
*/
function set_default_metadata_section_properties( $value ) {
return $this->set_mapped_property( 'default_metadata_section_properties', $value);
}
/** /**
* Validate Collection * Validate Collection
* *

View File

@ -1079,7 +1079,7 @@ class Item extends Entity {
if (is_array($args['metadata_sections__in'])) { if (is_array($args['metadata_sections__in'])) {
$post__in[] = -1; // If metadata_sections__in is an empty array, this forces empty result $post__in[] = -1; // If metadata_sections__in is an empty array, this forces empty result
foreach ($args['metadata_sections__in'] as $metadata_section) { foreach ($args['metadata_sections__in'] as $metadata_section) {
if (is_numeric($metadata_section) || $metadata_section === 'default_section') { if (is_numeric($metadata_section) || $metadata_section === \Tainacan\Entities\Metadata_Section::$default_section_slug) {
$post__in[] = $metadata_section; $post__in[] = $metadata_section;
} elseif (is_string($metadata_section)) { } elseif (is_string($metadata_section)) {
$post__name_in[] = $metadata_section; $post__name_in[] = $metadata_section;
@ -1088,7 +1088,7 @@ class Item extends Entity {
} }
if (is_array($args['metadata_sections__not_in'])) { if (is_array($args['metadata_sections__not_in'])) {
foreach ($args['metadata_sections__not_in'] as $metadata_section) { foreach ($args['metadata_sections__not_in'] as $metadata_section) {
if (is_integer($metadata_section) || $metadata_section === 'default_section') { if (is_integer($metadata_section) || $metadata_section === \Tainacan\Entities\Metadata_Section::$default_section_slug) {
$post__not_in[] = $metadata_section; $post__not_in[] = $metadata_section;
} }
} }

View File

@ -12,6 +12,8 @@ class Metadata_Section extends Entity {
use \Tainacan\Traits\Entity_Collection_Relation; use \Tainacan\Traits\Entity_Collection_Relation;
static $post_type = 'tainacan-metasection'; static $post_type = 'tainacan-metasection';
static $default_section_slug = 'default_section';
protected protected
$name, $name,
$slug, $slug,
@ -38,7 +40,7 @@ class Metadata_Section extends Entity {
*/ */
public function get_id() { public function get_id() {
$id = $this->get_mapped_property('id'); $id = $this->get_mapped_property('id');
return isset($id) ? $id : 'default_section'; return isset($id) ? $id : static::$default_section_slug;
} }
/** /**
@ -86,7 +88,7 @@ class Metadata_Section extends Entity {
$tainacan_metadata_sections = \Tainacan\Repositories\Metadata_Sections::get_instance(); $tainacan_metadata_sections = \Tainacan\Repositories\Metadata_Sections::get_instance();
$metadata_section_id = $this->get_id(); $metadata_section_id = $this->get_id();
if ($metadata_section_id == 'default_section') if ($metadata_section_id == static::$default_section_slug)
return $tainacan_metadata_sections->get_default_section_metadata_object_list($this->get_collection()); return $tainacan_metadata_sections->get_default_section_metadata_object_list($this->get_collection());
return $tainacan_metadata_sections->get_metadata_object_list($this->get_id()); return $tainacan_metadata_sections->get_metadata_object_list($this->get_id());

View File

@ -245,7 +245,13 @@ class Collections extends Repository {
'on_error' => __( 'Value should be yes or no', 'tainacan' ), 'on_error' => __( 'Value should be yes or no', 'tainacan' ),
'validation' => v::stringType()->in( [ 'yes', 'no' ] ), // yes or no 'validation' => v::stringType()->in( [ 'yes', 'no' ] ), // yes or no
], ],
'default_metadata_section_properties' => [
'map' => 'meta',
'title' => __( 'Default metadata section properties', 'tainacan' ),
'type' => 'object',
'items' => [ 'name' => 'string', 'description' => 'string', 'description_bellow_name' => 'string' ],
'description' => __( 'The default metadata section properties', 'tainacan' ),
],
] ); ] );
} }

View File

@ -128,18 +128,36 @@ class Metadata_Sections extends Repository {
register_post_type( Entities\Metadata_Section::get_post_type(), $args ); register_post_type( Entities\Metadata_Section::get_post_type(), $args );
} }
/**
* Get the default metadata section of the collection
*
* @param \Tainacan\Entities\Collection|int the collection of the metadata section
*
* @return \Tainacan\Entities\Metadata_Section|false return de the default metadata section or false otherwise.
*/
public function get_default_section ($collection) { public function get_default_section ($collection) {
if($collection instanceof Entities\Collection) { if($collection instanceof Entities\Collection) {
$collection_id = $collection->get_id(); $collection_id = $collection->get_id();
} else if (is_int($collection)) { } else if (is_int($collection)) {
$collection_id = $collection; $collection_id = $collection;
$collection = \tainacan_collections()->fetch($collection, 'OBJECT');
} else { } else {
return false; return false;
} }
$name = __('Metadata', 'tainacan');
$description = __('Metadata section', 'tainacan');
$description_bellow_name = 'no';
$default_metadata_section_properties = $collection->get_default_metadata_section_properties();
if( !empty($default_metadata_section_properties) ) {
$name = isset($default_metadata_section_properties['name']) ? $default_metadata_section_properties['name'] : $name;
$description = isset($default_metadata_section_properties['description']) ? $default_metadata_section_properties['description'] : $description;
$description_bellow_name = isset($default_metadata_section_properties['description_bellow_name']) ? $default_metadata_section_properties['description_bellow_name'] : $description_bellow_name;
}
$defaul_section = new Entities\Metadata_Section(); $defaul_section = new Entities\Metadata_Section();
$defaul_section->set_slug('default_section'); $defaul_section->set_slug(\Tainacan\Entities\Metadata_Section::$default_section_slug);
$defaul_section->set_name(__('Metadata', 'tainacan')); $defaul_section->set_name($name);
$defaul_section->set_description(__('Metadata section', 'tainacan')); $defaul_section->set_description($description);
$defaul_section->set_description_bellow_name($description_bellow_name);
$defaul_section->set_collection_id($collection_id); $defaul_section->set_collection_id($collection_id);
return $defaul_section; return $defaul_section;
} }
@ -306,6 +324,22 @@ class Metadata_Sections extends Repository {
* @throws \Exception * @throws \Exception
*/ */
public function update( $object, $new_values = null ) { public function update( $object, $new_values = null ) {
if($object->get_id() == \Tainacan\Entities\Metadata_Section::$default_section_slug) {
$collection = $object->get_collection();
if($collection instanceof \Tainacan\Entities\Collection) {
$properties = array(
'name' => $object->get_name(),
'description' => $object->get_description(),
'description_bellow_name' => $object->get_description_bellow_name()
);
$collection->set_default_metadata_section_properties($properties);
if($collection->validate()) {
\tainacan_collections()->update($collection);
return $object;
}
}
return false;
}
return $this->insert( $object ); return $this->insert( $object );
} }
@ -350,7 +384,7 @@ class Metadata_Sections extends Repository {
'relation' => 'OR', 'relation' => 'OR',
array( array(
'key' => 'metadata_section_id', 'key' => 'metadata_section_id',
'value' => 'default_section', 'value' => \Tainacan\Entities\Metadata_Section::$default_section_slug,
'compare' => '=' 'compare' => '='
), ),
array( array(

View File

@ -231,7 +231,7 @@ class Metadata extends Repository {
'title' => __( 'Metadata section', 'tainacan' ), 'title' => __( 'Metadata section', 'tainacan' ),
'type' => ['integer', 'string', 'array'], 'type' => ['integer', 'string', 'array'],
'description' => __( 'The metadata section ID', 'tainacan' ), 'description' => __( 'The metadata section ID', 'tainacan' ),
'default' => 'default_section' 'default' => \Tainacan\Entities\Metadata_Section::$default_section_slug
], ],
] ); ] );
} }