PluginProbe
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin / 1.1.10
OpenStation: Desktop Windows, Dock & Virtual Desktops for WP Admin v1.1.10
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
← All changes | includes/os-settings.php +135 -4 1.1.31.1.10 View file →
@@ -52,8 +52,28 @@
52 52 */
53 53 const OPENSTATION_OS_SETTINGS_DOCK_PLACEMENTS = array( 'bottom', 'left', 'right' );
54 54
55 55 /**
56 + * Valid dock-behavior IDs — mirrors the TS `DOCK_BEHAVIORS` constant.
57 + *
58 + * `static` keeps the dock always on screen (the default); `dynamic`
59 + * parks it off its edge behind a peek strip that reveals when the
60 + * pointer reaches that edge or something on it takes keyboard focus,
61 + * and releases the band it floats over from the work area.
62 + */
63 +const OPENSTATION_OS_SETTINGS_DOCK_BEHAVIORS = array( 'static', 'dynamic' );
64 +
65 +/**
66 + * `mobileLayout` — which experience the shell renders. `auto`
67 + * follows the viewport; the other two force it either way.
68 + * Mirrors `OsModePreference` in `src/mode/index.ts`.
69 + */
70 +const OPENSTATION_OS_SETTINGS_MOBILE_LAYOUTS = array( 'auto', 'desktop', 'mobile' );
71 +
72 +/** `mobileTabs` — at most this many ids pinned to the phone tab bar. */
73 +const OPENSTATION_OS_SETTINGS_MOBILE_TABS_MAX = 3;
74 +
75 +/**
56 76 * Playable range for the window-reveal duration override, in ms.
57 77 * Mirrors `MIN_REVEAL_DURATION_MS` / `MAX_REVEAL_DURATION_MS` in
58 78 * `src/reveals/registry.ts`.
59 79 *
@@ -73,8 +93,10 @@
73 93 */
74 94 function openstation_default_os_settings() {
75 95 return array(
76 96 'wallpaper' => 'galaxy',
97 + // Pulse, the brand's signature. Mirrors `DEFAULTS` in
98 + // `src/settings/constants.ts`.
77 99 'accent' => 'pulse',
78 100 // Only read when `accent` is `custom`. Seeded with Pulse so
79 101 // picking Custom before touching the wheel is a no-op rather
80 102 // than a jump to black. Mirrors `DEFAULTS` in
@@ -95,8 +117,14 @@
95 117 // dock, and the dock's "Exit OpenStation" tile is the way back
96 118 // to classic admin. `static` (vanilla behavior) and `dynamic`
97 119 // are one pick away in OpenStation Preferences → Appearance.
98 120 'adminBarMode' => 'hidden',
121 + // Always on screen. `dynamic` (auto-hide behind a peek strip)
122 + // is one pick away in OpenStation Preferences → Appearance.
123 + 'dockBehavior' => 'static',
124 + // The Split layout's sidebar answers for itself: a folded
125 + // sidebar over a static bottom dock is a valid desk.
126 + 'sideDockBehavior' => 'static',
99 127 // One dock holding every menu, with the system tiles grouped
100 128 // behind a hairline. `classic` (side bar for core menus + bottom
101 129 // dock for plugins) is the other option; it is no longer what a
102 130 // first-run desktop looks like.
@@ -184,8 +212,13 @@
184 212 // window (e.g. array( 'author', 'tags' )). Empty array means
185 213 // every column is visible. The sticky 'title' column is always
186 214 // shown — the UI prevents toggling it.
187 215 'nativePostsHiddenColumns' => array(),
216 + // Per-user list of column keys hidden in the native Pages
217 + // window (e.g. array( 'author', 'parent' )). Empty array means
218 + // every column is visible. The sticky 'title' column is always
219 + // shown — the UI prevents toggling it.
220 + 'nativePagesHiddenColumns' => array(),
188 221 // Per-user opt-IN for the native Pages window. Same posture as
189 222 // nativePostsEnabled — defaults OFF (Beta), users opt in to swap
190 223 // the classic `edit.php?post_type=page` iframe for the native UI.
191 224 'nativePagesEnabled' => false,
@@ -208,8 +241,11 @@
208 241 // (including any custom dashboard a plugin builds there) opens
209 242 // as a chromeless iframe until the user opts in via OS
210 243 // Settings → Features → Beta features.
211 244 'stationHomeEnabled' => false,
245 + // Performance enhancements are enabled unless explicitly disabled.
246 + 'adminAssetCacheEnabled' => true,
247 + 'windowPrewarmEnabled' => true,
212 248 // When true, left-clicking the empty wallpaper triggers the
213 249 // "Show desktop" toggle (macOS-style) and the matching entry is
214 250 // hidden from the wallpaper context menu. When false (default),
215 251 // the entry stays in the menu and left clicks on the wallpaper
@@ -214,13 +250,20 @@
214 250 // hidden from the wallpaper context menu. When false (default),
215 251 // the entry stays in the menu and left clicks on the wallpaper
216 252 // do nothing. Per-user.
217 253 'showDesktopOnWallpaperClick' => false,
254 + // Whether the close-all-windows shortcut (Alt+Cmd/Ctrl+W) asks
255 + // before it closes. The dialog's "Don't ask again" checkbox is
256 + // what writes false; OpenStation Preferences -> Windows is what
257 + // turns it back on. Per-user.
258 + 'confirmCloseAllWindows' => true,
218 259 // Mio — a soft-body companion that floats over
219 260 // the wallpaper, settles onto nearby windows, and watches the
220 261 // pointer. Off by default; toggled from the wallpaper context
221 262 // menu. Per-user. See `docs/mio.md`.
222 263 'mioEnabled' => false,
264 + 'mioApiEnabled' => false,
265 + 'mioShowOnWallpaper' => true,
223 266 // The user's own Mio, as built in "Make it yours": partial
224 267 // appearance + silhouette overrides, both empty until they
225 268 // touch a control. Stored per user rather than per browser
226 269 // because it is a preference about the person — ten minutes
@@ -271,8 +314,14 @@
271 314 // Per-user ordering, flat across every dock/sidebar zone. Ids
272 315 // not in the list keep their registration order and render
273 316 // after the listed ones. Unknown ids are tolerated.
274 317 'navOrder' => array(),
318 + // Which experience the shell renders: 'auto' follows the
319 + // viewport, 'desktop' / 'mobile' force it. See `includes/mobile.php`.
320 + 'mobileLayout' => 'auto',
321 + // Ids pinned to the phone tab bar, at most three. Empty means
322 + // the server default (`openstation_mobile_tab_bar`).
323 + 'mobileTabs' => array(),
275 324 // Persisted desktop position for every item the user has
276 325 // promoted to the wallpaper via `navPlacement[id]=desktop|both`.
277 326 // Keyed by item id, value is `{ x: int, y: int }`. The JS
278 327 // synthesizer reads this when building a synthetic placement so
@@ -293,14 +342,14 @@
293 342 */
294 343 function openstation_get_os_settings( $user_id ) {
295 344 $user_id = (int) $user_id;
296 345 if ( $user_id <= 0 ) {
297 - return openstation_default_os_settings();
346 + return openstation_sanitize_os_settings( array() );
298 347 }
299 348
300 349 $raw = get_user_meta( $user_id, OPENSTATION_OS_SETTINGS_META_KEY, true );
301 350 if ( ! is_array( $raw ) ) {
302 - return openstation_default_os_settings();
351 + return openstation_sanitize_os_settings( array() );
303 352 }
304 353
305 354 return openstation_sanitize_os_settings( $raw );
306 355 }
@@ -403,9 +452,9 @@
403 452 function openstation_sanitize_os_settings( $raw ) {
404 453 $defaults = openstation_default_os_settings();
405 454
406 455 if ( ! is_array( $raw ) ) {
407 - return $defaults;
456 + $raw = array();
408 457 }
409 458
410 459 // Wallpaper — any non-empty string; registry membership is validated
411 460 // client-side at apply time.
@@ -443,8 +492,19 @@
443 492 && in_array( $raw['adminBarMode'], OPENSTATION_OS_SETTINGS_ADMIN_BAR_MODES, true )
444 493 ? (string) $raw['adminBarMode']
445 494 : $defaults['adminBarMode'];
446 495
496 + // Dock behavior — must be one of the two known values. One answer
497 + // per rail: the dock, and the Split layout's sidebar.
498 + $dock_behavior = isset( $raw['dockBehavior'] )
499 + && in_array( $raw['dockBehavior'], OPENSTATION_OS_SETTINGS_DOCK_BEHAVIORS, true )
500 + ? (string) $raw['dockBehavior']
501 + : $defaults['dockBehavior'];
502 + $side_dock_behavior = isset( $raw['sideDockBehavior'] )
503 + && in_array( $raw['sideDockBehavior'], OPENSTATION_OS_SETTINGS_DOCK_BEHAVIORS, true )
504 + ? (string) $raw['sideDockBehavior']
505 + : $defaults['sideDockBehavior'];
506 +
447 507 // Desktop layout — must be one of the known values (`classic`,
448 508 // `unified`). Default `unified`.
449 509 $desktop_layout = isset( $raw['desktopLayout'] )
450 510 && in_array( $raw['desktopLayout'], OPENSTATION_OS_SETTINGS_DESKTOP_LAYOUTS, true )
@@ -725,8 +785,27 @@
725 785 // user meta indefinitely.
726 786 $native_posts_hidden_columns = array_slice( array_values( array_unique( $native_posts_hidden_columns ) ), 0, 32 );
727 787 }
728 788
789 + $native_pages_hidden_columns = $defaults['nativePagesHiddenColumns'];
790 + if ( isset( $raw['nativePagesHiddenColumns'] ) && is_array( $raw['nativePagesHiddenColumns'] ) ) {
791 + $native_pages_hidden_columns = array();
792 + foreach ( $raw['nativePagesHiddenColumns'] as $col ) {
793 + if ( ! is_string( $col ) || '' === $col ) {
794 + continue;
795 + }
796 + $slug = sanitize_key( $col );
797 + if ( '' === $slug ) {
798 + continue;
799 + }
800 + $native_pages_hidden_columns[] = $slug;
801 + }
802 + // Cap to a sane upper bound — far more than any plausible
803 + // column count, but blocks a malicious payload from bloating
804 + // user meta indefinitely.
805 + $native_pages_hidden_columns = array_slice( array_values( array_unique( $native_pages_hidden_columns ) ), 0, 32 );
806 + }
807 +
729 808 $native_pages_enabled = isset( $raw['nativePagesEnabled'] )
730 809 ? (bool) $raw['nativePagesEnabled']
731 810 : $defaults['nativePagesEnabled'];
732 811
@@ -745,15 +824,25 @@
745 824 $station_home_enabled = isset( $raw['stationHomeEnabled'] )
746 825 ? (bool) $raw['stationHomeEnabled']
747 826 : $defaults['stationHomeEnabled'];
748 827
828 + // Site-wide performance controls supersede the legacy per-user values.
829 + // Keep the snapshot keys so existing window consumers can read them.
830 + $extended_options = openstation_get_extended_options();
831 + $admin_asset_cache_enabled = $extended_options['admin_asset_cache'];
832 + $window_prewarm_enabled = $extended_options['window_prewarm'];
833 +
749 834 $show_desktop_on_wallpaper_click = isset( $raw['showDesktopOnWallpaperClick'] )
750 835 ? (bool) $raw['showDesktopOnWallpaperClick']
751 836 : $defaults['showDesktopOnWallpaperClick'];
752 837
838 + $confirm_close_all_windows = isset( $raw['confirmCloseAllWindows'] )
839 + ? (bool) $raw['confirmCloseAllWindows']
840 + : $defaults['confirmCloseAllWindows'];
841 +
753 842 $mio_enabled = isset( $raw['mioEnabled'] )
754 843 ? (bool) $raw['mioEnabled']
755 - : $defaults['mioEnabled'];
844 + : ( isset( $raw['mioApiEnabled'] ) ? (bool) $raw['mioApiEnabled'] : $defaults['mioEnabled'] );
756 845
757 846 // A missing key means "no look saved yet", which sanitizes to the
758 847 // same pair of empty arrays the defaults carry — so this needs no
759 848 // isset() branch of its own.
@@ -768,8 +857,35 @@
768 857 $developer_mode_enabled = isset( $raw['developerModeEnabled'] )
769 858 ? (bool) $raw['developerModeEnabled']
770 859 : $defaults['developerModeEnabled'];
771 860
861 + // mobileLayout — the phone/desktop override.
862 + $mobile_layout = isset( $raw['mobileLayout'] )
863 + && in_array( $raw['mobileLayout'], OPENSTATION_OS_SETTINGS_MOBILE_LAYOUTS, true )
864 + ? (string) $raw['mobileLayout']
865 + : $defaults['mobileLayout'];
866 +
867 + // mobileTabs — ordered nav ids pinned to the phone tab bar. Same
868 + // id grammar as navOrder, capped at the tab bar's slot count.
869 + $mobile_tabs = array();
870 + if ( isset( $raw['mobileTabs'] ) && is_array( $raw['mobileTabs'] ) ) {
871 + $seen_tabs = array();
872 + foreach ( $raw['mobileTabs'] as $id ) {
873 + if ( ! is_string( $id ) || '' === $id ) {
874 + continue;
875 + }
876 + $slug = sanitize_key( openstation_canonical_nav_id( $id ) );
877 + if ( '' === $slug || isset( $seen_tabs[ $slug ] ) ) {
878 + continue;
879 + }
880 + $seen_tabs[ $slug ] = true;
881 + $mobile_tabs[] = $slug;
882 + if ( count( $mobile_tabs ) >= OPENSTATION_OS_SETTINGS_MOBILE_TABS_MAX ) {
883 + break;
884 + }
885 + }
886 + }
887 +
772 888 $folders_sharing_enabled = isset( $raw['foldersSharingEnabled'] )
773 889 ? (bool) $raw['foldersSharingEnabled']
774 890 : $defaults['foldersSharingEnabled'];
775 891
@@ -890,8 +1006,10 @@
890 1006 'windowRadius' => $window_radius,
891 1007 'adminBarMode' => $admin_bar_mode,
892 1008 'desktopLayout' => $desktop_layout,
893 1009 'dockPlacement' => $dock_placement,
1010 + 'dockBehavior' => $dock_behavior,
1011 + 'sideDockBehavior' => $side_dock_behavior,
894 1012 'dockRailRenderer' => $dock_rail_renderer,
895 1013 'desktopTheme' => $desktop_theme,
896 1014 'appliedThemeRecommendations' => $applied_theme_recommendations,
897 1015 'unfocusEffect' => $unfocus_effect,
@@ -910,14 +1028,20 @@
910 1028 'heartbeatRate' => $heartbeat_rate,
911 1029 'nativePostsEnabled' => $native_posts_enabled,
912 1030 'nativePostsHiddenColumns' => $native_posts_hidden_columns,
913 1031 'nativePagesEnabled' => $native_pages_enabled,
1032 + 'nativePagesHiddenColumns' => $native_pages_hidden_columns,
914 1033 'nativeUsersEnabled' => $native_users_enabled,
915 1034 'nativePluginsEnabled' => $native_plugins_enabled,
916 1035 'nativeCommentsEnabled' => $native_comments_enabled,
917 1036 'stationHomeEnabled' => $station_home_enabled,
1037 + 'adminAssetCacheEnabled' => $admin_asset_cache_enabled,
1038 + 'windowPrewarmEnabled' => $window_prewarm_enabled,
918 1039 'showDesktopOnWallpaperClick' => $show_desktop_on_wallpaper_click,
1040 + 'confirmCloseAllWindows' => $confirm_close_all_windows,
919 1041 'mioEnabled' => $mio_enabled,
1042 + 'mioApiEnabled' => $mio_enabled,
1043 + 'mioShowOnWallpaper' => isset( $raw['mioShowOnWallpaper'] ) ? (bool) $raw['mioShowOnWallpaper'] : $defaults['mioShowOnWallpaper'],
920 1044 'mioStyle' => $mio_style,
921 1045 'showPostStatusRibbons' => $show_post_status_ribbons,
922 1046 'developerModeEnabled' => $developer_mode_enabled,
923 1047 'foldersSharingEnabled' => $folders_sharing_enabled,
@@ -922,8 +1046,10 @@
922 1046 'developerModeEnabled' => $developer_mode_enabled,
923 1047 'foldersSharingEnabled' => $folders_sharing_enabled,
924 1048 'navPlacement' => $nav_placement,
925 1049 'navOrder' => $nav_order,
1050 + 'mobileLayout' => $mobile_layout,
1051 + 'mobileTabs' => $mobile_tabs,
926 1052 'dockPromotedPositions' => $dock_promoted_positions,
927 1053 );
928 1054 }
929 1055
@@ -1023,8 +1149,13 @@
1023 1149 // true of every path into this handler, not just the ones the
1024 1150 // schema happens to guard.
1025 1151 if ( ! is_array( $payload ) ) {
1026 1152 return rest_ensure_response( openstation_get_os_settings( $user_id ) );
1153 + }
1154 +
1155 + // Normalize an alias-only patch before merging it with the saved master value.
1156 + if ( ! array_key_exists( 'mioEnabled', $payload ) && array_key_exists( 'mioApiEnabled', $payload ) ) {
1157 + $payload['mioEnabled'] = $payload['mioApiEnabled'];
1027 1158 }
1028 1159
1029 1160 openstation_save_os_settings(
1030 1161 $user_id,