Skip to content

Commit ca870da

Browse files
Basic filtering/ordering system
1 parent 3d4323b commit ca870da

File tree

5 files changed

+233
-55
lines changed

5 files changed

+233
-55
lines changed

classes/Visualizer/Module/Admin.php

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,64 @@ public function registerAdminMenu() {
610610
remove_submenu_page( Visualizer_Plugin::NAME, Visualizer_Plugin::NAME );
611611
}
612612

613+
/**
614+
* Adds the display filters to be used in the meta_query while displaying the charts.
615+
*/
616+
private function getDisplayFilters( &$query_args ) {
617+
$query = array();
618+
619+
// add chart type filter to the query arguments
620+
$type = filter_input( INPUT_GET, 'type' );
621+
if ( $type && in_array( $type, Visualizer_Plugin::getChartTypes(), true ) ) {
622+
$query[] = array(
623+
'key' => Visualizer_Plugin::CF_CHART_TYPE,
624+
'value' => $type,
625+
'compare' => '=',
626+
);
627+
}
628+
629+
// add chart library filter to the query arguments
630+
$library = filter_input( INPUT_GET, 'library' );
631+
if ( $library ) {
632+
$query[] = array(
633+
'key' => Visualizer_Plugin::CF_CHART_LIBRARY,
634+
'value' => $library,
635+
'compare' => '=',
636+
);
637+
}
638+
639+
// add date filter to the query arguments
640+
$date = filter_input( INPUT_GET, 'date' );
641+
$possible = array_keys( Visualizer_Plugin::getSupportedDateFilter() );
642+
if ( $date && in_array( $date, $possible, true ) ) {
643+
$query_args['date_query'] = array(
644+
'after' => "$date -1 day",
645+
'inclusive' => true,
646+
);
647+
}
648+
649+
// add source filter to the query arguments
650+
$source = filter_input( INPUT_GET, 'source' );
651+
if ( $source ) {
652+
$source = ucwords( $source );
653+
$source = "Visualizer_Source_{$source}";
654+
$query[] = array(
655+
'key' => Visualizer_Plugin::CF_SOURCE,
656+
'value' => $source,
657+
'compare' => '=',
658+
);
659+
}
660+
661+
$query_args['meta_query'] = $query;
662+
663+
$orderby = filter_input( INPUT_GET, 'orderby' );
664+
$order = filter_input( INPUT_GET, 'order' );
665+
if ( $orderby ) {
666+
$query_args['order_by'] = $orderby;
667+
}
668+
$query_args['order'] = empty( $order ) ? 'desc' : $order;
669+
}
670+
613671
/**
614672
* Get the instance of WP_Query that fetches the charts as per the given criteria.
615673
*/
@@ -637,19 +695,9 @@ private function getQuery() {
637695
'posts_per_page' => 6,
638696
'paged' => $page,
639697
);
640-
// add chart type filter to the query arguments
641-
$filter = filter_input( INPUT_GET, 'type' );
642-
if ( $filter && in_array( $filter, Visualizer_Plugin::getChartTypes(), true ) ) {
643-
$query_args['meta_query'] = array(
644-
array(
645-
'key' => Visualizer_Plugin::CF_CHART_TYPE,
646-
'value' => $filter,
647-
'compare' => '=',
648-
),
649-
);
650-
} else {
651-
$filter = 'all';
652-
}
698+
699+
$this->getDisplayFilters( $query_args );
700+
653701
// Added by Ash/Upwork
654702
$filterByMeta = filter_input( INPUT_GET, 's', FILTER_SANITIZE_STRING );
655703
if ( $filterByMeta ) {
@@ -662,7 +710,7 @@ private function getQuery() {
662710
$meta[] = $query;
663711
$query_args['meta_query'] = $meta;
664712
}
665-
$q = new WP_Query( $query_args );
713+
$q = new WP_Query( apply_filters( 'visualizer_pre_query', $query_args ) );
666714
return $q;
667715
}
668716

classes/Visualizer/Plugin.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ class Visualizer_Plugin {
113113
*/
114114
private $_modules = array();
115115

116+
/**
117+
* Returns the date queries supported in the library date filter.
118+
*/
119+
public static function getSupportedDateFilter() {
120+
return apply_filters( 'visualizer_filter_by_date', array( '' => __( 'All dates', 'visualizer' ), 'yesterday' => __( 'Yesterday', 'visualizer' ), 'last week' => __( 'Last Week', 'visualizer' ), 'last month' => __( 'Last Month', 'visualizer' ), 'last year' => __( 'Last Year', 'visualizer' ) ) );
121+
}
122+
116123
/**
117124
* Private constructor.
118125
*

classes/Visualizer/Render/Library.php

Lines changed: 141 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,146 @@ private function _renderMessages() {
6767
}
6868
}
6969

70+
/**
71+
* Displays the search form.
72+
*/
73+
private function getDisplayForm() {
74+
echo '<div class="visualizer-library-form">
75+
<form action="' . admin_url( 'admin.php' ) . '">
76+
<input type="hidden" name="page" value="' . Visualizer_Plugin::NAME . '"/>
77+
<select class="viz-filter" name="type">
78+
';
79+
80+
echo '<option value="" selected>' . __( 'All types', 'visualizer' ) . '</option>';
81+
82+
$type = isset( $_GET['type'] ) ? $_GET['type'] : '';
83+
$enabled = array();
84+
$disabled = array();
85+
foreach ( $this->types as $id => $array ) {
86+
if ( ! is_array( $array ) ) {
87+
// support for old pro
88+
$array = array( 'enabled' => true, 'name' => $array );
89+
}
90+
if ( ! $array['enabled'] ) {
91+
$disabled[ $id ] = $array['name'];
92+
continue;
93+
}
94+
$enabled[ $id ] = $array['name'];
95+
}
96+
97+
asort( $enabled );
98+
asort( $disabled );
99+
100+
foreach ( $enabled as $id => $name ) {
101+
echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . '>' . $name . '</option>';
102+
}
103+
104+
if ( $disabled ) {
105+
echo '<optgroup label="' . __( 'Not available', 'visualizer' ) . '">';
106+
foreach ( $disabled as $id => $name ) {
107+
echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . ' disabled>' . $name . '</option>';
108+
}
109+
echo '</optgroup>';
110+
}
111+
112+
echo '
113+
</select>
114+
<select class="viz-filter" name="library">
115+
';
116+
117+
$libraries = array( '', 'ChartJS', 'DataTable', 'GoogleCharts' );
118+
$library = isset( $_GET['library'] ) ? $_GET['library'] : '';
119+
foreach ( $libraries as $lib ) {
120+
echo '<option value="' . esc_attr( $lib ) . '" ' . selected( $library, $lib ) . '>' . ( $lib === '' ? __( 'All libraries', 'visualizer' ) : $lib ) . '</option>';
121+
}
122+
123+
echo '
124+
</select>
125+
<select class="viz-filter" name="date">
126+
';
127+
128+
$dates = Visualizer_Plugin::getSupportedDateFilter();
129+
$date = isset( $_GET['date'] ) ? $_GET['date'] : '';
130+
foreach ( Visualizer_Plugin::getSupportedDateFilter() as $dt => $label ) {
131+
echo '<option value="' . esc_attr( $dt ) . '" ' . selected( $date, $dt ) . '>' . $label . '</option>';
132+
}
133+
134+
echo '
135+
</select>
136+
<select class="viz-filter" name="source">
137+
';
138+
139+
$disabled = array();
140+
$sources = array( 'json' => __( 'JSON', 'visualizer' ), 'csv' => __( 'Local CSV', 'visualizer' ), 'csv_remote' => __( 'Remote CSV', 'visualizer' ), 'query' => __( 'Database', 'visualizer' ), 'query_wp' => __( 'WordPress', 'visualizer' ) );
141+
if ( ! Visualizer_Module::is_pro() ) {
142+
$disabled['query'] = $sources['query'];
143+
unset( $sources['query'] );
144+
}
145+
if ( ! apply_filters( 'visualizer_is_business', false ) ) {
146+
$disabled['query_wp'] = $sources['query_wp'];
147+
unset( $sources['query_wp'] );
148+
}
149+
$sources = array_filter( $sources );
150+
uasort(
151+
$sources, function( $a, $b ) {
152+
if ( $a == $b ) {
153+
return 0;
154+
}
155+
return ( $a < $b ) ? -1 : 1;
156+
}
157+
);
158+
159+
$source = isset( $_GET['source'] ) ? $_GET['source'] : '';
160+
echo '<option value="">' . __( 'All sources', 'visualizer' ) . '</option>';
161+
foreach ( $sources as $field => $label ) {
162+
echo '<option value="' . esc_attr( $field ) . '" ' . selected( $source, $field ) . '>' . $label . '</option>';
163+
}
164+
165+
if ( $disabled ) {
166+
echo '<optgroup label="' . __( 'Not available', 'visualizer' ) . '">';
167+
foreach ( $disabled as $id => $name ) {
168+
echo '<option value="' . esc_attr( $id ) . '" ' . selected( $type, $id ) . ' disabled>' . $name . '</option>';
169+
}
170+
echo '</optgroup>';
171+
}
172+
173+
$name = isset( $_GET['s'] ) ? $_GET['s'] : '';
174+
echo '
175+
</select>
176+
<input class="viz-filter" type="text" name="s" placeholder="' . __( 'Enter title', 'visualizer' ) . '" value="' . esc_attr( $name ) . '">
177+
';
178+
179+
echo '
180+
<span class="viz-filter">|</span>
181+
<select class="viz-filter" name="orderby">
182+
';
183+
184+
$order_by_fields = apply_filters( 'visualizer_filter_order_by', array( 'date' => __( 'Date', 'visualizer' ), 's' => __( 'Title', 'visualizer' ) ) );
185+
$order_by = isset( $_GET['orderby'] ) ? $_GET['orderby'] : '';
186+
echo '<option value="">' . __( 'Order By', 'visualizer' ) . '</option>';
187+
foreach ( $order_by_fields as $field => $label ) {
188+
echo '<option value="' . esc_attr( $field ) . '" ' . selected( $order_by, $field ) . '>' . $label . '</option>';
189+
}
190+
191+
echo '
192+
</select>
193+
<select class="viz-filter" name="order">
194+
';
195+
196+
$order_type = array( 'desc' => __( 'Descending', 'visualizer' ), 'asc' => __( 'Ascending', 'visualizer' ) );
197+
$order = isset( $_GET['order'] ) ? $_GET['order'] : 'desc';
198+
foreach ( $order_type as $field => $label ) {
199+
echo '<option value="' . esc_attr( $field ) . '" ' . selected( $order, $field ) . '>' . $label . '</option>';
200+
}
201+
202+
echo '
203+
</select>
204+
<input type="submit" class="viz-filter button button-secondary" value="' . __( 'Apply Filters', 'visualizer' ) . '">
205+
<input type="button" id="viz-lib-reset" class="viz-filter button button-secondary" value="' . __( 'Clear Filters', 'visualizer' ) . '">
206+
</form>
207+
</div>';
208+
}
209+
70210
/**
71211
* Renders library content.
72212
*
@@ -83,47 +223,7 @@ private function _renderLibrary() {
83223
// Added by Ash/Upwork
84224
echo $this->custom_css;
85225
echo '<div id="visualizer-types" class="visualizer-clearfix">';
86-
echo '<ul class="subsubsub">';
87-
// All tab.
88-
echo '<li class="visualizer-list-item all"><a class="' . ( ! isset( $_GET['type'] ) || empty( $_GET['type'] ) ? 'current' : '' ) . '" href="', esc_url( add_query_arg( array( 'vpage' => false, 'type' => false, 'vaction' => false, 's' => false ) ) ), '">' . __( 'All', 'visualizer' ) . '</a> | </li>';
89-
foreach ( $this->types as $type => $array ) {
90-
if ( ! is_array( $array ) ) {
91-
// support for old pro
92-
$array = array( 'enabled' => true, 'name' => $array );
93-
}
94-
$label = $array['name'];
95-
$link = '<a class=" " href="' . esc_url(
96-
add_query_arg(
97-
array(
98-
'type' => $type,
99-
'vpage' => false,
100-
'vaction' => false,
101-
's' => false,
102-
)
103-
)
104-
) . '">';
105-
if ( ! $array['enabled'] ) {
106-
$link = "<a class=' visualizer-pro-only' href='" . Visualizer_Plugin::PRO_TEASER_URL . "' target='_blank'>";
107-
}
108-
echo '<li class="visualizer-list-item ' . esc_attr( $this->type ) . '">';
109-
if ( $type === $this->type ) {
110-
echo '<a class="current" href="', esc_url( add_query_arg( 'vpage', false ) ), '">';
111-
echo $label;
112-
echo '</a>';
113-
} else {
114-
echo $link;
115-
echo $label;
116-
echo '</a>';
117-
}
118-
echo ' | </li>';
119-
}
120-
echo '</ul>';
121-
echo '<form action="" method="get"><p id="visualizer-search" class="search-box">
122-
<input type="search" placeholder="' . __( 'Enter title', 'visualizer' ) . '" name="s" value="' . $filterBy . '">
123-
<input type="hidden" name="page" value="visualizer">
124-
<button type="submit" id="search-submit" title="' . __( 'Search', 'visualizer' ) . '"><i class="dashicons dashicons-search"></i></button>
125-
<button type="button" class="add-new-chart" title="' . __( 'Add New', 'visualizer' ) . '"><i class="dashicons dashicons-plus-alt"></i></button>
126-
</p> </form>';
226+
$this->getDisplayForm();
127227
echo '</div>';
128228
echo '<div id="visualizer-content-wrapper">';
129229
if ( ! empty( $this->charts ) ) {

css/library.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,10 @@ input:checked + .visualizer-slider:before {
288288
text-align: center;
289289
}
290290

291+
div.visualizer-library-form .viz-filter {
292+
vertical-align: middle;
293+
}
294+
291295
button.media-modal-close {
292296
display: none !important;
293297
}

js/library.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,25 @@
4545
$(document).ready(function () {
4646
$('.visualizer-chart, .visualizer-library-pagination').fadeIn(500);
4747

48+
// clears the filters in the library form and submits.
49+
$('#viz-lib-reset').on('click', function(e){
50+
e.preventDefault();
51+
$(this).parent('form')[0].reset();
52+
$(this).parent('form').find('.viz-filter').each(function(index, el){
53+
var tag = $(el).prop('tagName').toLowerCase() + (typeof $(el).attr('type') !== 'undefined' ? $(el).attr('type').toLowerCase() : '');
54+
switch(tag){
55+
case 'select':
56+
$(el).prop('selectedIndex', 0);
57+
break;
58+
case 'inputtext':
59+
$(el).val('');
60+
break;
61+
}
62+
63+
});
64+
$(this).parent('form').submit();
65+
});
66+
4867
$('.visualizer-chart-shortcode').click(function (e) {
4968
var range, selection;
5069

0 commit comments

Comments
 (0)