PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.15.0
Independent Analytics – WordPress Analytics Plugin v2.15.0
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 3 months ago AJAX_Manager.php 5 days ago Archive_Link.php 3 months ago Clear_Favorite_Report.php 5 days ago Click_Tracking_Cache_Cleared.php 3 months ago Configure_Pruner.php 3 months ago Copy_Report.php 3 months ago Create_Campaign.php 2 years ago Create_Report.php 3 months ago Delete_Campaign.php 2 years ago Delete_Data.php 3 months ago Delete_Link.php 3 months ago Delete_Module.php 3 months ago Delete_Report.php 3 months ago Dismiss_Notice.php 1 year ago Edit_Link.php 3 months ago Edit_Module.php 3 months ago Export_Report_Statistics.php 2 months ago Export_Report_Table.php 9 months ago Export_Reports.php 5 days ago FetchRealTimeData.php 5 days ago Filter.php 2 months ago Get_Journey_Timeline.php 6 months ago Get_Markup_For_Module.php 1 year ago Get_Markup_For_Modules.php 3 months ago Import_Reports.php 3 months ago Migration_Status.php 3 months ago Pause_Email_Reports.php 3 months ago Preview_Email.php 2 months ago Refresh_Modules.php 3 months ago Rename_Report.php 3 months ago Reorder_Modules.php 3 months ago Reset_Analytics.php 3 months ago Reset_Overview.php 3 months ago SaveRealTimePreferences.php 5 days ago Save_Module.php 3 months ago Save_Report.php 3 months ago Set_Favorite_Report.php 1 year ago Set_WooCommerce_Statuses_To_Track.php 3 months ago Sort_Links.php 3 months ago Sort_Reports.php 3 months ago Test_Email.php 2 months ago Update_Capabilities.php 3 months ago Update_User_Settings.php 3 months ago
Filter.php
152 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 $is_journeys_table = $table_type === 'journeys';
48 $table_class = Env::get_table();
49 $filter_logic = $this->get_filter_logic();
50 $examiner_config = Examiner_Config::make(['type' => $this->get_field('examiner_type'), 'group' => $this->get_field('examiner_group'), 'id' => $this->get_int_field('examiner_id')]);
51 /** @var Table $table */
52 $table = new $table_class($group, $is_new_group);
53 $filters = $table->sanitize_filters($filters);
54 $filters = $table->resolve_filter_conflicts($filters, $filter_logic);
55 $sort_configuration = $table->sanitize_sort_parameters($sort_column, $sort_direction);
56 $rows_class = $table->group()->rows_class();
57 $statistics_class = $table->group()->statistics_class();
58 $get_all_rows = $as_csv || $is_geo_table;
59 /** @var Rows $rows_query */
60 $rows_query = new $rows_class($date_range, $sort_configuration, $get_all_rows ? null : $number_of_rows, $filters, $filter_logic);
61 if ($examiner_config) {
62 $rows_query->for_examiner($examiner_config);
63 }
64 $rows = $rows_query->rows();
65 if ($as_csv) {
66 $csv = $table->csv($rows, \true);
67 echo $csv->to_string();
68 return;
69 }
70 if (empty($filters)) {
71 /** @var Statistics $statistics */
72 $statistics = new $statistics_class($date_range, null, $chart_interval);
73 } else {
74 $statistics = new $statistics_class($date_range, $rows_query, $chart_interval);
75 }
76 $statistics->fetch();
77 $total_number_of_rows = $statistics->total_number_of_rows();
78 $table->set_statistics($statistics);
79 $quick_stat_statistics = $statistics;
80 $hide_unfiltered_statistics = \false;
81 // The examiner isn't showing quick stats for the table rows. It's showing quick stats for the
82 // examined record.
83 if ($examiner_config) {
84 $examiner_table_class = Env::get_table($examiner_config->type());
85 $examiner_table = new $examiner_table_class($examiner_config->group());
86 $examiner_rows_class = $examiner_table->group()->rows_class();
87 $examiner_statistics_class = $examiner_table->group()->statistics_class();
88 /** @var Rows $rows_query */
89 $rows_query = new $examiner_rows_class($date_range, $examiner_table->sanitize_sort_parameters());
90 $rows_query->limit_to($examiner_config->id());
91 $quick_stat_statistics = new $examiner_statistics_class($date_range, $rows_query, $chart_interval);
92 $quick_stat_statistics->fetch();
93 $hide_unfiltered_statistics = \true;
94 $table->set_statistics($quick_stat_statistics);
95 }
96 $chart_markup = null;
97 $chart_interval_id = $chart_interval->id();
98 if ($is_geo_table) {
99 $map_data = new Map_Data($rows);
100 $chart = new Map($map_data->get_country_data(), $date_range->label());
101 $chart_markup = $chart->get_html();
102 $rows = \array_slice($rows, 0, $number_of_rows);
103 } elseif ($is_journeys_table) {
104 $chart_interval_id = null;
105 $chart_markup = null;
106 } else {
107 $chart = new Chart($quick_stat_statistics);
108 $chart_markup = $chart->get_html();
109 }
110 $quick_stats = new Quick_Stats($quick_stat_statistics, \false, \false, $hide_unfiltered_statistics);
111 $raw_filters = \array_map(function (\IAWP\Rows\Filter $filter) {
112 return $filter->as_associative_array();
113 }, $filters);
114 \wp_send_json_success(['stats' => $quick_stats->get_html(), 'chart' => $chart_markup, 'chartInterval' => $chart_interval_id, 'table' => $table->get_rendered_template($rows, \false, $sort_configuration->column(), $sort_configuration->direction()), 'rows' => $table->get_rendered_template($rows, \true, $sort_configuration->column(), $sort_configuration->direction()), 'tableToolbar' => $table->get_table_toolbar_markup(), 'totalNumberOfRows' => $total_number_of_rows, '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)]);
115 }
116 /**
117 * Get the date range for the filter request
118 *
119 * The date info can be supplied in one of two ways.
120 *
121 * The first is to provide a relative_range_id which is converted into start, end, and label.
122 *
123 * The second is to provide explicit start and end fields which will be used as is.
124 *
125 * @return Date_Range
126 */
127 private function get_date_range() : Date_Range
128 {
129 $relative_range_id = $this->get_field('relative_range_id');
130 $exact_start = $this->get_field('exact_start');
131 $exact_end = $this->get_field('exact_end');
132 if (!\is_null($exact_start) && !\is_null($exact_end)) {
133 try {
134 $start = new DateTime($exact_start, Timezone::site_timezone());
135 $end = new DateTime($exact_end, Timezone::site_timezone());
136 return new Exact_Date_Range($start, $end);
137 } catch (Throwable $e) {
138 // Do nothing and fall back to default relative date range
139 }
140 }
141 return new Relative_Date_Range($relative_range_id);
142 }
143 private function get_filter_logic() : string
144 {
145 $value = $this->get_field('filter_logic');
146 if (!\in_array($value, ['and', 'or'])) {
147 return 'and';
148 }
149 return $value;
150 }
151 }
152