diff --git a/src/views/admin/components/edition/filter-edition-form.vue b/src/views/admin/components/edition/filter-edition-form.vue index 1dd6b4183..a243bc665 100644 --- a/src/views/admin/components/edition/filter-edition-form.vue +++ b/src/views/admin/components/edition/filter-edition-form.vue @@ -252,6 +252,7 @@ import { formHooks } from "../../js/mixins"; import FormFilterNumeric from '../filter-types/numeric/FormNumeric.vue'; import FormFilterNumericInterval from '../filter-types/numeric-interval/FormNumericInterval.vue'; import FormFilterNumericListInterval from '../filter-types/numeric-list-interval/FormNumericListInterval.vue'; +import FormFilterNumericsIntersection from '../filter-types/numerics-intersection/FormNumericsIntersection.vue'; import FormFilterDatesIntersection from '../filter-types/dates-intersection/FormDatesIntersection.vue'; export default { @@ -260,6 +261,7 @@ export default { 'tainacan-filter-form-numeric': FormFilterNumeric, 'tainacan-filter-form-numeric-interval': FormFilterNumericInterval, 'tainacan-filter-form-numeric-list-interval': FormFilterNumericListInterval, + 'tainacan-filter-form-numerics-intersection': FormFilterNumericsIntersection, 'tainacan-filter-form-dates-intersection': FormFilterDatesIntersection }, mixins: [ formHooks ], diff --git a/src/views/admin/components/filter-types/dates-intersection/FormDatesIntersection.vue b/src/views/admin/components/filter-types/dates-intersection/FormDatesIntersection.vue index 19a9b7e0c..a44aaa777 100644 --- a/src/views/admin/components/filter-types/dates-intersection/FormDatesIntersection.vue +++ b/src/views/admin/components/filter-types/dates-intersection/FormDatesIntersection.vue @@ -72,7 +72,9 @@ + style="margin-top: 1.125rem;" + :type="errors && errors['accept_date_interval'] != undefined ? 'is-danger' : ''" + :message="errors && errors['accept_date_interval'] != undefined ? errors['accept_date_interval'] : ''">   aMetadatum.id == this.secondDateMetadatumId ); - this.selectedMetadatumName = selectedMetadatum ? selectedMetadatum.name : ''; - this.selectedMetadatumId = selectedMetadatum ? selectedMetadatum.id : ''; + this.secondDateMetadatumName = selectedMetadatum ? selectedMetadatum.name : ''; + this.secondDateMetadatumId = selectedMetadatum ? selectedMetadatum.id : ''; this.emitValues(); }, emitValues() { diff --git a/src/views/admin/components/filter-types/dates-intersection/class-tainacan-dates-intersection.php b/src/views/admin/components/filter-types/dates-intersection/class-tainacan-dates-intersection.php index 59860e686..13ae80953 100644 --- a/src/views/admin/components/filter-types/dates-intersection/class-tainacan-dates-intersection.php +++ b/src/views/admin/components/filter-types/dates-intersection/class-tainacan-dates-intersection.php @@ -90,24 +90,16 @@ class Dates_Intersection extends Filter_Type { $errors = []; if ( empty($this->get_option('secondary_filter_metadatum_id')) ) - $errors[] = [ - 'secondary_filter_metadatum_id' => __('The secondary date metadatum is required.','tainacan') - ]; + $errors['secondary_filter_metadatum_id'] = __('The secondary date metadatum is required.','tainacan'); if ( empty($this->get_option('first_comparator')) ) - $errors[] = [ - 'first_comparator' => __('The first comparator is required.','tainacan') - ]; + $errors['first_comparator'] = __('The first comparator is required.','tainacan'); if ( empty($this->get_option('second_comparator')) ) - $errors[] = [ - 'second_comparator' => __('The second comparator is required.','tainacan') - ]; + $errors['second_comparator'] = __('The second comparator is required.','tainacan'); if ( empty($this->get_option('accept_date_interval')) ) - $errors[] = [ - 'accept_date_interval' => __('The filter should define if it accepts date interval.','tainacan') - ]; + $errors['accept_date_interval'] = __('The filter should define if it accepts date interval.','tainacan'); return count($errors) > 0 ? $errors : true; } diff --git a/src/views/admin/components/filter-types/filter-type-helper/class-tainacan-filter-type-helper.php b/src/views/admin/components/filter-types/filter-type-helper/class-tainacan-filter-type-helper.php index cb4ffa3b5..fd91b2a50 100644 --- a/src/views/admin/components/filter-types/filter-type-helper/class-tainacan-filter-type-helper.php +++ b/src/views/admin/components/filter-types/filter-type-helper/class-tainacan-filter-type-helper.php @@ -43,6 +43,7 @@ class Filter_Type_Helper { $this->Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\TaxonomyTaginput'); $this->Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\TaxonomyCheckbox'); $this->Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Numeric_List_Interval'); + $this->Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Numerics_Intersection'); // the priority should see less than on function // `load_admin_page()` of class `Admin` in file /src/views/class-tainacan-admin.php diff --git a/src/views/admin/components/filter-types/numerics-intersection/FormNumericsIntersection.vue b/src/views/admin/components/filter-types/numerics-intersection/FormNumericsIntersection.vue new file mode 100644 index 000000000..bb2384fbd --- /dev/null +++ b/src/views/admin/components/filter-types/numerics-intersection/FormNumericsIntersection.vue @@ -0,0 +1,298 @@ + + + \ No newline at end of file diff --git a/src/views/admin/components/filter-types/numerics-intersection/TainacanFilterNumericsIntersection.vue b/src/views/admin/components/filter-types/numerics-intersection/TainacanFilterNumericsIntersection.vue new file mode 100644 index 000000000..6805d6acc --- /dev/null +++ b/src/views/admin/components/filter-types/numerics-intersection/TainacanFilterNumericsIntersection.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/views/admin/components/filter-types/numerics-intersection/class-tainacan-numerics-intersection.php b/src/views/admin/components/filter-types/numerics-intersection/class-tainacan-numerics-intersection.php new file mode 100644 index 000000000..b53da5ab8 --- /dev/null +++ b/src/views/admin/components/filter-types/numerics-intersection/class-tainacan-numerics-intersection.php @@ -0,0 +1,161 @@ +set_name( __('Numerics Intersection', 'tainacan') ); + $this->set_supported_types(['float']); + $this->set_component('tainacan-filter-numerics-intersection'); + $this->set_form_component('tainacan-filter-form-numerics-intersection'); + $this->set_default_options([ + 'step' => 1, + 'secondary_filter_metadatum_id' => '', + 'secondary_filter_metadatum_name' => '', + 'first_comparator' => '>=', + 'second_comparator' => '<=', + 'accept_numeric_interval' => 'no' + ]); + $this->set_use_max_options(false); + $this->set_preview_template(' +
+
+

+ +

+
+ +
+

+ +

+
+

until

+
+

+ +

+
+ +
+

+ +

+
+
+ '); + } + + public function get_form_labels(){ + return [ + 'step' => [ + 'title' => __( 'Step', 'tainacan' ), + 'description' => __( 'The amount to be increased or decreased when clicking on the filter control buttons. This also defines whether the input accepts decimal numbers.', 'tainacan' ), + ], + 'secondary_filter_metadatum_id' => [ + 'title' => __( 'Second numeric metadatum', 'tainacan' ), + 'description' => __( 'The other metadatum to which this filter will compare values to find if there is an intersection of numeric values.', 'tainacan' ), + ], + 'secondary_filter_metadatum_name' => [ + 'title' => __( 'Second numeric metadatum', 'tainacan' ), + 'description' => __( 'Label of the other metadatum to which this filter will compare values to find if there is an intersection of numeric values.', 'tainacan' ), + ], + 'first_comparator' => [ + 'title' => __( 'First comparator', 'tainacan' ), + 'description' => __( 'Comparator to be used for checking the first metadata value.', 'tainacan' ), + ], + 'second_comparator' => [ + 'title' => __( 'Second comparator', 'tainacan' ), + 'description' => __( 'Comparator to be used for checking the second metadata value.', 'tainacan' ), + ], + 'accept_numeric_interval' => [ + 'title' => __( 'Accept numeric interval', 'tainacan' ), + 'description' => __( 'If checked, the filter will accept numeric intervals as values.', 'tainacan' ), + ] + ]; + } + + + /** + * @param \Tainacan\Entities\Filter $filter + * @return array|bool true if is validate or array if has error + */ + public function validate_options(\Tainacan\Entities\Filter $filter) { + + if ( !in_array($filter->get_status(), apply_filters('tainacan-status-require-validation', ['publish','future','private'])) ) + return true; + + $errors = []; + + if ( empty($this->get_option('secondary_filter_metadatum_id')) ) + $errors['secondary_filter_metadatum_id'] = __('The secondary numeric metadatum is required.','tainacan'); + + if ( empty($this->get_option('first_comparator')) ) + $errors['first_comparator'] = __('The first comparator is required.','tainacan'); + + if ( empty($this->get_option('second_comparator')) ) + $errors['second_comparator'] = __('The second comparator is required.','tainacan'); + + if ( empty($this->get_option('accept_numeric_interval')) ) + $errors['accept_numeric_interval'] = __('The filter should define if it accepts a numeric interval.','tainacan'); + + return count($errors) > 0 ? $errors : true; + } + +} + +class Numerics_Intersection_Interval_Helper { + use \Tainacan\Traits\Singleton_Instance; + + protected function init() { + add_filter( 'tainacan-api-items-tainacan-filter-numerics-intersection-filter-arguments', [$this, 'format_filter_arguments']); + } + + function format_filter_arguments( $filter_arguments ) { + if ( + !isset($filter_arguments['compare']) || + !isset($filter_arguments['label']) + ) { + return $filter_arguments; + } + + if ( + is_array($filter_arguments['label']) && + count($filter_arguments['label']) === 2 + ) { + $filter_arguments['label'] = $filter_arguments['label'][0] . ' - ' . $filter_arguments['label'][1]; + } + if ( + isset( $filter_arguments['filter'] ) && + isset( $filter_arguments['filter']['filter_type_options'] ) && + isset( $filter_arguments['filter']['filter_type_options']['secondary_filter_metadatum_name'] ) && + !empty( $filter_arguments['filter']['filter_type_options']['secondary_filter_metadatum_name'] ) + ) { + $filter_arguments['filter']['name'] = $filter_arguments['filter']['name'] . ' - ' . $filter_arguments['filter']['filter_type_options']['secondary_filter_metadatum_name']; + } + return $filter_arguments; + } +} +Numerics_Intersection_Interval_Helper::get_instance(); \ No newline at end of file diff --git a/src/views/admin/components/filter-types/tainacan-filter-item.vue b/src/views/admin/components/filter-types/tainacan-filter-item.vue index bd3f4609f..04b0e33ef 100644 --- a/src/views/admin/components/filter-types/tainacan-filter-item.vue +++ b/src/views/admin/components/filter-types/tainacan-filter-item.vue @@ -102,7 +102,8 @@ TainacanFilterDateInterval: defineAsyncComponent(() => import('./date-interval/TainacanFilterDateInterval.vue')), TainacanFilterDatesIntersection: defineAsyncComponent(() => import('./dates-intersection/TainacanFilterDatesIntersection.vue')), TainacanFilterNumericInterval: defineAsyncComponent(() => import('./numeric-interval/TainacanFilterNumericInterval.vue')), - TainacanFilterNumericListInterval: defineAsyncComponent(() => import('./numeric-list-interval/TainacanFilterNumericListInterval.vue')) + TainacanFilterNumericListInterval: defineAsyncComponent(() => import('./numeric-list-interval/TainacanFilterNumericListInterval.vue')), + TainacanFilterNumericsIntersection: defineAsyncComponent(() => import('./numerics-intersection/TainacanFilterNumericsIntersection.vue')) }, props: { filter: Object, diff --git a/src/views/tainacan-i18n.php b/src/views/tainacan-i18n.php index 4bb2101c4..ab0ebc810 100644 --- a/src/views/tainacan-i18n.php +++ b/src/views/tainacan-i18n.php @@ -789,6 +789,7 @@ return apply_filters( 'tainacan-i18n', [ 'instruction_select_geocoordinate_metadatum' => __( 'Select a geocoordinate metadatum', 'tainacan' ), 'instruction_multiple_terms_insertion' => __( 'Type or paste here a list of names using a separator to create multiple terms at once.', 'tainacan' ), 'instruction_select_second_date_to_compare' => __( 'Select the second date metadatum', 'tainacan' ), + 'instruction_select_second_numeric_to_compare' => __( 'Select the second numeric metadatum', 'tainacan' ), // Info. Other feedback to user. 'info_items_tab_all' => __( 'Every item, except by those sent to trash.', 'tainacan' ),