PluginProbe ʕ •ᴥ•ʔ
Independent Analytics – WordPress Analytics Plugin / 2.5.1
Independent Analytics – WordPress Analytics Plugin v2.5.1
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 / Dashboard_Options.php
independent-analytics / IAWP Last commit date
AJAX 2 years ago Admin_Page 2 years ago Custom_WordPress_Columns 2 years ago Date_Range 2 years ago Filter_Lists 2 years ago Form_Submissions 2 years ago Interval 2 years ago Menu_Bar_Stats 2 years ago Migrations 2 years ago Models 2 years ago Public_API 2 years ago Rows 2 years ago Statistics 2 years ago Tables 2 years ago Utils 2 years ago Campaign_Builder.php 2 years ago Capability_Manager.php 2 years ago Chart.php 2 years ago Chart_Geo.php 2 years ago Cron_Manager.php 2 years ago Current_Traffic_Finder.php 2 years ago Dashboard_Options.php 2 years ago Dashboard_Widget.php 2 years ago Database.php 2 years ago Database_Manager.php 2 years ago Email_Chart.php 2 years ago Email_Reports.php 2 years ago Empty_Report_Option.php 2 years ago Env.php 2 years ago Filters.php 2 years ago Form.php 2 years ago Geo_Database_Background_Job.php 2 years ago Geo_Database_Manager.php 2 years ago Geoposition.php 2 years ago Icon_Directory.php 2 years ago Icon_Directory_Factory.php 2 years ago Illuminate_Builder.php 2 years ago Independent_Analytics.php 2 years ago Interrupt.php 2 years ago Known_Referrers.php 2 years ago Plugin_Conflict_Detector.php 2 years ago Plugin_Group.php 2 years ago Plugin_Group_Option.php 2 years ago Query.php 2 years ago Quick_Stat.php 2 years ago Quick_Stats.php 2 years ago REST_API.php 2 years ago Real_Time.php 2 years ago Report.php 2 years ago Report_Finder.php 2 years ago Report_Options_Parser.php 2 years ago Resource_Identifier.php 2 years ago Settings.php 2 years ago Sort_Configuration.php 2 years ago Track_Resource_Changes.php 2 years ago View.php 2 years ago View_Counter.php 2 years ago Visitors_Over_Time_Finder.php 2 years ago WP_Option_Cache_Bust.php 2 years ago WooCommerce_Order.php 2 years ago WooCommerce_Referrer_Meta_Box.php 2 years ago
Dashboard_Options.php
187 lines
1 <?php
2
3 namespace IAWP;
4
5 use DateTime;
6 use IAWP\Date_Range\Date_Range;
7 use IAWP\Date_Range\Exact_Date_Range;
8 use IAWP\Date_Range\Relative_Date_Range;
9 use IAWP\Statistics\Intervals\Interval;
10 use IAWP\Statistics\Intervals\Intervals;
11 use IAWP\Tables\Table;
12 use IAWP\Utils\Request;
13 use IAWP\Utils\Singleton;
14 use IAWPSCOPED\Proper\Timezone;
15 use Throwable;
16 /**
17 * Dashboards support various options via the search query string portion of the URL.
18 *
19 * The Dashboard_Options class give you an interface for fetching any set values or falling back
20 * to a default value as needed.
21 * @internal
22 */
23 class Dashboard_Options
24 {
25 use Singleton;
26 private $report;
27 private static $default_visible_quick_stats = ['visitors', 'views', 'sessions', 'average_session_duration', 'bounce_rate', 'views_per_session', 'wc_orders', 'wc_net_sales'];
28 private static $default_visible_datasets = ['visitors', 'views'];
29 private function __construct()
30 {
31 $this->report = $this->fetch_current_report();
32 }
33 public function report_name() : ?string
34 {
35 if (\is_null($this->report->name ?? null)) {
36 return 'Report';
37 }
38 return $this->report->name;
39 }
40 public function visible_columns() : ?array
41 {
42 if (Request::get_post_array('columns')) {
43 return Request::get_post_array('columns');
44 }
45 if (\is_null($this->report) || \is_null($this->report->columns)) {
46 return null;
47 }
48 return \json_decode($this->report->columns, \true);
49 }
50 public function visible_quick_stats() : array
51 {
52 if (Request::get_post_array('quick_stats')) {
53 return Request::get_post_array('quick_stats');
54 }
55 $decoded_value = \json_decode($this->report->quick_stats ?? 'null', \true);
56 if (\is_array($decoded_value)) {
57 return $decoded_value;
58 }
59 return self::$default_visible_quick_stats;
60 }
61 public function visible_datasets() : array
62 {
63 if (Request::get_post_array('visible_datasets')) {
64 return Request::get_post_array('visible_datasets');
65 }
66 $decoded_value = \json_decode($this->report->visible_datasets ?? 'null', \true);
67 if (\is_array($decoded_value)) {
68 return $decoded_value;
69 }
70 return self::$default_visible_datasets;
71 }
72 public function filters() : array
73 {
74 if (\is_null($this->report) || \is_null($this->report->filters)) {
75 return [];
76 }
77 $table_class = Table::get_table_by_type($this->report->type);
78 $table = new $table_class($this->report->group_name ?? null);
79 $filters = \json_decode($this->report->filters, \true);
80 return \is_null($filters) ? [] : $table->sanitize_filters($filters);
81 }
82 public function sort_column() : string
83 {
84 return $this->report->sort_column ?? 'visitors';
85 }
86 public function sort_direction() : string
87 {
88 return $this->report->sort_direction ?? 'desc';
89 }
90 public function group() : ?string
91 {
92 return $this->report->group_name ?? null;
93 }
94 public function chart_interval() : ?Interval
95 {
96 if (\is_null($this->report->chart_interval ?? null)) {
97 return Intervals::default_for($this->get_date_range()->number_of_days());
98 }
99 return Intervals::find_by_id($this->report->chart_interval);
100 }
101 /**
102 * @return Date_Range
103 */
104 public function get_date_range() : Date_Range
105 {
106 if ($this->has_exact_range()) {
107 try {
108 $start = new DateTime($this->start(), Timezone::site_timezone());
109 $end = new DateTime($this->end(), Timezone::site_timezone());
110 return new Exact_Date_Range($start, $end);
111 } catch (Throwable $e) {
112 // Do nothing and fall back to default relative date range
113 }
114 }
115 return new Relative_Date_Range($this->relative_range_id());
116 }
117 public function start() : ?string
118 {
119 if (!$this->has_exact_range()) {
120 return null;
121 }
122 return $this->report->exact_start;
123 }
124 public function end() : ?string
125 {
126 if (!$this->has_exact_range()) {
127 return null;
128 }
129 return $this->report->exact_end;
130 }
131 /**
132 * Prefer exact range to relative range if both are provided
133 */
134 public function relative_range_id() : ?string
135 {
136 $relative_range_id = $this->report->relative_range_id ?? null;
137 if (!$this->has_exact_range() && $relative_range_id === null) {
138 return 'LAST_THIRTY';
139 } elseif ($this->has_exact_range()) {
140 return null;
141 } elseif (Relative_Date_Range::is_valid_range($relative_range_id) === \false) {
142 return 'LAST_THIRTY';
143 }
144 return $relative_range_id;
145 }
146 public function maybe_redirect() : void
147 {
148 if (\IAWP\Env::get_page() !== 'independent-analytics') {
149 return;
150 }
151 if (empty($_GET['report']) && empty($_GET['tab'])) {
152 $favorite_report = \IAWP\Report_Finder::get_favorite();
153 if (\is_null($favorite_report)) {
154 return;
155 }
156 \wp_safe_redirect($favorite_report->url());
157 exit;
158 }
159 if (!empty($_GET['report']) && \is_null($this->report)) {
160 \wp_safe_redirect(\IAWPSCOPED\iawp_dashboard_url(['tab' => \IAWP\Env::get_tab()]));
161 exit;
162 }
163 if (!\is_null($this->report) && \IAWP\Env::get_tab() !== $this->report->type) {
164 \wp_safe_redirect(\IAWPSCOPED\iawp_dashboard_url(['tab' => $this->report->type, 'report' => $this->report->report_id]));
165 exit;
166 }
167 }
168 public function is_sidebar_collapsed() : bool
169 {
170 $is_sidebar_collapsed = \get_user_meta(\get_current_user_id(), 'iawp_is_sidebar_collapsed', \true) === '1';
171 return $is_sidebar_collapsed;
172 }
173 private function fetch_current_report() : ?object
174 {
175 $reports_table = \IAWP\Query::get_table_name(\IAWP\Query::REPORTS);
176 $report_id = \filter_input(\INPUT_GET, 'report', \FILTER_VALIDATE_INT);
177 if (!\is_int($report_id)) {
178 return null;
179 }
180 return \IAWP\Illuminate_Builder::get_builder()->from($reports_table)->where('report_id', '=', $report_id)->first();
181 }
182 private function has_exact_range() : bool
183 {
184 return !\is_null($this->report->exact_start ?? null) && !\is_null($this->report->exact_end ?? null);
185 }
186 }
187