PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.13.6
Independent Analytics – WordPress Analytics Plugin v2.13.6
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 1.19.1 1.2 1.20.0 1.21.0 1.22.0 1.22.1 1.23.0 1.23.1 1.24.0 1.24.1 1.25.0 1.25.1 1.26.0 1.27.0 1.28.0 1.28.1 1.28.2 1.28.3 1.29.0 1.3 1.30.0 1.30.1 1.4 1.5 1.6 1.7 1.8 1.9 2.0.0 2.0.1 2.1.4 2.1.5 2.1.6 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.10 2.11.2 2.11.3 2.11.4 2.11.5 2.11.6 2.11.7 2.11.8 2.11.9 2.12.0 2.12.1 2.12.2 2.13.1 2.13.2 2.13.5 2.13.6 2.14.0 2.14.1 2.14.2 2.14.4 2.14.6 2.14.7 2.14.8 2.14.9 2.2.0 2.2.1 2.3.1 2.3.2 2.4.2 2.4.3 2.5.0 2.5.1 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.7.1 2.7.2 2.7.3 2.8.2 2.8.3 2.8.4 2.8.5 2.8.6 2.8.7 2.8.8 2.8.9 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7
independent-analytics / IAWP / AJAX / Filter.php
independent-analytics / IAWP / AJAX Last commit date
AJAX.php 1 year ago AJAX_Manager.php 1 year ago Archive_Link.php 1 year ago Click_Tracking_Cache_Cleared.php 1 year ago Configure_Pruner.php 2 years ago Copy_Report.php 1 year ago Create_Campaign.php 2 years ago Create_Report.php 1 year ago Delete_Campaign.php 2 years ago Delete_Data.php 1 year ago Delete_Link.php 9 months ago Delete_Module.php 1 year ago Delete_Report.php 1 year ago Dismiss_Notice.php 1 year ago Edit_Link.php 1 year ago Edit_Module.php 1 year ago Export_Report_Statistics.php 10 months ago Export_Report_Table.php 10 months ago Export_Reports.php 8 months ago Filter.php 10 months ago Get_Markup_For_Module.php 1 year ago Get_Markup_For_Modules.php 1 year ago Import_Reports.php 1 year ago Migration_Status.php 1 year ago Preview_Email.php 2 years ago Real_Time_Data.php 2 years ago Refresh_Modules.php 1 year ago Rename_Report.php 1 year ago Reorder_Modules.php 1 year ago Reset_Analytics.php 2 years ago Reset_Overview.php 1 year ago Save_Module.php 1 year ago Save_Report.php 1 year ago Set_Favorite_Report.php 1 year ago Set_WooCommerce_Statuses_To_Track.php 2 years ago Sort_Links.php 1 year ago Sort_Reports.php 1 year ago Test_Email.php 2 years ago Update_Capabilities.php 2 years ago Update_User_Settings.php 2 years ago
Filter.php
141 lines
1 <?php
2
3 namespace IAWP\AJAX;
4
5 use DateTime;
6 use IAWP\Chart;
7 use IAWP\Date_Range\Date_Range;
8 use IAWP\Date_Range\Exact_Date_Range;
9 use IAWP\Date_Range\Relative_Date_Range;
10 use IAWP\Env;
11 use IAWP\Examiner_Config;
12 use IAWP\Map;
13 use IAWP\Map_Data;
14 use IAWP\Quick_Stats;
15 use IAWP\Rows\Rows;
16 use IAWP\Statistics\Intervals\Intervals;
17 use IAWP\Statistics\Statistics;
18 use IAWP\Tables\Table;
19 use IAWP\Utils\Timezone;
20 use Throwable;
21 /** @internal */
22 class Filter extends \IAWP\AJAX\AJAX
23 {
24 protected function action_name() : string
25 {
26 return 'iawp_filter';
27 }
28 protected function action_required_fields() : array
29 {
30 return ['table_type', 'columns'];
31 }
32 protected function action_callback() : void
33 {
34 $date_range = $this->get_date_range();
35 $is_new_date_range = $this->get_field('is_new_date_range') === 'true';
36 $filters = $this->get_field('filters') ?? [];
37 $sort_column = $this->get_field('sort_column') ?? null;
38 $sort_direction = $this->get_field('sort_direction') ?? null;
39 $group = $this->get_field('group') ?? null;
40 $as_csv = $this->get_field('as_csv') ?? \false;
41 $is_new_group = $this->get_field('is_new_group') === 'true';
42 $chart_interval = $is_new_date_range ? Intervals::default_for($date_range->number_of_days()) : Intervals::find_by_id($this->get_field('chart_interval'));
43 $page = \intval($this->get_field('page') ?? 1);
44 $number_of_rows = $page * \IAWPSCOPED\iawp()->pagination_page_size();
45 $table_type = $this->get_field('table_type');
46 $is_geo_table = $table_type === 'geo';
47 $table_class = Env::get_table();
48 $filter_logic = $this->get_filter_logic();
49 $examiner_config = Examiner_Config::make(['type' => $this->get_field('examiner_type'), 'group' => $this->get_field('examiner_group'), 'id' => $this->get_int_field('examiner_id')]);
50 /** @var Table $table */
51 $table = new $table_class($group, $is_new_group);
52 $filters = $table->sanitize_filters($filters);
53 $sort_configuration = $table->sanitize_sort_parameters($sort_column, $sort_direction);
54 $rows_class = $table->group()->rows_class();
55 $statistics_class = $table->group()->statistics_class();
56 $get_all_rows = $as_csv || $is_geo_table;
57 /** @var Rows $rows_query */
58 $rows_query = new $rows_class($date_range, $sort_configuration, $get_all_rows ? null : $number_of_rows, $filters, $filter_logic);
59 if ($examiner_config) {
60 $rows_query->for_examiner($examiner_config);
61 }
62 $rows = $rows_query->rows();
63 if ($as_csv) {
64 $csv = $table->csv($rows, \true);
65 echo $csv->to_string();
66 return;
67 }
68 if (empty($filters)) {
69 /** @var Statistics $statistics */
70 $statistics = new $statistics_class($date_range, null, $chart_interval);
71 } else {
72 $statistics = new $statistics_class($date_range, $rows_query, $chart_interval);
73 }
74 $total_number_of_rows = $statistics->total_number_of_rows();
75 $table->set_statistics($statistics);
76 $quick_stat_statistics = $statistics;
77 $hide_unfiltered_statistics = \false;
78 // The examiner isn't showing quick stats for the table rows. It's showing quick stats for the
79 // examined record.
80 if ($examiner_config) {
81 $examiner_table_class = Env::get_table($examiner_config->type());
82 $examiner_table = new $examiner_table_class($examiner_config->group());
83 $examiner_rows_class = $examiner_table->group()->rows_class();
84 $examiner_statistics_class = $examiner_table->group()->statistics_class();
85 /** @var Rows $rows_query */
86 $rows_query = new $examiner_rows_class($date_range, $examiner_table->sanitize_sort_parameters());
87 $rows_query->limit_to($examiner_config->id());
88 $quick_stat_statistics = new $examiner_statistics_class($date_range, $rows_query, $chart_interval);
89 $hide_unfiltered_statistics = \true;
90 $table->set_statistics($quick_stat_statistics);
91 }
92 if ($is_geo_table) {
93 $map_data = new Map_Data($rows);
94 $chart = new Map($map_data->get_country_data(), $date_range->label());
95 $rows = \array_slice($rows, 0, $number_of_rows);
96 } else {
97 $chart = new Chart($quick_stat_statistics);
98 }
99 $quick_stats = new Quick_Stats($quick_stat_statistics, \false, \false, $hide_unfiltered_statistics);
100 $raw_filters = \array_map(function (\IAWP\Rows\Filter $filter) {
101 return $filter->as_associative_array();
102 }, $filters);
103 \wp_send_json_success(['rows' => $table->get_rendered_template($rows, \true, $sort_configuration->column(), $sort_configuration->direction()), 'table' => $table->get_rendered_template($rows, \false, $sort_configuration->column(), $sort_configuration->direction()), 'table_toolbar' => $table->get_table_toolbar_markup(), 'totalNumberOfRows' => $total_number_of_rows, 'chart' => $chart->get_html(), 'stats' => $quick_stats->get_html(), 'label' => $date_range->label(), 'isLastPage' => \count($rows) < \IAWPSCOPED\iawp()->pagination_page_size() * $page, 'columns' => $table->visible_column_ids(), 'columnsHTML' => $table->column_picker_html(), 'groupId' => $table->group()->id(), 'filters' => $raw_filters, 'filtersTemplateHTML' => $table->filters_template_html(), 'filtersButtonsHTML' => $table->filters_condition_buttons_html($filters), 'chartInterval' => $chart_interval->id()]);
104 }
105 /**
106 * Get the date range for the filter request
107 *
108 * The date info can be supplied in one of two ways.
109 *
110 * The first is to provide a relative_range_id which is converted into start, end, and label.
111 *
112 * The second is to provide explicit start and end fields which will be used as is.
113 *
114 * @return Date_Range
115 */
116 private function get_date_range() : Date_Range
117 {
118 $relative_range_id = $this->get_field('relative_range_id');
119 $exact_start = $this->get_field('exact_start');
120 $exact_end = $this->get_field('exact_end');
121 if (!\is_null($exact_start) && !\is_null($exact_end)) {
122 try {
123 $start = new DateTime($exact_start, Timezone::site_timezone());
124 $end = new DateTime($exact_end, Timezone::site_timezone());
125 return new Exact_Date_Range($start, $end);
126 } catch (Throwable $e) {
127 // Do nothing and fall back to default relative date range
128 }
129 }
130 return new Relative_Date_Range($relative_range_id);
131 }
132 private function get_filter_logic() : string
133 {
134 $value = $this->get_field('filter_logic');
135 if (!\in_array($value, ['and', 'or'])) {
136 return 'and';
137 }
138 return $value;
139 }
140 }
141