PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-premium-analytics / src / class-dashboard-section.php
jetpack / jetpack_vendor / automattic / jetpack-premium-analytics / src Last commit date
REST 2 weeks ago Reports 1 week ago Sync 2 weeks ago class-analytics.php 3 days ago class-capabilities.php 2 weeks ago class-connection-configuration.php 2 weeks ago class-dashboard-section-registry.php 2 weeks ago class-dashboard-section.php 3 days ago class-dashboard-support-routes.php 1 week ago class-jetpack-stats-tracker.php 2 weeks ago class-notices.php 2 weeks ago class-widget-type-registry.php 2 weeks ago class-widget-type.php 2 weeks ago class-woocommerce-analytics-tracker.php 2 weeks ago csv-exports.php 2 weeks ago dashboard-grammar.php 2 weeks ago dashboard-layout.php 3 days ago dashboard-sections.php 3 days ago rest-namespace.php 2 weeks ago videopress-availability.php 3 days ago widget-availability.php 3 days ago widget-i18n.json 2 weeks ago widget-modules.php 3 days ago widget-type-support.php 3 days ago widget-types.php 2 weeks ago
class-dashboard-section.php
259 lines
1 <?php
2 /**
3 * Dashboard Sections API: Dashboard_Section class.
4 *
5 * @package automattic/jetpack-premium-analytics
6 */
7
8 namespace Automattic\Jetpack\PremiumAnalytics;
9
10 /**
11 * Represents a dashboard section.
12 *
13 * A dashboard section is the server-owned model behind a top-level dashboard
14 * tab. It carries display metadata plus availability and default-layout
15 * callbacks that can be extended by consumers.
16 */
17 final class Dashboard_Section {
18
19 /**
20 * Date-filter surface offering the rolling date-range picker (today, last 7
21 * days, a custom range, …) plus the comparison control. The default.
22 *
23 * @since 0.2.0
24 * @var string
25 */
26 const DATE_FILTER_RANGE = 'range';
27
28 /**
29 * Date-filter surface offering all time plus one entry per calendar year,
30 * for sections whose data is read as whole history rather than as a
31 * rolling window.
32 *
33 * @since 0.2.0
34 * @var string
35 */
36 const DATE_FILTER_YEAR = 'year';
37
38 /**
39 * Date-filter surfaces a section may declare.
40 *
41 * @since 0.2.0
42 * @var string[]
43 */
44 const DATE_FILTERS = array( self::DATE_FILTER_RANGE, self::DATE_FILTER_YEAR );
45
46 /**
47 * Dashboard identifier.
48 *
49 * @var string
50 */
51 public $dashboard_name;
52
53 /**
54 * Section identifier.
55 *
56 * @var string
57 */
58 public $id;
59
60 /**
61 * URL-facing section slug, derived from the identifier.
62 *
63 * @var string
64 */
65 public $slug;
66
67 /**
68 * Display label, naming the section's tab.
69 *
70 * @var string
71 */
72 public $label;
73
74 /**
75 * Section heading, deliberately distinct from the tab label: the tab reads
76 * `Traffic` where the heading reads `Site traffic`. Null falls back to the label.
77 *
78 * @since 0.3.0
79 * @var string|null
80 */
81 public $title = null;
82
83 /**
84 * Section description, shown as the page subtitle while this section is active.
85 *
86 * @since 0.3.0
87 * @var string|null
88 */
89 public $description = null;
90
91 /**
92 * Sort order.
93 *
94 * @var int
95 */
96 public $order = 10;
97
98 /**
99 * Which date filter the section's header offers, as one of self::DATE_FILTERS.
100 *
101 * @since 0.2.0
102 * @var string
103 */
104 public $date_filter = self::DATE_FILTER_RANGE;
105
106 /**
107 * Which optional controls the section's date filter offers.
108 *
109 * @since 0.3.0
110 * @var array
111 */
112 public $date_filter_options = array(
113 'with_date_comparison' => true,
114 );
115
116 /**
117 * Availability flag or callback.
118 *
119 * @var bool|callable
120 */
121 private $is_available = true;
122
123 /**
124 * Default layout array or callback.
125 *
126 * @var array|callable
127 */
128 private $default_layout = array();
129
130 /**
131 * Constructor.
132 *
133 * @param string $dashboard_name Dashboard identifier.
134 * @param string $id Section identifier.
135 * @param array $args Optional. Section arguments.
136 */
137 public function __construct( $dashboard_name, $id, $args = array() ) {
138 $this->dashboard_name = $dashboard_name;
139 $this->id = $id;
140 $this->slug = self::derive_slug( $id );
141 $this->label = $id;
142
143 $this->set_props( $args );
144 }
145
146 /**
147 * Derives the URL-facing slug from a namespaced section identifier.
148 *
149 * @param string $id Section identifier, e.g. `analytics/traffic`.
150 * @return string The segment after the namespace, e.g. `traffic`.
151 */
152 private static function derive_slug( $id ) {
153 $separator = strpos( (string) $id, '/' );
154
155 return false === $separator ? (string) $id : substr( $id, $separator + 1 );
156 }
157
158 /**
159 * Returns whether this section should be exposed.
160 *
161 * @return bool
162 */
163 public function is_available() {
164 if ( is_callable( $this->is_available ) ) {
165 return (bool) call_user_func( $this->is_available, $this );
166 }
167
168 return (bool) $this->is_available;
169 }
170
171 /**
172 * Returns the section's default widget layout.
173 *
174 * @return array Array of widget instances.
175 */
176 public function get_default_layout() {
177 $layout = is_callable( $this->default_layout )
178 ? call_user_func( $this->default_layout, $this )
179 : $this->default_layout;
180
181 return is_array( $layout ) ? array_values( $layout ) : array();
182 }
183
184 /**
185 * Returns the public REST representation.
186 *
187 * @return array
188 */
189 public function to_array() {
190 return array(
191 'id' => $this->id,
192 'slug' => $this->slug,
193 'label' => $this->label,
194 'title' => $this->title,
195 'description' => $this->description,
196 'order' => (int) $this->order,
197 'date_filter' => $this->date_filter,
198 'date_filter_options' => $this->date_filter_options,
199 'default_layout' => $this->get_default_layout(),
200 );
201 }
202
203 /**
204 * Hydrates section properties from the args array.
205 *
206 * @param array $args Section arguments.
207 * @return void
208 */
209 private function set_props( $args ) {
210 if ( ! is_array( $args ) ) {
211 return;
212 }
213
214 if ( isset( $args['label'] ) ) {
215 $this->label = (string) $args['label'];
216 }
217
218 // An empty string is a registrant saying "none", not a heading: kept as-is it
219 // would defeat the label fallback and render an `<h2>` with no accessible name.
220 if ( isset( $args['title'] ) ) {
221 $title = (string) $args['title'];
222 $this->title = '' === $title ? null : $title;
223 }
224
225 if ( isset( $args['description'] ) ) {
226 $description = (string) $args['description'];
227 $this->description = '' === $description ? null : $description;
228 }
229
230 if ( isset( $args['order'] ) ) {
231 $this->order = (int) $args['order'];
232 }
233
234 // An unrecognized surface keeps the default rather than reaching the
235 // dashboard, where the frontend has no filter to render for it.
236 if ( isset( $args['date_filter'] ) && in_array( $args['date_filter'], self::DATE_FILTERS, true ) ) {
237 $this->date_filter = (string) $args['date_filter'];
238 }
239
240 // Merged over the defaults so a partial array keeps the rest, and narrowed
241 // to the known options, which is all the dashboard renders.
242 if ( isset( $args['date_filter_options'] ) && is_array( $args['date_filter_options'] ) ) {
243 $options = array_merge( $this->date_filter_options, $args['date_filter_options'] );
244
245 $this->date_filter_options = array(
246 'with_date_comparison' => (bool) $options['with_date_comparison'],
247 );
248 }
249
250 if ( array_key_exists( 'is_available', $args ) ) {
251 $this->is_available = $args['is_available'];
252 }
253
254 if ( array_key_exists( 'default_layout', $args ) ) {
255 $this->default_layout = $args['default_layout'];
256 }
257 }
258 }
259