PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.6
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.6
1.1.10 1.1.9 1.1.8 1.1.7 1.1.6 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.1 1.0.0 0.9.8 0.9.7 0.9.6 0.9.4 0.9.5 0.9.3 0.9.2 0.9.1 0.9.0 0.8.9 0.8.8 0.8.7 All 34 releases
desktop-mode / includes / my-wordpress / window.php

window.php in OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin 1.1.6, at includes/my-wordpress/window.php

217 lines 9.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * OpenStation — My WordPress: the explorer's identity + shared helpers.
4 *
5 * The app people open is `apps/my-wordpress/` — WP Explorer, rebuilt
6 * on the App Framework. This module keeps what the port shares: the
7 * name and the folder-mark icon (the app reads both from the helpers
8 * here), the capability gate, and the inert entities compatibility
9 * surface (see the note at the end of the file).
10 *
11 * **The app is called WP Explorer; the module is called my-wordpress.**
12 * The function prefix and every `openstation_my_wordpress_*` filter
13 * are names plugins already reference — the frozen-values rule in
14 * AGENTS.md keeps them put.
15 *
16 * Filterable surface:
17 *
18 * - `openstation_my_wordpress_user_can_use`
19 * - `openstation_my_wordpress_entities` (inert — see the end note)
20 *
21 * (`openstation_my_wordpress_icon_args`, `_window_args` and
22 * `_template_html` went with the legacy window they configured.)
23 *
24 * @package OpenStation
25 */
26
27 defined( 'ABSPATH' ) || exit;
28
29 /**
30 * Display name of the app, for the window title and the pinned icon.
31 *
32 * A file explorer, named after what it explores. The window used to
33 * carry the site title instead, on the reasoning that the desktop holds
34 * objects rather than a mention of the software you are already standing
35 * in — but a site title is what the *root folder* is called, not what
36 * the app is called, and the breadcrumb still says it. The two are no
37 * longer the same string.
38 *
39 * @return string
40 */
41 function openstation_my_wordpress_app_title() {
42 return __( 'WP Explorer', 'desktop-mode' );
43 }
44
45 /**
46 * The app's icon: a folder wearing the WordPress mark.
47 *
48 * The window used to wear `dashicons-wordpress`, the double-ringed
49 * wp.org mark, which said "WordPress" and nothing about what the app
50 * does — every other window here is WordPress too. A folder says
51 * "browse", and the single-ringed mark inside it says whose files.
52 *
53 * Drawn in `currentColor` so both painters mask it: the dock masks
54 * image icons to the rail's own glyph colour so a plugin's brand
55 * colours cannot break the monochrome rail, and `renderIcon()` masks it
56 * to the title bar's text colour. A literal fill would silently turn it
57 * back into a background image in one and a solid blob in the other.
58 *
59 * The folder is outlined rather than filled so the mark inside it stays
60 * a mark: on a filled folder, a same-colour mark is invisible. Hand-
61 * placed at 64×64, the established canvas for the custom icons here,
62 * and held to two shapes because it renders as small as 20px in the
63 * dock. The mark's own path is the upstream single-ringed logo, a
64 * filled disc with the W knocked out by the nonzero fill rule.
65 *
66 * On the sizing: the front panel runs `y 19.1 → 52.1` on the
67 * centreline, so at stroke 3 the clear height inside it is 30 units.
68 * The mark takes 20 of those at scale 1, centred on 35.6, which leaves
69 * five units above and below. It used to be scaled 1.15× for 23 units
70 * and barely three units of clearance, less than one stroke width, and
71 * a disc that close to the panel edge reads as crammed in rather than
72 * placed. Horizontal clearance was never the constraint: the panel is
73 * 50 units wide against the mark's 20.
74 *
75 * @return string Raw `<svg>` markup.
76 */
77 function openstation_my_wordpress_icon_svg() {
78 return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">'
79 // The folder: back tab, notch, front panel, all one outline.
80 . '<path d="M11 13h12.2a3 3 0 0 1 2.4 1.2l2.8 3.7a3 3 0 0 0 2.4 1.2H53a4 4 0 0 1 4 4v25a4 4 0 0 1-4 4H11a4 4 0 0 1-4-4V17a4 4 0 0 1 4-4z"'
81 . ' fill="none" stroke="currentColor" stroke-width="3" stroke-linejoin="round"/>'
82 // The WordPress mark, centred on the front panel at r=10.
83 . '<g transform="translate(22 25.6) scale(1)">'
84 . '<path fill="currentColor" d="M20 10c0-5.51-4.49-10-10-10C4.48 0 0 4.49 0 10c0 5.52 4.48 10 10 10 5.51 0 10-4.48 10-10zM7.78 15.37L4.37 6.22c.55-.02 1.17-.08 1.17-.08.5-.06.44-1.13-.06-1.11 0 0-1.45.11-2.37.11-.18 0-.37 0-.58-.01C4.12 2.69 6.87 1.11 10 1.11c2.33 0 4.45.87 6.05 2.34-.68-.11-1.65.39-1.65 1.58 0 .74.45 1.36.9 2.1.35.61.55 1.36.55 2.46 0 1.49-1.4 5-1.4 5l-3.03-8.37c.54-.02.82-.17.82-.17.5-.05.44-1.25-.06-1.22 0 0-1.44.12-2.38.12-.87 0-2.33-.12-2.33-.12-.5-.03-.56 1.2-.06 1.22l.92.08 1.26 3.41zM17.41 10c.24-.64.74-1.87.43-4.25.7 1.29 1.05 2.71 1.05 4.25 0 3.29-1.73 6.24-4.4 7.78.97-2.59 1.94-5.2 2.92-7.78zM6.1 18.09C3.12 16.65 1.11 13.53 1.11 10c0-1.3.23-2.48.72-3.59C3.25 10.3 4.67 14.2 6.1 18.09zm4.03-6.63l2.58 6.98c-.86.29-1.76.45-2.71.45-.79 0-1.57-.11-2.29-.33.81-2.38 1.62-4.74 2.42-7.1z"/>'
85 . '</g>'
86 . '</svg>';
87 }
88
89 /**
90 * Whether the current user should see My WordPress.
91 *
92 * Mirrors the recycle-bin gate — anyone who can edit posts can
93 * browse posts and pages.
94 *
95 * @return bool
96 */
97 function openstation_my_wordpress_user_can_use() {
98 $can = current_user_can( 'edit_posts' );
99
100 /**
101 * Filter whether the current user can see the My WordPress
102 * pinned icon and window.
103 *
104 * @param bool $can Default: edit_posts capability.
105 */
106 return (bool) apply_filters( 'openstation_my_wordpress_user_can_use', $can );
107 }
108
109 /**
110 * Build the entity list shipped to the bundle. Posts, Pages,
111 * Users, and Media. Future phases add
112 * Comments, Tags, Categories, Themes, and Plugins.
113 *
114 * The optional `kind` field tells the bundle how to render entries
115 * of this entity: `'post'` (default) renders the standard
116 * title/excerpt/featured-image tile and the rendered-HTML preview;
117 * `'user'` renders an avatar + display-name tile and routes to the
118 * user dossier preview; `'media'` renders a thumbnail-grid tile and
119 * routes to the media preview pane. Plugins extending the entity
120 * list with a post-shaped collection can omit the field; user- and
121 * media-shaped collections must set `'user'` / `'media'`.
122 * The optional `post_type` field specifies the WP post-type
123 * slug used for `os.<slug>.changed` cross-window broadcasts.
124 *
125 * @return array[] Each entry is `array( 'id', 'label', 'icon',
126 * 'restPath', 'kind', 'post_type' )`. `restPath` is appended to
127 * the `restRoot` config to derive the list URL.
128 */
129 function openstation_my_wordpress_entities() {
130 $entities = array(
131 array(
132 'id' => 'posts',
133 'label' => __( 'Posts', 'desktop-mode' ),
134 'icon' => 'dashicons-admin-post',
135 'restPath' => 'wp/v2/posts',
136 'kind' => 'post',
137 'post_type' => 'post',
138 ),
139 array(
140 'id' => 'pages',
141 'label' => __( 'Pages', 'desktop-mode' ),
142 'icon' => 'dashicons-admin-page',
143 'restPath' => 'wp/v2/pages',
144 'kind' => 'post',
145 'post_type' => 'page',
146 ),
147 array(
148 'id' => 'users',
149 'label' => __( 'Users', 'desktop-mode' ),
150 'icon' => 'dashicons-admin-users',
151 'restPath' => 'wp/v2/users',
152 'kind' => 'user',
153 ),
154 array(
155 'id' => 'media',
156 'label' => __( 'Media', 'desktop-mode' ),
157 'icon' => 'dashicons-admin-media',
158 'restPath' => 'wp/v2/media',
159 'kind' => 'media',
160 'post_type' => 'attachment',
161 ),
162 );
163
164 /**
165 * Filter the list of entity types shown inside the My WordPress
166 * window. Each entry must declare `id`, `label`, `icon`, and
167 * `restPath`. Returning a reordered or extended array shows up
168 * in the bundle on the next render.
169 *
170 * **Status: Experimental** — the entity descriptor shape may
171 * gain fields as new entity kinds land (Comments, Tags,
172 * Categories, Themes, Plugins). Stable id/label/icon/restPath
173 * fields will continue to work; new optional fields will not
174 * break existing consumers. The `kind` field is optional and
175 * defaults to `'post'` for back-compat.
176 *
177 * Optional fields:
178 * - `kind` — render strategy (`'post'` default, `'user'`, `'media'`).
179 * - `post_type` — WP post-type slug for cross-window broadcast topic `os.<slug>.changed`.
180 * - `thumbnails` — set false to keep the section icon on every tile
181 * instead of the entity's featured image.
182 * - `editAction` — who edits this section's rows. A preview-action id
183 * (see `openstation_my_wordpress_preview_actions`)
184 * replaces "Open in editor" everywhere — pane button,
185 * context-menu open entry, tile double-click. `false`
186 * removes every edit affordance (double-click falls
187 * back to the detail dossier; the bulk "Edit…" modal
188 * is suppressed). Omit for the classic editor.
189 * - `group` — folder id this section nests under at the root
190 * (null / omitted renders it loose at the root).
191 * - `groupLabel` — folder label. `groupIcon`, `groupOrder` follow.
192 *
193 * @param array[] $entities Default entities.
194 */
195 $filtered = apply_filters( 'openstation_my_wordpress_entities', $entities );
196 return is_array( $filtered ) ? array_values( $filtered ) : $entities;
197 }
198
199 /*
200 * No window, no template, no launcher. The explorer people open is
201 * the `my-wordpress` APP (`apps/my-wordpress/`), which reclaimed the
202 * "WP Explorer" name and the folder mark from this module's helpers
203 * above. The legacy native window, its bundle and its pinned icon are
204 * gone; every deep surface it used to host moved with the port — the
205 * detail dossiers and the activity footprint render inside the app,
206 * "open this object" travels through the shared stores in
207 * `src/open-targets/explorer-open.ts` / `footprint-target.ts`, and
208 * the Recycle Bin trashes dropped rows by their payload's `restPath`.
209 *
210 * `openstation_my_wordpress_entities()` and its filter remain as an
211 * inert compatibility surface: subscribers registered against them
212 * (WooCommerce's own among them) still run, and the pure helpers are
213 * still what the tests pin — but nothing consumes the list to build a
214 * window any more. The `openstation_my_wordpress_window_args` /
215 * `openstation_my_wordpress_template_html` filters no longer fire.
216 */
217