Remove Custom Interval filter and migrate to new ones #306

This commit is contained in:
leogermani 2019-10-23 17:28:48 -03:00
parent 28d9b1df6e
commit f94426580b
8 changed files with 199 additions and 501 deletions

View File

@ -23,7 +23,6 @@ import FormRelationship from '../../classes/metadata-types/relationship/FormRela
import FormTaxonomy from '../../classes/metadata-types/taxonomy/FormTaxonomy.vue';
import FormSelectbox from '../../classes/metadata-types/selectbox/FormSelectbox.vue';
import FilterCustomInterval from '../../classes/filter-types/custom-interval/CustomInterval.vue';
import FilterNumeric from '../../classes/filter-types/numeric/Numeric.vue';
import FilterDate from '../../classes/filter-types/date/Date.vue';
import FilterSelectbox from '../../classes/filter-types/selectbox/Selectbox.vue';
@ -87,7 +86,6 @@ Vue.component('tainacan-form-item', TainacanFormItem);
Vue.component('tainacan-filter-item', TainacanFiltersList);
/* Filters */
Vue.component('tainacan-filter-custom-interval', FilterCustomInterval);
Vue.component('tainacan-filter-numeric', FilterNumeric);
Vue.component('tainacan-filter-date', FilterDate);
Vue.component('tainacan-filter-selectbox', FilterSelectbox);

View File

@ -5,7 +5,6 @@ import VTooltip from 'v-tooltip';
import VueMasonry from 'vue-masonry-css';
// Custom elements
import FilterCustomInterval from '../../classes/filter-types/custom-interval/CustomInterval.vue';
import FilterNumeric from '../../classes/filter-types/numeric/Numeric.vue';
import FilterDate from '../../classes/filter-types/date/Date.vue';
import FilterSelectbox from '../../classes/filter-types/selectbox/Selectbox.vue';
@ -44,11 +43,9 @@ Vue.use(RouterHelperPlugin);
Vue.use(StatusHelperPlugin);
Vue.use(ConsolePlugin, {visual: false});
Vue.component('tainacan-filter-item', TaincanFiltersList);
/* Filters */
Vue.component('tainacan-filter-custom-interval', FilterCustomInterval);
Vue.component('tainacan-filter-numeric', FilterNumeric);
Vue.component('tainacan-filter-date', FilterDate);
Vue.component('tainacan-filter-selectbox', FilterSelectbox);

View File

@ -1,261 +0,0 @@
<template>
<div>
<!-- Date -->
<div v-if="metadatumType === 'Tainacan\\Metadata_Types\\Date'">
<b-datepicker
:aria-labelledby="'filter-label-id-' + filter.id"
:placeholder="$i18n.get('label_selectbox_init')"
v-model="dateInit"
size="is-small"
@focus="isTouched = true"
@input="validadeValues()"
editable
:date-formatter="(date) => dateFormatter(date)"
:date-parser="(date) => dateParser(date)"
icon="calendar-today"
:years-range="[-200, 50]"
:day-names="[
$i18n.get('datepicker_short_sunday'),
$i18n.get('datepicker_short_monday'),
$i18n.get('datepicker_short_tuesday'),
$i18n.get('datepicker_short_wednesday'),
$i18n.get('datepicker_short_thursday'),
$i18n.get('datepicker_short_friday'),
$i18n.get('datepicker_short_saturday'),
]"/>
<p class="is-size-7 has-text-centered is-marginless">{{ $i18n.get('label_until') }}</p>
<b-datepicker
:aria-labelledby="'filter-label-id-' + filter.id"
:placeholder="$i18n.get('label_selectbox_init')"
v-model="dateEnd"
size="is-small"
@input="validadeValues()"
@focus="isTouched = true"
editable
:date-formatter="(date) => dateFormatter(date)"
:date-parser="(date) => dateParser(date)"
icon="calendar-today"
:years-range="[-200, 50]"
:day-names="[
$i18n.get('datepicker_short_sunday'),
$i18n.get('datepicker_short_monday'),
$i18n.get('datepicker_short_tuesday'),
$i18n.get('datepicker_short_wednesday'),
$i18n.get('datepicker_short_thursday'),
$i18n.get('datepicker_short_friday'),
$i18n.get('datepicker_short_saturday'),
]"/>
</div>
<!-- Numeric -->
<div v-else>
<b-input
type="number"
:aria-labelledby="'filter-label-id-' + filter.id"
size="is-small"
step="any"
@input="validadeValues"
v-model="valueInit"/>
<p class="is-size-7 has-text-centered is-marginless">{{ $i18n.get('label_until') }}</p>
<b-input
type="number"
:aria-labelledby="'filter-label-id-' + filter.id"
size="is-small"
step="any"
@input="validadeValues"
@focus="isTouched = true"
v-model="valueEnd"/>
</div>
</div>
</template>
<script>
import { wpAjax, dateInter } from "../../../admin/js/mixins";
import { filterTypeMixin } from '../filter-types-mixin';
import moment from 'moment';
export default {
mixins: [
wpAjax,
dateInter,
filterTypeMixin
],
mounted() {
this.updateSelectedValues();
},
data(){
return {
valueInit: '',
valueEnd: '',
dateInit: undefined,
dateEnd: undefined,
isTouched: false,
type: 'DECIMAL'
}
},
watch: {
isTouched( val ){
if ( val && this.dateInit === null)
this.dateInit = new Date();
if ( val && this.dateEnd === null)
this.dateEnd = new Date();
},
'query.metaquery'() {
this.updateSelectedValues();
}
},
methods: {
// only validate if the first value is higher than first
validadeValues: _.debounce( function (){
if( this.metadatumType === 'Tainacan\\Metadata_Types\\Date' ){
if (this.dateInit === undefined)
this.dateInit = new Date();
if (this.dateEnd === undefined)
this.dateEnd = new Date();
if ( this.dateInit > this.dateEnd ) {
this.showErrorMessage();
return
}
} else {
if (this.valueInit.constructor == Number)
this.valueInit = this.valueInit.valueOf();
if (this.valueEnd.constructor == Number)
this.valueEnd = this.valueEnd.valueOf();
this.valueInit = parseFloat(this.valueInit);
this.valueEnd = parseFloat(this.valueEnd);
if (isNaN(this.valueInit) || isNaN(this.valueEnd))
return
if (this.valueInit > this.valueEnd) {
this.showErrorMessage();
return;
}
}
this.emit();
}, 800),
// message for error
showErrorMessage(){
if ( !this.isTouched ) return false;
this.$buefy.toast.open({
duration: 3000,
message: this.$i18n.get('info_error_first_value_greater'),
position: 'is-bottom',
type: 'is-danger'
})
},
dateFormatter(dateObject){
return moment(dateObject, moment.ISO_8601).format(this.dateFormat);
},
dateParser(dateString){
return moment(dateString, this.dateFormat).toDate();
},
updateSelectedValues(){
if ( !this.query || !this.query.metaquery || !Array.isArray( this.query.metaquery ) )
return false;
let index = this.query.metaquery.findIndex(newMetadatum => newMetadatum.key == this.metadatumId);
if (index >= 0) {
let metadata = this.query.metaquery[ index ];
if( metadata.value && metadata.value.length > 0 && this.metadatumType === 'Tainacan\\Metadata_Types\\Numeric'){
this.valueInit = parseFloat(metadata.value[0]);
this.valueEnd = parseFloat(metadata.value[1]);
} else if( metadata.value && metadata.value.length > 0 ){
this.dateInit = new Date(metadata.value[0]);
this.dateEnd = new Date(metadata.value[1]);
}
if (metadata.value[0] != undefined && metadata.value[1] != undefined)
this.$emit('sendValuesToTags', {
label: (this.metadatumType === 'Tainacan\\Metadata_Types\\Numeric' ? (metadata.value[0] + ' - ' + metadata.value[1]) : this.parseDateToNavigatorLanguage(metadata.value[0]) + ' - ' + this.parseDateToNavigatorLanguage(metadata.value[1])),
value: [metadata.value[0], metadata.value[1]]
});
} else {
if (this.metadatumType === 'Tainacan\\Metadata_Types\\Numeric') {
this.valueInit = '';
this.valueEnd = '';
} else {
this.dateInit = null;
this.dateEnd = null;
}
}
},
// emit the operation for listeners
emit() {
let values = [];
if (this.metadatumType === 'Tainacan\\Metadata_Types\\Date') {
if (this.dateInit === null && this.dateEnd === null) {
values = [];
this.type = 'DATE';
} else {
let dateInit = this.dateInit.getUTCFullYear() + '-' +
('00' + (this.dateInit.getUTCMonth() + 1)).slice(-2) + '-' +
('00' + this.dateInit.getUTCDate()).slice(-2);
let dateEnd = this.dateEnd.getUTCFullYear() + '-' +
('00' + (this.dateEnd.getUTCMonth() + 1)).slice(-2) + '-' +
('00' + this.dateEnd.getUTCDate()).slice(-2);
values = [ dateInit, dateEnd ];
this.type = 'DATE';
}
} else {
if (this.valueInit === null || this.valueEnd === null
|| this.valueInit === '' || this.valueEnd === ''){
return;
} else {
values = [ this.valueInit, this.valueEnd ];
if(this.valueInit !== this.valueEnd && (this.valueInit % 1 !== 0 && this.valueEnd % 1 == 0)) {
this.type = 'DECIMAL';
} else if(this.valueInit !== this.valueEnd &&
this.valueInit % 1 !== 0 &&
this.valueEnd % 1 !== 0) {
this.type = '';
} else if(this.valueInit !== this.valueEnd &&
!(this.valueInit % 1 == 0 && this.valueEnd % 1 !== 0)){
this.type = 'DECIMAL';
} else {
this.type = '';
}
}
}
this.$emit('input', {
filter: 'range',
type: this.type,
compare: 'BETWEEN',
metadatum_id: this.metadatumId,
collection_id: this.collectionId,
value: values
});
if (values[0] != undefined && values[1] != undefined)
this.$emit( 'sendValuesToTags', {
label: (this.metadatumType === 'Tainacan\\Metadata_Types\\Numeric' ? (values[0] + ' - ' + values[1]) : this.parseDateToNavigatorLanguage(values[0]) + ' - ' + this.parseDateToNavigatorLanguage(values[1])),
value: [ values[0], values[1] ]
});
}
}
}
</script>
<style scoped>
.field {
margin-bottom: 0.125rem !important;
}
p.is-size-7 {
margin-bottom: 0.125rem !important;
}
</style>

View File

@ -1,74 +0,0 @@
<?php
namespace Tainacan\Filter_Types;
defined( 'ABSPATH' ) or die( 'No script kiddies please!' );
/**
* Class TainacanMetadatumType
*/
class Custom_Interval extends Filter_Type {
function __construct(){
$this->set_name( __('Custom Interval', 'tainacan'));
$this->set_supported_types(['float','date']);
$this->set_component('tainacan-filter-custom-interval');
$this->set_use_max_options(false);
$this->set_preview_template('
<div>
<div class="b-numberinput field is-grouped">
<p class="control">
<button type="button" class="button is-primary is-small">
<span class="icon is-small">
<i class="mdi mdi-minus"></i>
</span>
</button>
</p>
<div class="control is-small is-clearfix">
<input type="number" step="0.01" class="input is-small" value="6">
</div>
<p class="control">
<button type="button" class="button is-primary is-small">
<span class="icon is-small">
<i class="mdi mdi-plus"></i>
</span>
</button>
</p>
</div>
<p class="is-size-7 has-text-centered is-marginless">until</p>
<div class="b-numberinput field is-grouped">
<p class="control">
<button type="button" class="button is-primary is-small">
<span class="icon is-small">
<i class="mdi mdi-minus"></i>
</span>
</button>
</p>
<div class="control is-small is-clearfix">
<input type="number" step="0.01" class="input is-small" value="10">
</div>
<p class="control">
<button type="button" class="button is-primary is-small">
<span class="icon is-small">
<i class="mdi mdi-plus"></i>
</span>
</button>
</p>
</div>
</div>
');
}
/**
* @param $filter
* @return string
* @internal param $metadatum
*/
public function render( $filter ){
$type = ( $filter->get_metadatum()->get_metadata_type() === 'Tainacan\Metadata_Types\Date' ) ? 'date' : 'numeric';
return '<tainacan-filter-custom-interval
name="'.$filter->get_name().'"
collection_id="'.$filter->get_collection_id().'"
metadatum_id="'.$filter->get_metadatum()->get_id().'"></tainacan-filter-custom-interval>';
}
}

View File

@ -132,7 +132,6 @@ $Tainacan_Metadata->register_metadata_type('Tainacan\Metadata_Types\Taxonomy');
$Tainacan_Filters = \Tainacan\Repositories\Filters::get_instance();
//register filter type
$Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Custom_Interval');
$Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Numeric');
$Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Date');
$Tainacan_Filters->register_filter_type('Tainacan\Filter_Types\Selectbox');

View File

@ -376,6 +376,49 @@ class Migrations {
}
static function replace_custom_interval_filters() {
$tainacan_filters = \Tainacan\Repositories\Filters::get_instance();
$filters = $tainacan_filters->fetch([
'nopaging' => true,
'filter_type' => 'Tainacan\Filter_Types\Custom_Interval',
'post_status' => 'any'
], 'OBJECT');
foreach ($filters as $filter) {
$meta = $filter->get_metadatum();
#echo 'found filter:' . $filter->get_name(). "<br>";
if ($meta instanceof \Tainacan\Entities\Metadatum) {
$type = $meta->get_metadata_type();
#echo 'found meta:' . $meta->get_name(). "<br>";
#echo 'found meta:' . $meta->get_metadata_type(). "<br>";
$newtype = false;
if ( $type == 'Tainacan\Metadata_Types\Date' ) {
$newtype = 'Tainacan\Filter_Types\Date_Interval';
} elseif ( $type == 'Tainacan\Metadata_Types\Numeric' ) {
$newtype = 'Tainacan\Filter_Types\Numeric_Interval';
}
#echo 'New type:' . $newtype. "<br>";
if ($newtype) {
$filter->set_filter_type($newtype);
if ($filter->validate()) {
#echo "INSERT\n\n";
$tainacan_filters->insert($filter);
}
}
}
}
}
}

View File

@ -33,7 +33,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
$request_body = json_encode(
array(
'filter_type' => '\Tainacan\Filter_Types\Custom_Interval',
'filter_type' => 'Tainacan\Filter_Types\Numeric_Interval',
'filter' => [
'name' => 'Filter name',
'description' => 'This is CUSTOM INTERVAL!',
@ -49,7 +49,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
$data = $response->get_data();
$this->assertTrue(is_array($data) && array_key_exists('filter_type', $data), sprintf('cannot create a custom interval, response: %s', print_r($data, true)));
$this->assertEquals('Tainacan\Filter_Types\Custom_Interval', $data['filter_type']);
$this->assertEquals('Tainacan\Filter_Types\Numeric_Interval', $data['filter_type']);
$this->assertEquals('Filter name', $data['name']);
}
@ -82,7 +82,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
'collection' => $collection,
'description' => 'descricao',
'metadatum_id' => $metadatum->get_id(),
'filter_type' => 'Tainacan\Filter_Types\Custom_Interval',
'filter_type' => 'Tainacan\Filter_Types\Numeric_Interval',
),
true
);
@ -143,8 +143,6 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
true
);
$filter_type = $this->tainacan_filter_factory->create_filter('custom_interval');
$filter = $this->tainacan_entity_factory->create_entity(
'filter',
array(
@ -152,7 +150,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
'collection' => $collection,
'description' => 'descricao',
'metadatum_id' => $metadatum->get_id(),
'filter_type' => $filter_type,
'filter_type' => 'Tainacan\Filter_Types\Numeric_Interval',
),
true
);
@ -209,8 +207,6 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
true
);
$filter_type = $this->tainacan_filter_factory->create_filter('custom_interval');
$filter = $this->tainacan_entity_factory->create_entity(
'filter',
array(
@ -218,7 +214,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
'collection' => $collection,
'description' => 'descricao',
'metadatum' => $metadatum,
'filter_type' => $filter_type,
'filter_type' => 'Tainacan\Filter_Types\Numeric_Interval',
'status' => 'publish'
),
true
@ -231,7 +227,7 @@ class TAINACAN_REST_Terms_Controller extends TAINACAN_UnitApiTestCase {
'collection' => $collection,
'description' => 'descricao',
'metadatum' => $metadatum2,
'filter_type' => $filter_type,
'filter_type' => 'Tainacan\Filter_Types\Numeric_Interval',
'status' => 'publish'
),
true

View File

@ -78,7 +78,7 @@ class Filters extends TAINACAN_UnitTestCase {
true
);
$filter_range_type = $this->tainacan_filter_factory->create_filter('custom_interval');
$filter_range_type = $this->tainacan_filter_factory->create_filter('Numeric_Interval');
//nao devera permitir um filtro Range para o tipo string
$this->assertTrue( $filter->set_filter_type( $filter_range_type ) === null );
@ -97,7 +97,7 @@ class Filters extends TAINACAN_UnitTestCase {
$Tainacan_Filters = \Tainacan\Repositories\Filters::get_instance();
$all_filter_types = $Tainacan_Filters->fetch_filter_types();
$this->assertEquals( 12, count( $all_filter_types ) );
$this->assertEquals( 11, count( $all_filter_types ) );
$float_filters = $Tainacan_Filters->fetch_supported_filter_types('float');
$this->assertTrue( count( $float_filters ) > 0 );
@ -150,7 +150,7 @@ class Filters extends TAINACAN_UnitTestCase {
$filter2->set_collection($collection);
$filter2->set_description('description');
$filter2->set_metadatum($metadatum2);
$filter2->set_filter_type('Tainacan\Filter_Types\Custom_Interval');
$filter2->set_filter_type('Tainacan\Filter_Types\Numeric_Interval');
$this->assertFalse($filter2->validate(), 'filter with a metadatum with unsupported primitive type should not validate');