From f7804cd2b5835cf875474da26538daf132207e04 Mon Sep 17 00:00:00 2001
From: vnmedeiros
Date: Wed, 1 Sep 2021 14:47:20 -0300
Subject: [PATCH] feat: update validate with cardinality for multiples
metadatas #568
---
.../class-tainacan-item-metadata-entity.php | 5 ++++
.../edition/metadatum-edition-form.vue | 3 ++-
.../metadata-types/compound/Compound.vue | 11 +++++---
.../metadata-types/tainacan-form-item.vue | 2 +-
tests/test-item-metadata.php | 26 +++++++++++++++++++
5 files changed, 41 insertions(+), 6 deletions(-)
diff --git a/src/classes/entities/class-tainacan-item-metadata-entity.php b/src/classes/entities/class-tainacan-item-metadata-entity.php
index 83b3b89df..a7e489062 100644
--- a/src/classes/entities/class-tainacan-item-metadata-entity.php
+++ b/src/classes/entities/class-tainacan-item-metadata-entity.php
@@ -486,6 +486,11 @@ class Item_Metadata_Entity extends Entity {
if ($this->is_multiple()) {
if (is_array($value)) {
+ $cardinality = $metadatum->get_cardinality();
+ if ( !empty($cardinality) && $cardinality > 0 && count($value) > $cardinality ) {
+ $this->add_error( 'invalid', sprintf( __('Metadatum %s is set to accept a maximum of %s values.', 'tainacan'), $metadatum->get_name(), $cardinality ) );
+ return false;
+ }
// if its required, at least one must be filled
$one_filled = false;
$valid = true;
diff --git a/src/views/admin/components/edition/metadatum-edition-form.vue b/src/views/admin/components/edition/metadatum-edition-form.vue
index 2f356c16d..57d50c697 100644
--- a/src/views/admin/components/edition/metadatum-edition-form.vue
+++ b/src/views/admin/components/edition/metadatum-edition-form.vue
@@ -208,7 +208,8 @@
:disabled="editForm.multiple != 'yes'"
name="cardinality"
type="number"
- step="1" />
+ step="1"
+ v-model="editForm.cardinality"/>
diff --git a/src/views/admin/components/metadata-types/compound/Compound.vue b/src/views/admin/components/metadata-types/compound/Compound.vue
index 0c3068eda..8c51b2412 100644
--- a/src/views/admin/components/metadata-types/compound/Compound.vue
+++ b/src/views/admin/components/metadata-types/compound/Compound.vue
@@ -85,15 +85,15 @@
class="empty-label">
{{ $i18n.get('info_no_value_compound_metadata') }}
-
- {{ $i18n.get('label_add_value') }}
+ {{ $i18n.get('label_add_value') }}
@@ -124,7 +124,10 @@
},
someValueOnLastInput() {
return this.childItemMetadataGroups && this.childItemMetadataGroups[this.childItemMetadataGroups.length - 1] && this.childItemMetadataGroups[this.childItemMetadataGroups.length - 1].findIndex((childItemMetadatum) => childItemMetadatum.value) >= 0;
- }
+ },
+ maxMultipleValues() {
+ return (this.itemMetadatum && this.itemMetadatum.metadatum && this.itemMetadatum.metadatum.cardinality && !isNaN(this.itemMetadatum.metadatum.cardinality)) ? this.itemMetadatum.metadatum.cardinality : undefined;
+ },
},
watch: {
/* This will create the input object structure for
diff --git a/src/views/admin/components/metadata-types/tainacan-form-item.vue b/src/views/admin/components/metadata-types/tainacan-form-item.vue
index 82f18fd4c..d14baa678 100644
--- a/src/views/admin/components/metadata-types/tainacan-form-item.vue
+++ b/src/views/admin/components/metadata-types/tainacan-form-item.vue
@@ -83,7 +83,7 @@
-
+
diff --git a/tests/test-item-metadata.php b/tests/test-item-metadata.php
index 47db77b1a..86d329da2 100644
--- a/tests/test-item-metadata.php
+++ b/tests/test-item-metadata.php
@@ -762,4 +762,30 @@ class Item_Metadata extends TAINACAN_UnitTestCase {
return "${title}";
}
+
+ function test_multiple_with_cardinality() {
+ // Multiple numeric metadata
+ $metadatum_numeric_multiple = $this->tainacan_entity_factory->create_entity(
+ 'metadatum',
+ array(
+ 'name' => 'Numeric important meta',
+ 'description' => 'and its description',
+ 'collection_id' => $this->collection->get_id(),
+ 'metadata_type' => 'Tainacan\Metadata_Types\Numeric',
+ 'status' => 'publish',
+ 'multiple' => 'yes',
+ 'cardinality' => 3
+ ),
+ true
+ );
+
+ $item_metadata_numeric_mult = new Item_Metadata_Entity($this->item, $metadatum_numeric_multiple);
+ $item_metadata_numeric_mult->set_value([10,22,4]);
+ $ok = $item_metadata_numeric_mult->validate();
+ $this->assertTrue($ok);
+
+ $item_metadata_numeric_mult->set_value([10,22,4,4]);
+ $fail = $item_metadata_numeric_mult->validate();
+ $this->assertFalse($fail);
+ }
}
\ No newline at end of file