From bdcf3704e66aa991faf36f253faa1446125310df Mon Sep 17 00:00:00 2001 From: eduardohumberto Date: Wed, 12 Sep 2018 22:51:19 -0300 Subject: [PATCH 1/8] endpoint facets - priority for selected values --- .../class-tainacan-rest-facets-controller.php | 118 +++++++++++++++--- .../filter-types/checkbox/Checkbox.vue | 4 +- .../filter-types/filter-types-mixin.js | 8 +- .../filter-types/taxonomy/Checkbox.vue | 2 +- 4 files changed, 109 insertions(+), 23 deletions(-) diff --git a/src/api/endpoints/class-tainacan-rest-facets-controller.php b/src/api/endpoints/class-tainacan-rest-facets-controller.php index 2a9a01fbc..8f6d6e182 100644 --- a/src/api/endpoints/class-tainacan-rest-facets-controller.php +++ b/src/api/endpoints/class-tainacan-rest-facets-controller.php @@ -90,6 +90,8 @@ class REST_Facets_Controller extends REST_Controller { $options = $metadatum->get_metadata_type_options(); $args = $this->prepare_filters($request); + // handle filter with relationship metadata + if( $metadatum_type === 'Tainacan\Metadata_Types\Relationship' ){ $selected = $this->getRelationshipSelectedValues($request, $metadatum->get_id()); @@ -99,14 +101,13 @@ class REST_Facets_Controller extends REST_Controller { $args['posts_per_page'] = $request['number']; } - if( $selected ){ - //$args['postin'] = $selected; - } - $items = $this->items_repository->fetch($args, $options['collection_id'], 'WP_Query'); + $ids = []; + if ($items->have_posts()) { while ( $items->have_posts() ) { $items->the_post(); + $ids[] = (string) $items->post->ID; $item = new Entities\Item($items->post); $prepared_item = $restItemsClass->prepare_item_for_response($item, $request); @@ -117,10 +118,34 @@ class REST_Facets_Controller extends REST_Controller { wp_reset_postdata(); } + // retrieve selected items + + if( $selected && $request['getSelected'] && $request['getSelected'] === '1' ){ + foreach( $selected as $index => $item_id ){ + + if( in_array($item_id,$ids) ){ + continue; + } + + $item = new Entities\Item($item_id); + $prepared_item = $restItemsClass->prepare_item_for_response($item, $request); + $response[$index] = $prepared_item; + + if( isset($request['number']) && ($index+1) >= $request['number']){ + break; + } + } + } + $this->total_items = $items->found_posts; $this->total_pages = ceil($this->total_items / (int) $items->query_vars['posts_per_page']); - } else if ( $metadatum_type === 'Tainacan\Metadata_Types\Taxonomy' ){ + } + + // handle filter with Taxonomy metadata + + else if ( $metadatum_type === 'Tainacan\Metadata_Types\Taxonomy' ){ + $this->taxonomy = $this->taxonomy_repository->fetch($options['taxonomy_id']); $selected = $this->getTaxonomySelectedValues($request, $options['taxonomy_id']); @@ -131,22 +156,42 @@ class REST_Facets_Controller extends REST_Controller { } else { - if( $selected ){ - //$args['include'] = $selected; + $terms = $this->terms_repository->fetch($args, $this->taxonomy); + + // retrieve selected items + + if( $selected && $request['getSelected'] && $request['getSelected'] === '1' ){ + $ids = $this->get_terms_ids( $terms ); + + foreach( $selected as $index => $term_id ){ + + if( in_array($term_id,$ids) ){ + continue; + } + + $term_selected = $this->terms_repository->fetch($term_id, $this->taxonomy); + array_unshift($terms, $term_selected); + + if( isset($request['number']) && ($index+1) >= $request['number']){ + break; + } + } } - $terms = $this->terms_repository->fetch($args, $this->taxonomy); $restTermClass = new REST_Terms_Controller(); } - foreach ($terms as $term) { array_push($response, $restTermClass->prepare_item_for_response( $term, $request )); } $this->set_pagination_properties_term_type( $args, $response ); - } else { + } + + // handle filter with Text metadata + + else { $metadatum_id = $metadatum->get_id(); $offset = ''; @@ -174,10 +219,25 @@ class REST_Facets_Controller extends REST_Controller { } } - if($selected){ - //foreach( $selected as $value ){ - //$response[] = ['mvalue' => $value]; - //} + // retrieve selected items + + if( $selected && $request['getSelected'] && $request['getSelected'] === '1'){ + $rawValues = $this->get_values( $response ); + + foreach( $selected as $index => $value ){ + + if( in_array($value,$rawValues) ){ + continue; + } + + $row = ['mvalue' => $value, 'metadatum_id' => $metadatum_id ]; + $response[$index] = $row; + + if( isset($request['number']) && ($index+1) >= $request['number']){ + break; + } + } + } $this->set_pagination_properties_text_type( $collection_id, $metadatum_id, ($request['search']) ? $request['search'] : '' , $offset, $number ); @@ -343,7 +403,7 @@ class REST_Facets_Controller extends REST_Controller { if( isset($request['current_query']['metaquery']) ){ foreach( $request['current_query']['metaquery'] as $metaquery ){ - if( $metaquery['key'] === $metadatum_id ){ + if( $metaquery['key'] == $metadatum_id ){ return $metaquery['value']; @@ -368,7 +428,7 @@ class REST_Facets_Controller extends REST_Controller { if( isset($request['current_query']['metaquery']) ){ foreach( $request['current_query']['metaquery'] as $metaquery ){ - if( $metaquery['key'] === $metadatum_id ){ + if( $metaquery['key'] == $metadatum_id ){ return $metaquery['value']; @@ -379,6 +439,32 @@ class REST_Facets_Controller extends REST_Controller { return []; } + + /** + * + */ + private function get_terms_ids( $terms ){ + $ids = []; + + foreach( $terms as $term ){ + $ids[] = (string) $term->WP_Term->term_id; + } + + return $ids; + } + + /** + * + */ + private function get_values( $rows ){ + $values = []; + + foreach( $rows as $row ){ + $values[] = $row['mvalue']; + } + + return $values; + } } ?> \ No newline at end of file diff --git a/src/classes/filter-types/checkbox/Checkbox.vue b/src/classes/filter-types/checkbox/Checkbox.vue index 01c2f2936..79b93549f 100644 --- a/src/classes/filter-types/checkbox/Checkbox.vue +++ b/src/classes/filter-types/checkbox/Checkbox.vue @@ -112,7 +112,7 @@ let collectionTarget = ( this.metadatum_object && this.metadatum_object.metadata_type_options.collection_id ) ? this.metadatum_object.metadata_type_options.collection_id : this.collection_id; - promise = this.getValuesRelationship( collectionTarget, null, [], 0, this.filter.max_options); + promise = this.getValuesRelationship( collectionTarget, null, [], 0, this.filter.max_options, false, '1'); promise .then(() => { if(this.options.length > this.filter.max_options){ @@ -122,7 +122,7 @@ this.$console.error(error); }) } else { - promise = this.getValuesPlainText( this.metadatum, null, this.isRepositoryLevel, [], 0, this.filter.max_options ); + promise = this.getValuesPlainText( this.metadatum, null, this.isRepositoryLevel, [], 0, this.filter.max_options, false, '1' ); promise .then(() => { if(this.options.length > this.filter.max_options){ diff --git a/src/classes/filter-types/filter-types-mixin.js b/src/classes/filter-types/filter-types-mixin.js index 828bd1181..b815fba35 100644 --- a/src/classes/filter-types/filter-types-mixin.js +++ b/src/classes/filter-types/filter-types-mixin.js @@ -18,10 +18,10 @@ export const filter_type_mixin = { query: {} }, methods: { - getValuesPlainText(metadatumId, search, isRepositoryLevel, valuesToIgnore, offset, number, isInCheckboxModal) { + getValuesPlainText(metadatumId, search, isRepositoryLevel, valuesToIgnore, offset, number, isInCheckboxModal, getSelected = '0') { let query_items = { 'current_query': this.query }; - let url = `/collection/${this.collection}/facets/${metadatumId}?`; + let url = `/collection/${this.collection}/facets/${metadatumId}?getSelected=${getSelected}&`; if(offset != undefined && number != undefined){ url += `offset=${offset}&number=${number}&`; @@ -102,9 +102,9 @@ export const filter_type_mixin = { this.$console.error(error); }); }, - getValuesRelationship(collectionTarget, search, valuesToIgnore, offset, number, isInCheckboxModal) { + getValuesRelationship(collectionTarget, search, valuesToIgnore, offset, number, isInCheckboxModal, getSelected = '0') { let query_items = { 'current_query': this.query }; - let url = '/collection/' + this.filter.collection_id + '/facets/' + this.filter.metadatum.metadatum_id + '?'; + let url = '/collection/' + this.filter.collection_id + '/facets/' + this.filter.metadatum.metadatum_id + `?getSelected=${getSelected}&`; if(offset != undefined && number != undefined){ url += `offset=${offset}&number=${number}`; diff --git a/src/classes/filter-types/taxonomy/Checkbox.vue b/src/classes/filter-types/taxonomy/Checkbox.vue index f3b736746..468aa0b76 100644 --- a/src/classes/filter-types/taxonomy/Checkbox.vue +++ b/src/classes/filter-types/taxonomy/Checkbox.vue @@ -99,7 +99,7 @@ let query_items = { 'current_query': this.query }; axios.get('/collection/'+ this.collection +'/facets/' + this.metadatum - + `?hideempty=0&order=asc&parent=0&number=${this.filter.max_options}&` + qs.stringify(query_items)) + + `?getSelected=1&hideempty=0&order=asc&parent=0&number=${this.filter.max_options}&` + qs.stringify(query_items)) .then( res => { for (let item of res.data) { From 22c5737ccd478a0a9b9abe8f09b0439e88940200 Mon Sep 17 00:00:00 2001 From: Mateus Machado Luna Date: Thu, 13 Sep 2018 09:48:08 -0300 Subject: [PATCH 2/8] Uses facets endpoint only to retrieve options on checkboxes list. --- .../other/checkbox-filter-modal.vue | 50 +------------------ .../filter-types/checkbox/Checkbox.vue | 19 ++----- .../filter-types/taxonomy/Checkbox.vue | 15 +----- 3 files changed, 6 insertions(+), 78 deletions(-) diff --git a/src/admin/components/other/checkbox-filter-modal.vue b/src/admin/components/other/checkbox-filter-modal.vue index b91d1de24..342a87d2e 100644 --- a/src/admin/components/other/checkbox-filter-modal.vue +++ b/src/admin/components/other/checkbox-filter-modal.vue @@ -438,8 +438,6 @@ applyFilter() { this.$parent.close(); - let selectedOptions = []; - if(this.isTaxonomy){ this.$eventBusSearch.$emit('input', { filter: 'checkbox', @@ -448,24 +446,7 @@ metadatum_id: this.metadatum_id, collection_id: this.collection_id, terms: this.selected - }); - - for (let selected of this.selected) { - for(let i in this.finderColumns){ - let valueIndex = this.finderColumns[i].findIndex(option => option.value == selected); - - if (valueIndex >= 0) { - selectedOptions.push(this.finderColumns[i][valueIndex]); - } - } - } - - this.$eventBusSearch.$emit('sendValuesToTags', { - filterId: this.filter.id, - value: selectedOptions, - }); - - this.$emit('appliedCheckBoxModal', selectedOptions); + }); } else { this.$eventBusSearch.$emit('input', { filter: 'checkbox', @@ -474,36 +455,9 @@ collection_id: this.collection_id ? this.collection_id : this.filter.collection_id, value: this.selected, }); - - // if(!isNaN(this.selected[0])){ - // for (let option of this.options) { - // let valueIndex = this.selected.findIndex(item => item == option.value); - - // if (valueIndex >= 0) { - // selectedOptions.push(this.options[valueIndex].label); - // } - // } - // } - if(Array.isArray(this.selected)){ - for (let aSelected of this.selected) { - let valueIndex = this.options.findIndex(option => option.value == aSelected); - - if (valueIndex >= 0) { - selectedOptions.push(this.options[valueIndex]); - } - } - } else { - let valueIndex = this.options.findIndex(option => option.value == this.selected); - - if (valueIndex >= 0) { - selectedOptions.push(this.options[valueIndex]); - } - } - - this.$emit('appliedCheckBoxModal', selectedOptions); } - + this.$emit('appliedCheckBoxModal'); } } } diff --git a/src/classes/filter-types/checkbox/Checkbox.vue b/src/classes/filter-types/checkbox/Checkbox.vue index 79b93549f..735ff1b01 100644 --- a/src/classes/filter-types/checkbox/Checkbox.vue +++ b/src/classes/filter-types/checkbox/Checkbox.vue @@ -1,7 +1,7 @@