From 5a27a6bf37d3ffa6f4072db57e04c71fe315dd05 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 14:01:15 +0000 Subject: [PATCH 1/7] feat: update meta type --- inc/class-post-type.php | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/inc/class-post-type.php b/inc/class-post-type.php index 080d3b97..b1c00605 100644 --- a/inc/class-post-type.php +++ b/inc/class-post-type.php @@ -24,9 +24,42 @@ public function register_meta(): void { 'release-note', 'version', [ - 'show_in_rest' => true, + 'show_in_rest' => [ + 'schema' => [ + 'type' => 'object', + 'properties' => [ + 'major' => [ + 'type' => 'integer', + 'default' => 0, + ], + 'minor' => [ + 'type' => 'integer', + 'default' => 0, + ], + 'patch' => [ + 'type' => 'integer', + 'default' => 0, + ], + 'prerelease' => [ + 'type' => 'string', + 'default' => '', + ], + 'prerelease_version' => [ + 'type' => 'integer', + 'default' => 0, + ], + ], + ], + ], 'single' => true, - 'type' => 'string', + 'type' => 'object', + 'default' => [ + 'major' => 0, + 'minor' => 0, + 'patch' => 0, + 'prerelease' => '', + 'prerelease_version' => 0, + ], ] ); register_post_meta( From 5b9aa2fa44538b4ce2eb22db6ac0edc4c4248da3 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 14:02:09 +0000 Subject: [PATCH 2/7] feat: add new version input --- src/dashboard/styles/styles.scss | 4 + .../register-plugins/CustomBlockFields.js | 87 ++++++++++++++++--- 2 files changed, 78 insertions(+), 13 deletions(-) diff --git a/src/dashboard/styles/styles.scss b/src/dashboard/styles/styles.scss index 68a652f4..cd1b2f5b 100644 --- a/src/dashboard/styles/styles.scss +++ b/src/dashboard/styles/styles.scss @@ -135,3 +135,7 @@ li.release-note.is-pre-release > a { background: #ca4a1f !important; } } + +.components-base-control:has(div > .release-notes__prerelease) { + flex: none; +} diff --git a/src/editor/register-plugins/CustomBlockFields.js b/src/editor/register-plugins/CustomBlockFields.js index 68c119c8..e9ea9b15 100644 --- a/src/editor/register-plugins/CustomBlockFields.js +++ b/src/editor/register-plugins/CustomBlockFields.js @@ -3,9 +3,12 @@ const { PanelRow, DatePicker, ToggleControl, + SelectControl, __experimentalInputControl: InputControl, + __experimentalNumberControl: NumberControl, __experimentalText: Text, __experimentalVStack: VStack, + __experimentalHStack: HStack, } = wp.components; const { useEntityProp } = wp.coreData; const { useSelect } = wp.data; @@ -27,11 +30,65 @@ function CustomBlockFields() { <> - setMeta({ ...meta, version: val })} - label={__('Version Number')} - /> + {/** If the version is a string, it's a legacy version, so we show a single input */} + {typeof version === 'string' ? ( + setMeta({ ...meta, version: val })} + label={__('Version Number')} + /> + ) : ( + + setMeta({ ...meta, version: { ...version, major: val } })} + spinControls="none" + /> + . + setMeta({ ...meta, version: { ...version, minor: val } })} + spinControls="none" + /> + . + setMeta({ ...meta, version: { ...version, patch: val } })} + spinControls="none" + /> + setMeta({ ...meta, version: { ...version, prerelease: val } })} + /> + {version.prerelease && ( + <> + . + + setMeta({ ...meta, version: { ...version, prereleaseVersion: val } }) + } + spinControls="none" + /> + + )} + + )}
@@ -43,14 +100,18 @@ function CustomBlockFields() { /> -
- - setMeta({ ...meta, is_pre_release: val })} - /> - + {typeof version === 'string' && ( + <> +
+ + setMeta({ ...meta, is_pre_release: val })} + /> + + + )}
); From a29854f504c6c58cdc9defe9343d0e878e9c3a65 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 14:05:18 +0000 Subject: [PATCH 3/7] feat: update admin bar --- inc/class-admin-bar.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/inc/class-admin-bar.php b/inc/class-admin-bar.php index 1e93ac6c..373232e8 100644 --- a/inc/class-admin-bar.php +++ b/inc/class-admin-bar.php @@ -31,9 +31,24 @@ public function register_link( \WP_Admin_Bar $wp_admin_bar ): void { $is_pre_release = get_post_meta( $latest_release->ID, 'is_pre_release', true ); - $version = get_post_meta( $latest_release->ID, 'version', true ); + $version_meta = get_post_meta( $latest_release->ID, 'version', true ); $base_url = admin_url( 'admin.php?page=release-notes' ); + $version = '0.0.0'; + + if ( gettype( $version_meta ) !== 'array' ) { + $version = $version_meta; + } else { + $version = sprintf( + '%d.%d.%d%s%s', + $version_meta['major'], + $version_meta['minor'], + $version_meta['patch'], + $version_meta['prerelease'], + $version_meta['prerelease'] !== '' ? '.' . $version_meta['prerelease_version'] : '' + ); + } + $wp_admin_bar->add_node( [ 'id' => 'release-note-version', 'title' => sprintf( 'Version %s', $version ), From 33c9c7d130cf70f04dc3debc0beab903b6295165 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 15:45:04 +0000 Subject: [PATCH 4/7] feat: create version_object meta --- inc/class-admin-bar.php | 33 +++--- inc/class-post-type.php | 16 ++- inc/views/release-notes-item.php | 27 ++++- inc/views/release-notes-widget.php | 28 ++++- .../register-plugins/CustomBlockFields.js | 110 +++++++++--------- 5 files changed, 136 insertions(+), 78 deletions(-) diff --git a/inc/class-admin-bar.php b/inc/class-admin-bar.php index 373232e8..333f45f5 100644 --- a/inc/class-admin-bar.php +++ b/inc/class-admin-bar.php @@ -29,29 +29,32 @@ public function register_link( \WP_Admin_Bar $wp_admin_bar ): void { $last_week = strtotime( '-1 week' ); $release_date = strtotime( $latest_release->post_date_gmt ); - $is_pre_release = get_post_meta( $latest_release->ID, 'is_pre_release', true ); + $version = get_post_meta( $latest_release->ID, 'version', true ); + $version_object = get_post_meta( $latest_release->ID, 'version_object', true ); + $base_url = admin_url( 'admin.php?page=release-notes' ); - $version_meta = get_post_meta( $latest_release->ID, 'version', true ); - $base_url = admin_url( 'admin.php?page=release-notes' ); + $version_string = '0.0.0'; + $is_pre_release = false; - $version = '0.0.0'; - - if ( gettype( $version_meta ) !== 'array' ) { - $version = $version_meta; - } else { - $version = sprintf( + if ( ! empty( $version ) ) { + $version_string = $version; + $is_pre_release = get_post_meta( get_the_ID(), 'is_pre_release', true ); + } elseif ( ! empty( $version_object ) ) { + $version_string = sprintf( '%d.%d.%d%s%s', - $version_meta['major'], - $version_meta['minor'], - $version_meta['patch'], - $version_meta['prerelease'], - $version_meta['prerelease'] !== '' ? '.' . $version_meta['prerelease_version'] : '' + $version_object['major'], + $version_object['minor'], + $version_object['patch'], + $version_object['prerelease'], + $version_object['prerelease'] !== '' ? '.' . $version_object['prerelease_version'] : '' ); + + $is_pre_release = $version_object['prerelease'] !== ''; } $wp_admin_bar->add_node( [ 'id' => 'release-note-version', - 'title' => sprintf( 'Version %s', $version ), + 'title' => sprintf( 'Version %s', $version_string ), 'href' => sprintf( '%s&release-id=%d', $base_url, $latest_release->ID ), 'parent' => 'top-secondary', 'meta' => [ diff --git a/inc/class-post-type.php b/inc/class-post-type.php index b1c00605..65bc4da4 100644 --- a/inc/class-post-type.php +++ b/inc/class-post-type.php @@ -22,7 +22,7 @@ public function __construct() { public function register_meta(): void { register_post_meta( 'release-note', - 'version', + 'version_object', [ 'show_in_rest' => [ 'schema' => [ @@ -62,6 +62,20 @@ public function register_meta(): void { ], ] ); + + /** + * Deprecated: This is for backwards compatibility with the old version meta + */ + register_post_meta( + 'release-note', + 'version', + [ + 'show_in_rest' => true, + 'single' => true, + 'type' => 'string', + ], + ); + register_post_meta( 'release-note', 'release_date', diff --git a/inc/views/release-notes-item.php b/inc/views/release-notes-item.php index 080e8c13..e7e2fd4e 100644 --- a/inc/views/release-notes-item.php +++ b/inc/views/release-notes-item.php @@ -1,7 +1,26 @@
@@ -19,11 +38,11 @@
+ ">
diff --git a/inc/views/release-notes-widget.php b/inc/views/release-notes-widget.php index 48e677b7..a8c16fb4 100644 --- a/inc/views/release-notes-widget.php +++ b/inc/views/release-notes-widget.php @@ -1,6 +1,26 @@
@@ -18,11 +38,11 @@
+ ">
diff --git a/src/editor/register-plugins/CustomBlockFields.js b/src/editor/register-plugins/CustomBlockFields.js index e9ea9b15..b26765a2 100644 --- a/src/editor/register-plugins/CustomBlockFields.js +++ b/src/editor/register-plugins/CustomBlockFields.js @@ -20,7 +20,7 @@ function CustomBlockFields() { if (postType !== 'release-note') return null; const [meta, setMeta] = useEntityProp('postType', postType, 'meta'); - const { version, is_pre_release: isPrerelease, release_date: releaseDate } = meta; + const { version, version_object, is_pre_release: isPrerelease, release_date: releaseDate } = meta; const onDateChange = (val) => { setMeta({ ...meta, release_date: val }); @@ -30,64 +30,66 @@ function CustomBlockFields() { <> - {/** If the version is a string, it's a legacy version, so we show a single input */} - {typeof version === 'string' ? ( + {/** If the version input is still available render a string */} + {version !== '' ? ( setMeta({ ...meta, version: val })} label={__('Version Number')} /> ) : ( - - setMeta({ ...meta, version: { ...version, major: val } })} - spinControls="none" - /> - . - setMeta({ ...meta, version: { ...version, minor: val } })} - spinControls="none" - /> - . - setMeta({ ...meta, version: { ...version, patch: val } })} - spinControls="none" - /> - setMeta({ ...meta, version: { ...version, prerelease: val } })} - /> - {version.prerelease && ( - <> - . - - setMeta({ ...meta, version: { ...version, prereleaseVersion: val } }) - } - spinControls="none" - /> - - )} - + <> + + setMeta({ ...meta, version_object: { ...version_object, major: val } })} + spinControls="none" + /> + . + setMeta({ ...meta, version_object: { ...version_object, minor: val } })} + spinControls="none" + /> + . + setMeta({ ...meta, version_object: { ...version_object, patch: val } })} + spinControls="none" + /> + setMeta({ ...meta, version_object: { ...version_object, prerelease: val } })} + /> + {version_object.prerelease && ( + <> + . + + setMeta({ ...meta, version_object: { ...version_object, prerelease_version: val } }) + } + spinControls="none" + /> + + )} + + )}
@@ -100,7 +102,7 @@ function CustomBlockFields() { /> - {typeof version === 'string' && ( + {version !== '' && ( <>
From 4304f37a4ae01f2fd1a75201e895209aecd1e380 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 16:12:06 +0000 Subject: [PATCH 5/7] feat: remove new meta, store version as string --- inc/class-admin-bar.php | 24 +-- inc/class-post-type.php | 57 +------ inc/views/release-notes-item.php | 30 +--- inc/views/release-notes-widget.php | 24 +-- .../register-plugins/CustomBlockFields.js | 158 ++++++++++-------- 5 files changed, 102 insertions(+), 191 deletions(-) diff --git a/inc/class-admin-bar.php b/inc/class-admin-bar.php index 333f45f5..7a86ec18 100644 --- a/inc/class-admin-bar.php +++ b/inc/class-admin-bar.php @@ -30,35 +30,15 @@ public function register_link( \WP_Admin_Bar $wp_admin_bar ): void { $release_date = strtotime( $latest_release->post_date_gmt ); $version = get_post_meta( $latest_release->ID, 'version', true ); - $version_object = get_post_meta( $latest_release->ID, 'version_object', true ); $base_url = admin_url( 'admin.php?page=release-notes' ); - $version_string = '0.0.0'; - $is_pre_release = false; - - if ( ! empty( $version ) ) { - $version_string = $version; - $is_pre_release = get_post_meta( get_the_ID(), 'is_pre_release', true ); - } elseif ( ! empty( $version_object ) ) { - $version_string = sprintf( - '%d.%d.%d%s%s', - $version_object['major'], - $version_object['minor'], - $version_object['patch'], - $version_object['prerelease'], - $version_object['prerelease'] !== '' ? '.' . $version_object['prerelease_version'] : '' - ); - - $is_pre_release = $version_object['prerelease'] !== ''; - } - $wp_admin_bar->add_node( [ 'id' => 'release-note-version', - 'title' => sprintf( 'Version %s', $version_string ), + 'title' => sprintf( 'Version %s', $version ), 'href' => sprintf( '%s&release-id=%d', $base_url, $latest_release->ID ), 'parent' => 'top-secondary', 'meta' => [ - 'class' => $is_pre_release ? 'release-note is-pre-release' : 'release-note', + 'class' => str_contains( $version, '-') ? 'release-note is-pre-release' : 'release-note', ], ] ); diff --git a/inc/class-post-type.php b/inc/class-post-type.php index 65bc4da4..10c8ac13 100644 --- a/inc/class-post-type.php +++ b/inc/class-post-type.php @@ -22,55 +22,14 @@ public function __construct() { public function register_meta(): void { register_post_meta( 'release-note', - 'version_object', + 'version', [ 'show_in_rest' => [ 'schema' => [ - 'type' => 'object', - 'properties' => [ - 'major' => [ - 'type' => 'integer', - 'default' => 0, - ], - 'minor' => [ - 'type' => 'integer', - 'default' => 0, - ], - 'patch' => [ - 'type' => 'integer', - 'default' => 0, - ], - 'prerelease' => [ - 'type' => 'string', - 'default' => '', - ], - 'prerelease_version' => [ - 'type' => 'integer', - 'default' => 0, - ], - ], + 'type' => 'string', + 'default' => '0.0.0', ], - ], - 'single' => true, - 'type' => 'object', - 'default' => [ - 'major' => 0, - 'minor' => 0, - 'patch' => 0, - 'prerelease' => '', - 'prerelease_version' => 0, ], - ] - ); - - /** - * Deprecated: This is for backwards compatibility with the old version meta - */ - register_post_meta( - 'release-note', - 'version', - [ - 'show_in_rest' => true, 'single' => true, 'type' => 'string', ], @@ -85,16 +44,6 @@ public function register_meta(): void { 'type' => 'string', ] ); - register_post_meta( - 'release-note', - 'is_pre_release', - [ - 'show_in_rest' => true, - 'single' => true, - 'type' => 'boolean', - 'default' => false, - ] - ); } /** diff --git a/inc/views/release-notes-item.php b/inc/views/release-notes-item.php index e7e2fd4e..2062579f 100644 --- a/inc/views/release-notes-item.php +++ b/inc/views/release-notes-item.php @@ -1,29 +1,9 @@ -
+

@@ -38,11 +18,11 @@
+ ">
diff --git a/inc/views/release-notes-widget.php b/inc/views/release-notes-widget.php index a8c16fb4..3e8c429f 100644 --- a/inc/views/release-notes-widget.php +++ b/inc/views/release-notes-widget.php @@ -1,26 +1,6 @@
@@ -38,11 +18,11 @@
+ ">
diff --git a/src/editor/register-plugins/CustomBlockFields.js b/src/editor/register-plugins/CustomBlockFields.js index b26765a2..942036fa 100644 --- a/src/editor/register-plugins/CustomBlockFields.js +++ b/src/editor/register-plugins/CustomBlockFields.js @@ -4,7 +4,6 @@ const { DatePicker, ToggleControl, SelectControl, - __experimentalInputControl: InputControl, __experimentalNumberControl: NumberControl, __experimentalText: Text, __experimentalVStack: VStack, @@ -13,6 +12,7 @@ const { const { useEntityProp } = wp.coreData; const { useSelect } = wp.data; const { __ } = wp.i18n; +const { useState, useEffect } = wp.element; /** Adds the date selector to the post settings */ function CustomBlockFields() { @@ -20,77 +20,111 @@ function CustomBlockFields() { if (postType !== 'release-note') return null; const [meta, setMeta] = useEntityProp('postType', postType, 'meta'); - const { version, version_object, is_pre_release: isPrerelease, release_date: releaseDate } = meta; + const { version, release_date: releaseDate } = meta; + + const [versionObject, setVersionObject] = useState({}); + + /** + * Splits the version string into an object + */ + const splitVersion = () => { + const prerelease = version.split('-'); + const versionArray = prerelease[0].split('.'); + const prereleaseVersion = prerelease[1] ? prerelease[1].split('.')[1] : ''; + const prereleaseType = prerelease[1] ? prerelease[1].split('.')[0] : ''; + + setVersionObject({ + major: versionArray[0], + minor: versionArray[1], + patch: versionArray[2], + prerelease: prereleaseType, + prerelease_version: prereleaseVersion, + }); + } + + /** + * Updates the version object + * + * @param {integer || string} val value + * @param {string} key key + */ + const onVersionChange = (val, key) => { + const tempVersionObject = { ...versionObject }; + tempVersionObject[key] = val; + + let versionString = `${tempVersionObject.major}.${tempVersionObject.minor}.${tempVersionObject.patch}`; + + if (tempVersionObject.prerelease) { + versionString += `-${tempVersionObject.prerelease}`; + if (tempVersionObject.prerelease_version) { + versionString += `.${tempVersionObject.prerelease_version}`; + } + } + + setVersionObject(tempVersionObject); + setMeta({ ...meta, version: versionString }); + }; const onDateChange = (val) => { setMeta({ ...meta, release_date: val }); }; + useEffect( () => { + splitVersion(); + }, []); + return ( <> - {/** If the version input is still available render a string */} - {version !== '' ? ( - setMeta({ ...meta, version: val })} - label={__('Version Number')} + + onVersionChange(val, 'major')} + spinControls="none" /> - ) : ( - <> - - setMeta({ ...meta, version_object: { ...version_object, major: val } })} - spinControls="none" - /> - . - setMeta({ ...meta, version_object: { ...version_object, minor: val } })} - spinControls="none" - /> + . + onVersionChange(val, 'minor')} + spinControls="none" + /> + . + onVersionChange(val, 'patch')} + spinControls="none" + /> + onVersionChange(val, 'prerelease')} + /> + {versionObject.prerelease && ( + <> . setMeta({ ...meta, version_object: { ...version_object, patch: val } })} + value={versionObject.prerelease_version} + onChange={(val) => onVersionChange(val, 'prerelease_version')} spinControls="none" /> - setMeta({ ...meta, version_object: { ...version_object, prerelease: val } })} - /> - {version_object.prerelease && ( - <> - . - - setMeta({ ...meta, version_object: { ...version_object, prerelease_version: val } }) - } - spinControls="none" - /> - - )} - - - )} + + )} +
@@ -102,18 +136,6 @@ function CustomBlockFields() { /> - {version !== '' && ( - <> -
- - setMeta({ ...meta, is_pre_release: val })} - /> - - - )}
); From efc1b1fe9deed0769c273a0b0e1b541011616273 Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 16:14:53 +0000 Subject: [PATCH 6/7] feat: remove is_pre_release meta --- inc/class-release-publish.php | 6 ++++-- inc/class-rest-endpoints.php | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/inc/class-release-publish.php b/inc/class-release-publish.php index 0bba3f38..b4442144 100644 --- a/inc/class-release-publish.php +++ b/inc/class-release-publish.php @@ -374,12 +374,14 @@ public function test_scheduled_event( $id ) { $content_arr = explode( "\n", $content ); + $version = get_post_meta( $id, 'version', true ); + $header_title = [ [ 'type' => 'header', 'text' => [ 'type' => 'plain_text', - 'text' => get_post_meta( $id, 'is_pre_release', true ) ? __( 'New Pre-Release 🎉', 'release-notes' ) : __( 'New Release 🎉', 'release-notes' ), + 'text' => str_contains( $version, '-' ) ? __( 'New Pre-Release 🎉', 'release-notes' ) : __( 'New Release 🎉', 'release-notes' ), ], ], ]; @@ -392,7 +394,7 @@ public function test_scheduled_event( $id ) { 'text' => sprintf( /* translators: %s: The version number. */ __( 'Version: %s', 'release-notes' ), - get_post_meta( $id, 'version', true ) + $version, ), ], ], diff --git a/inc/class-rest-endpoints.php b/inc/class-rest-endpoints.php index 8bda8fb5..fbd004dd 100644 --- a/inc/class-rest-endpoints.php +++ b/inc/class-rest-endpoints.php @@ -48,7 +48,6 @@ public function new_release( \WP_REST_Request $req ) { $title = $params['name']; $published_at = $params['publishedAt']; $tag = $params['tagName']; - $is_pre_release = $params['isPrerelease']; if ( $is_draft ) { return; @@ -76,7 +75,6 @@ public function new_release( \WP_REST_Request $req ) { 'meta_input' => [ 'release_date' => explode( 'T', gmdate( 'c', strtotime( $published_at ) ) )[0], 'version' => $tag, - 'is_pre_release' => $is_pre_release, ], ]); } From 59c499f284ec31127e567bf69e8ee7bde2f320bd Mon Sep 17 00:00:00 2001 From: Harry Cooper Date: Mon, 3 Feb 2025 17:13:19 +0000 Subject: [PATCH 7/7] chore: lint --- src/editor/register-plugins/CustomBlockFields.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/editor/register-plugins/CustomBlockFields.js b/src/editor/register-plugins/CustomBlockFields.js index 942036fa..2a6c40df 100644 --- a/src/editor/register-plugins/CustomBlockFields.js +++ b/src/editor/register-plugins/CustomBlockFields.js @@ -2,7 +2,6 @@ const { PluginDocumentSettingPanel } = wp.editPost; const { PanelRow, DatePicker, - ToggleControl, SelectControl, __experimentalNumberControl: NumberControl, __experimentalText: Text, @@ -40,7 +39,7 @@ function CustomBlockFields() { prerelease: prereleaseType, prerelease_version: prereleaseVersion, }); - } + }; /** * Updates the version object @@ -69,7 +68,7 @@ function CustomBlockFields() { setMeta({ ...meta, release_date: val }); }; - useEffect( () => { + useEffect(() => { splitVersion(); }, []);