Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PCH Excerpt Suggestions: Add persona and tone settings #2890

Merged
merged 13 commits into from
Oct 25, 2024

Conversation

acicovic
Copy link
Collaborator

@acicovic acicovic commented Oct 25, 2024

Description

This PR adds Persona and Tone settings to our Excerpt Suggestions feature, in a similar manner to what already exists in our Title Suggestions feature.

This PR supersedes #2776 as the latter it got broken at some point.

Motivation and context

How has this been tested?

  • Manually tested, and updated an integration test.

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced the "Excerpt Suggestions" feature, which allows users to receive suggestions for content excerpts.
    • Added settings for managing "Excerpt Suggestions," including options for tone and persona.
    • Implemented permission management for the "Excerpt Suggestions" feature.
  • Enhancements

    • Updated the Editor Sidebar to support the new "Excerpt Suggestions" functionality.
    • Improved styling for the excerpt suggestions settings interface.
  • Bug Fixes

    • Resolved issues related to the initialization and rendering of the new settings.
  • Deprecations

    • Removed the previous "Excerpt Generator" functionality in favor of the new "Excerpt Suggestions" approach.
  • Documentation

    • Updated API endpoints to include new settings for "Excerpt Suggestions."

Copy link
Contributor

coderabbitai bot commented Oct 25, 2024

📝 Walkthrough
📝 Walkthrough

Walkthrough

The changes in this pull request primarily focus on introducing and enhancing the "Excerpt Suggestions" feature within the Parsely Content Helper. Key modifications include replacing the existing Excerpt_Generator class with the new Excerpt_Suggestions class, which integrates user-configurable settings for persona and tone. The changes extend to various components, including permissions management, REST API endpoints, and UI elements, ensuring the feature is fully functional and customizable. Additionally, several related tests and configurations have been updated to reflect these changes.

Changes

File Change Summary
src/UI/class-settings-page.php Updated filter in add_settings_field from Excerpt_Generator::get_feature_filter_name() to Excerpt_Suggestions::get_feature_filter_name().
src/class-permissions.php Added functionality for "ExcerptSuggestions" in permissions checks and settings array.
src/content-helper/common/css/common.scss Added new CSS class .wp-parsely-dropdown-label.
src/content-helper/common/settings/types/index.ts Introduced ExcerptSuggestionsSettings type for sidebar settings.
src/content-helper/common/settings/types/sidebar-settings.d.ts Added ExcerptSuggestionsSettings interface and updated SidebarSettings to include it.
src/content-helper/common/utils/permissions.ts Added ExcerptSuggestions property to ContentHelperPermissions interface.
src/content-helper/editor-sidebar/class-editor-sidebar-feature.php Introduced new abstract class Editor_Sidebar_Feature with methods for feature management.
src/content-helper/editor-sidebar/class-editor-sidebar.php Changed $features property type to array<Editor_Sidebar_Feature> and updated constructor.
src/content-helper/editor-sidebar/editor-sidebar.tsx Updated SidebarSettings to include ExcerptSuggestions and imported initExcerptSuggestions.
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php Added Excerpt_Suggestions class for managing excerpt suggestions.
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel-settings.tsx Introduced ExcerptSuggestionsSettings component for managing settings.
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx Renamed PostExcerptGenerator to PostExcerptSuggestions and updated logic.
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.scss Updated styles for the excerpt suggestions feature.
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.tsx Renamed ExcerptGenerator to ExcerptSuggestions and added permission checks.
src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts Renamed ExcerptGeneratorProvider to ExcerptSuggestionsProvider and updated method signatures.
src/content-helper/editor-sidebar/smart-linking/class-smart-linking.php Updated inheritance to extend Editor_Sidebar_Feature and added new method for feature identification.
src/content-helper/editor-sidebar/title-suggestions/title-suggestions.scss Removed several CSS rules related to title suggestions.
src/content-helper/excerpt-generator/class-excerpt-generator.php Deleted the Excerpt_Generator class.
src/rest-api/settings/class-endpoint-editor-sidebar-settings.php Updated get_subvalues_specs to include ExcerptSuggestions.
src/rest-api/settings/class-endpoint-excerpt-suggestions-settings.php Introduced Endpoint_Excerpt_Suggestions_Settings class for managing API settings.
tests/Integration/ContentHelper/ContentHelperExcerptSuggestionsTest.php Deleted integration tests for the Excerpt_Generator.
tests/Integration/ContentHelper/ContentHelperFeatureTest.php Updated references from Excerpt_Generator to Excerpt_Suggestions.
tests/Integration/RestAPI/Settings/EndpointEditorSidebarSettingsTest.php Restructured returned array in get_default_value method to include ExcerptSuggestions.
webpack.config.js Removed entry for 'content-helper/excerpt-generator' and added rule for TypeScript files.
wp-parsely.php Updated class import from Excerpt_Generator to Excerpt_Suggestions and removed related function.

Assessment against linked issues

Objective Addressed Explanation
Allow customization of persona and style for Excerpt Suggestions (#2692)

Possibly related PRs

Suggested labels

Changelog: Changed

Suggested reviewers

  • acicovic

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@acicovic acicovic marked this pull request as ready for review October 25, 2024 12:25
@acicovic acicovic requested a review from a team as a code owner October 25, 2024 12:26
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 18

🧹 Outside diff range and nitpick comments (20)
src/content-helper/common/settings/types/index.ts (1)

5-5: LGTM! Consider enhancing JSDoc documentation.

The addition of ExcerptSuggestionsSettings type is well-structured and maintains consistency with other settings types.

Consider adding detailed JSDoc documentation with @since tags for the new type:

/**
 * Import the settings types.
+ *
+ * @since x.x.x ExcerptSuggestionsSettings type for configuring excerpt generation settings.
 */

Also applies to: 18-18

src/rest-api/settings/class-endpoint-excerpt-suggestions-settings.php (1)

13-20: Consider enhancing class documentation.

While the documentation is good, it would be helpful to add more context about the specific settings being managed (persona and tone) and their purpose.

 /**
  * Endpoint for saving and retrieving Content Helper Excerpt Suggestions
  * settings.
+ *
+ * Manages settings for excerpt suggestions including:
+ * - Persona settings (e.g., journalist)
+ * - Tone settings (e.g., neutral)
+ * These settings allow customization of how excerpts are generated.
  *
  * @since 3.17.0
  *
  * @phpstan-import-type Subvalue_Spec from Base_Settings_Endpoint
  */
src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts (2)

Line range hint 18-37: Consider using class name instead of this in static context.

While the singleton pattern implementation is correct, using this in static context can be confusing. Consider using the class name explicitly for better clarity.

 public static getInstance(): ExcerptSuggestionsProvider {
-    if ( ! this.instance ) {
-      this.instance = new ExcerptSuggestionsProvider();
+    if ( ! ExcerptSuggestionsProvider.instance ) {
+      ExcerptSuggestionsProvider.instance = new ExcerptSuggestionsProvider();
     }

-    return this.instance;
+    return ExcerptSuggestionsProvider.instance;
 }
🧰 Tools
🪛 Biome

[error] 32-32: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 33-33: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 36-36: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


49-51: Consider aligning parameter name with API query parameter.

The tone parameter is renamed to style in the API call. Consider using consistent naming throughout to avoid confusion.

 public async generateExcerpt(
-    title: string, content: string, persona: string, tone: string
+    title: string, content: string, persona: string, style: string
 ): Promise<string>
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel-settings.tsx (1)

19-34: Enhance JSDoc documentation for better clarity.

While the JSDoc is present and follows WordPress standards, consider adding:

  • @typedef tag to properly document the type definition
  • Description for each property in the type

Here's an improved version:

 /**
  * Props for the Excerpt Suggestions Settings component.
  *
+ * @typedef {Object} ExcerptSuggestionsSettingsProps
+ * @property {boolean} [isLoading] - Whether the component is in a loading state.
+ * @property {function} onPersonaChange - Handler for persona selection changes.
+ * @property {function} onSettingChange - Handler for general setting changes.
+ * @property {function} onToneChange - Handler for tone selection changes.
+ * @property {PersonaProp} persona - The currently selected persona.
+ * @property {ToneProp} tone - The currently selected tone.
  *
  * @since 3.17.0
  */
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.scss (1)

Line range hint 76-89: Convert button height to rem units

The review controls section is well-structured, but needs one adjustment for consistency:

Apply this change:

   button {
     flex-grow: 1;
-    height: to_rem(40px);
+    height: to_rem(40px);
     justify-content: center;
     margin-bottom: var(--grid-unit-10);
     margin-top: var(--grid-unit-10);
     padding: var(--grid-unit-10) var(--grid-unit-15);
   }
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.tsx (2)

20-27: Update JSDoc to match WordPress coding standards.

The JSDoc comment should include a more descriptive @SInCE tag indicating the next version of the plugin.

 /**
  * The ExcerptSuggestions function registers the custom excerpt panel and removes
  * the default excerpt panel.
  *
- * @since 3.13.0
+ * @since 3.14.0 Introduced as part of the Excerpt Suggestions feature with persona and tone settings.
  *
  * @param {never}  settings Settings from the plugins.registerPlugin filter. Not used.
  * @param {string} name     The plugin name.
  */

Line range hint 58-64: Address TypeScript warnings and deprecated code handling.

The code uses @ts-ignore and handles deprecated functionality, but could be improved.

- /* Remove the excerpt panel by dispatching an action. */ // @ts-ignore
- if ( dispatch( 'core/editor' )?.removeEditorPanel ) { // @ts-ignore
+ const editor = dispatch( 'core/editor' ) as {
+   removeEditorPanel?: (panel: string) => void;
+ };
+ if ( editor?.removeEditorPanel ) {
-    dispatch( 'core/editor' )?.removeEditorPanel( 'post-excerpt' );
+    editor.removeEditorPanel( 'post-excerpt' );
 } else {
     // Deprecated in WordPress 6.5.
     dispatchCoreEditPost?.removeEditorPanel( 'post-excerpt' );
 }
src/content-helper/editor-sidebar/class-editor-sidebar-feature.php (3)

17-22: Enhance class documentation for better developer guidance.

Consider adding documentation about:

  • The abstract nature of the class
  • Requirements for extending this class
  • Example usage or reference to implementing classes
 /**
  * Base class for all Editor Sidebar features.
  *
+ * This is an abstract base class that must be extended by all Editor Sidebar features.
+ * Implementing classes must override the get_feature_name() method and may override
+ * other methods as needed.
+ *
+ * @see \Parsely\Content_Helper\Editor_Sidebar\Excerpt_Suggestions for an example implementation
  *
  * @since 3.17.0
  */

23-30: Add return value format documentation.

Consider documenting the expected format and constraints for the feature name string.

 /**
  * Returns the feature's name.
  *
+ * The feature name should be a lowercase string with words separated by underscores.
+ * This value is used for permissions checking and feature identification.
+ *
+ * @example 'excerpt_suggestions'
  *
  * @since 3.17.0
  *
  * @return string
  */

65-103: Consider making empty methods optional for child classes.

Instead of requiring all child classes to inherit these empty methods, consider:

  1. Moving them to a separate trait
  2. Making them optional through interface segregation

This would allow child classes to opt-in to these methods only when needed, following the Interface Segregation Principle.

Example approach:

interface EditorSidebarScriptable {
    public static function get_script_id(): string;
    public static function get_style_id(): string;
}

trait EditorSidebarFilterable {
    public static function get_feature_filter_name(): string {
        return '';
    }
}
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (2)

33-44: Consider enhancing deprecation documentation.

While the deprecation is properly handled, consider adding @deprecated tag in the PHPDoc to make it more visible to developers.

 /**
  * Returns the feature's filter name.
  *
  * This is deprecated in favor of the new wp_parsely_current_user_can_use_pch_feature filter.
  *
  * @since 3.17.0
+ * @deprecated 3.17.0 Use wp_parsely_current_user_can_use_pch_feature filter instead.
  *
  * @return string The filter name.
  */

67-98: Enhance parameter documentation in callback method.

Consider adding more detailed descriptions for the parameters to improve code maintainability.

 /**
  * Checks and disables the feature if it is disabled via the global or feature filters.
  *
  * This throws a deprecated notice if the feature filter name is in use.
  *
  * @since 3.17.0
  *
- * @param ?bool  $current_user_can_use_pch_feature Whether the current user can use the feature.
- * @param string $feature_name The feature's name.
+ * @param ?bool  $current_user_can_use_pch_feature The current permission state. Null if not yet determined.
+ * @param string $feature_name Name of the feature being checked. Used to filter relevant callbacks.
  * @return ?bool  Returns false if the feature is disabled via filters.
  */
src/content-helper/editor-sidebar/class-editor-sidebar.php (1)

13-13: Architecture looks good.

The changes maintain a clean architecture by:

  1. Properly importing the new feature class
  2. Maintaining the existing feature registration pattern
  3. Following WordPress coding standards

Consider documenting the feature replacement in the class-level PHPDoc to help future maintainers understand the transition from Excerpt_Generator to Excerpt_Suggestions.

Also applies to: 52-53

wp-parsely.php (1)

Function removal needs cleanup

The git history shows that init_content_helper_excerpt_generator function and its associated hook were present but have been removed. However, the cleanup needs attention as:

  • The function is still imported via use Parsely\Content_Helper\Excerpt_Suggestions; in wp-parsely.php
  • The class is still being used in the codebase (Editor_Sidebar, Settings_Page, etc.)
  • The removed hook add_action( 'enqueue_block_editor_assets', __NAMESPACE__ . '\\init_content_helper_excerpt_generator', 9 ); might need to be replaced with proper initialization in the new architecture
🔗 Analysis chain

Line range hint 1-256: Verify cleanup of removed function references.

The AI summary indicates that the init_content_helper_excerpt_generator function was removed. Let's verify that all related hooks and references have been properly cleaned up.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining references to the removed function and its hook

# Test 1: Search for any remaining references to the removed function
echo "Searching for references to init_content_helper_excerpt_generator..."
rg "init_content_helper_excerpt_generator"

# Test 2: Search for any remaining add_action hooks that might reference it
echo "Searching for related action hooks..."
rg "add_action.*excerpt_generator"

Length of output: 311


Script:

#!/bin/bash
# Let's do a more comprehensive check for any excerpt-related functionality

# Check for any references to excerpt suggestions or generators in PHP files
echo "Searching for excerpt-related functionality..."
rg -t php "excerpt.*suggestions?" -B2 -A2

# Check for any removed functions in git history
echo "Checking git history for removed excerpt functions..."
git log -p | rg "init_content_helper_excerpt"

# Check for any remaining excerpt-related hooks
echo "Checking for excerpt-related hooks..."
rg "add_action.*excerpt"

# Check for any Excerpt_Suggestions class usage
echo "Checking for Excerpt_Suggestions class usage..."
rg "Excerpt_Suggestions"

Length of output: 17471

src/content-helper/editor-sidebar/editor-sidebar.tsx (1)

96-100: Add JSDoc comments for the new settings.

As per WordPress coding standards, please add JSDoc comments describing the ExcerptSuggestions settings and their properties. Include @SInCE tags indicating the next version.

Example:

/**
 * Settings for the Excerpt Suggestions feature.
 *
 * @since x.x.0
 */
ExcerptSuggestions: {
    /** @since x.x.0 Whether the Excerpt Suggestions panel is open. */
    Open: false,
    /** @since x.x.0 The writing persona to use for suggestions. */
    Persona: 'journalist',
    /** @since x.x.0 The writing tone to use for suggestions. */
    Tone: 'neutral',
},
tests/Integration/RestAPI/Settings/EndpointEditorSidebarSettingsTest.php (1)

Line range hint 63-94: LGTM! Consider using constants for default values.

The new ExcerptSuggestions settings structure is well-organized and consistent with the existing TitleSuggestions implementation. The alphabetical sorting of keys improves readability.

Consider extracting the default values for persona and tone into class constants to maintain consistency across the codebase and make updates easier. Example:

private const DEFAULT_PERSONA = 'journalist';
private const DEFAULT_TONE = 'neutral';

Then use these constants in the return array:

'ExcerptSuggestions' => array(
    'Open'    => false,
    'Persona' => self::DEFAULT_PERSONA,
    'Tone'    => self::DEFAULT_TONE,
),
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (3)

Line range hint 151-164: Update the @since tag and parameter descriptions in generateExcerpt.

The generateExcerpt function's JSDoc comment has an @since tag of 3.13.0, but you've added new parameters persona and tone. Update the @since tag to the new version and include descriptions for the new parameters.

Apply this diff to update the @since tag and add parameter descriptions:

 /**
  * Generates an excerpt using Parse.ly AI.
+ *
+ * @since 3.17.0
+ *
+ * @param {string}      postTitle   The title of the post.
+ * @param {string}      postContent The content of the post.
+ * @param {PersonaProp} persona     The selected persona for the excerpt.
+ * @param {ToneProp}    tone        The selected tone for the excerpt.
  */
 const generateExcerpt = async () => {

Line range hint 183-195: Add parameter descriptions and update @since tag in acceptGeneratedExcerpt.

The acceptGeneratedExcerpt function has been modified. Update its JSDoc comment to reflect the changes and ensure it includes the correct @since tag.

Include parameter descriptions and update the @since tag:

 /**
  * Accepts the generated excerpt and updates the post.
+ *
+ * @since 3.17.0
  */
 const acceptGeneratedExcerpt = async () => {

Line range hint 198-207: Update @since tag in discardGeneratedExcerpt.

The discardGeneratedExcerpt function's JSDoc comment still shows @since 3.13.0. Since you've updated this function, please update the @since tag.

Apply this diff:

 /**
  * Discards the generated excerpt.
+ *
+ * @since 3.17.0
  */
 const discardGeneratedExcerpt = async () => {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between bf22e90 and 490bb40.

⛔ Files ignored due to path filters (8)
  • build/content-helper/editor-sidebar-rtl.css is excluded by !build/**
  • build/content-helper/editor-sidebar.asset.php is excluded by !build/**
  • build/content-helper/editor-sidebar.css is excluded by !build/**
  • build/content-helper/editor-sidebar.js is excluded by !build/**
  • build/content-helper/excerpt-generator-rtl.css is excluded by !build/**
  • build/content-helper/excerpt-generator.asset.php is excluded by !build/**
  • build/content-helper/excerpt-generator.css is excluded by !build/**
  • build/content-helper/excerpt-generator.js is excluded by !build/**
📒 Files selected for processing (25)
  • src/UI/class-settings-page.php (2 hunks)
  • src/class-permissions.php (1 hunks)
  • src/content-helper/common/css/common.scss (1 hunks)
  • src/content-helper/common/settings/types/index.ts (2 hunks)
  • src/content-helper/common/settings/types/sidebar-settings.d.ts (2 hunks)
  • src/content-helper/common/utils/permissions.ts (2 hunks)
  • src/content-helper/editor-sidebar/class-editor-sidebar-feature.php (1 hunks)
  • src/content-helper/editor-sidebar/class-editor-sidebar.php (3 hunks)
  • src/content-helper/editor-sidebar/editor-sidebar.tsx (3 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (1 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/component-panel-settings.tsx (1 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (8 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.scss (3 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.tsx (3 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts (3 hunks)
  • src/content-helper/editor-sidebar/smart-linking/class-smart-linking.php (2 hunks)
  • src/content-helper/editor-sidebar/title-suggestions/title-suggestions.scss (0 hunks)
  • src/content-helper/excerpt-generator/class-excerpt-generator.php (0 hunks)
  • src/rest-api/settings/class-endpoint-editor-sidebar-settings.php (4 hunks)
  • src/rest-api/settings/class-endpoint-excerpt-suggestions-settings.php (1 hunks)
  • tests/Integration/ContentHelper/ContentHelperExcerptSuggestionsTest.php (0 hunks)
  • tests/Integration/ContentHelper/ContentHelperFeatureTest.php (14 hunks)
  • tests/Integration/RestAPI/Settings/EndpointEditorSidebarSettingsTest.php (1 hunks)
  • webpack.config.js (0 hunks)
  • wp-parsely.php (1 hunks)
💤 Files with no reviewable changes (4)
  • src/content-helper/editor-sidebar/title-suggestions/title-suggestions.scss
  • src/content-helper/excerpt-generator/class-excerpt-generator.php
  • tests/Integration/ContentHelper/ContentHelperExcerptSuggestionsTest.php
  • webpack.config.js
🧰 Additional context used
📓 Path-based instructions (21)
src/UI/class-settings-page.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/class-permissions.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/common/css/common.scss (1)

Pattern **/*.{css,scss}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the SCSS code to ensure it is well-structured and adheres to best practices.
  • Convert dimensions greater than or equal to 3px to rem units using the to_rem function.
  • Utilize variables for sizes and colors defined in src/content-helper/common/css/variables.scss instead of hardcoding values."
src/content-helper/common/settings/types/index.ts (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/common/settings/types/sidebar-settings.d.ts (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/common/utils/permissions.ts (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/class-editor-sidebar-feature.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/class-editor-sidebar.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/editor-sidebar.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel-settings.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.scss (1)

Pattern **/*.{css,scss}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the SCSS code to ensure it is well-structured and adheres to best practices.
  • Convert dimensions greater than or equal to 3px to rem units using the to_rem function.
  • Utilize variables for sizes and colors defined in src/content-helper/common/css/variables.scss instead of hardcoding values."
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/smart-linking/class-smart-linking.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/rest-api/settings/class-endpoint-editor-sidebar-settings.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/rest-api/settings/class-endpoint-excerpt-suggestions-settings.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
tests/Integration/ContentHelper/ContentHelperFeatureTest.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
tests/Integration/RestAPI/Settings/EndpointEditorSidebarSettingsTest.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
wp-parsely.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
🪛 Biome
src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts

[error] 32-32: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)


[error] 33-33: Using this in a static context can be confusing.

this refers to the class.
Unsafe fix: Use the class name instead.

(lint/complexity/noThisInStatic)

🔇 Additional comments (30)
src/content-helper/common/settings/types/index.ts (1)

5-5: Verify the new type usage across the codebase.

Let's ensure the new type is properly utilized in related components.

Also applies to: 18-18

✅ Verification successful

Type is properly used across the codebase

The ExcerptSuggestionsSettings type is correctly used throughout the codebase:

  • Properly exported from types/index.ts
  • Defined in sidebar-settings.d.ts
  • Correctly imported and used in component files:
    • excerpt-suggestions/component-panel.tsx
    • excerpt-suggestions/component-panel-settings.tsx
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of ExcerptSuggestionsSettings type
# Expected: Find usage in components and tests

# Search for ExcerptSuggestionsSettings type usage
echo "Searching for ExcerptSuggestionsSettings type usage:"
rg "ExcerptSuggestionsSettings" -t ts -t tsx

# Search for potential places where the type should be used
echo -e "\nSearching for potential places where the type should be used:"
rg "excerptSuggestions" -t ts -t tsx

Length of output: 391


Script:

#!/bin/bash
# Let's try without the tsx extension and use a more comprehensive search
echo "Searching for ExcerptSuggestionsSettings type usage:"
rg "ExcerptSuggestionsSettings"

echo -e "\nSearching for potential places where the type should be used:"
rg "excerptSuggestions"

# Let's also check the file where this type is defined
echo -e "\nChecking the type definition file:"
cat src/content-helper/common/settings/types/index.ts

Length of output: 2883

src/content-helper/common/utils/permissions.ts (2)

9-9: LGTM! Property addition follows conventions.

The new ExcerptSuggestions property follows the existing interface's naming and typing conventions.


23-23: Verify default permission is enforced across the codebase.

The default value of false follows the secure-by-default principle. Let's verify this security measure is consistently applied.

✅ Verification successful

Let me check the actual usage of this permission to verify its enforcement.


Let me check one more aspect to verify how the permission is enforced in the PHP side.


Default permission is properly enforced across the codebase

The verification shows that the ExcerptSuggestions permission is properly enforced through multiple layers:

  1. The default value of false is correctly set in permissions.ts
  2. The permission is enforced through PHP-side checks in class-permissions.php via:
    • The current_user_can_use_pch_feature() method which checks multiple conditions
    • The get_pch_permissions_json() method which exposes permissions to the frontend
  3. The frontend component (component-panel.tsx) receives and respects these permissions through the settings provider

The implementation follows secure-by-default principles and has proper permission checks at both backend and frontend layers.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify ExcerptSuggestions permission handling
# Expected: All permission checks should handle the false case appropriately

# Search for ExcerptSuggestions permission checks
rg -l "ExcerptSuggestions"

# Search for any direct permission assignments
ast-grep --pattern 'ExcerptSuggestions = true'

Length of output: 792


Script:

#!/bin/bash
# Check how ExcerptSuggestions permission is used in the codebase
rg -A 5 "ExcerptSuggestions" --type ts --type tsx --type php

# Check for any permission checks or conditionals
ast-grep --pattern 'if ($$$ExcerptSuggestions$$$)'

Length of output: 141


Script:

#!/bin/bash
# Check how ExcerptSuggestions permission is used in the codebase with proper file types
rg -A 5 "ExcerptSuggestions" --type typescript --type php

# Check the implementation in permissions file
cat src/content-helper/common/utils/permissions.ts

# Check the implementation in excerpt suggestions component
cat src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx

Length of output: 12424


Script:

#!/bin/bash
# Check PHP implementation of ExcerptSuggestions permission
cat src/class-permissions.php
cat src/rest-api/settings/class-endpoint-editor-sidebar-settings.php

Length of output: 9084

src/rest-api/settings/class-endpoint-excerpt-suggestions-settings.php (1)

1-11: LGTM! File header follows WordPress coding standards.

The file header is well-structured with proper documentation, strict types declaration, and namespace following PSR-4 standards.

src/content-helper/common/settings/types/sidebar-settings.d.ts (2)

15-15: LGTM! Clean addition to SidebarSettings interface.

The new ExcerptSuggestions property is well-integrated into the existing interface structure.


63-72: LGTM! Well-structured interface definition.

The ExcerptSuggestionsSettings interface:

  • Follows the same pattern as TitleSuggestionsSettings
  • Is properly documented with @SInCE tag
  • Has appropriate properties for persona and tone customization
src/content-helper/editor-sidebar/excerpt-suggestions/provider.ts (2)

16-16: LGTM! Class rename aligns with feature name.

The rename from ExcerptGeneratorProvider to ExcerptSuggestionsProvider better reflects its purpose and maintains consistency with the "Excerpt Suggestions" feature name.

Also applies to: 9-9


58-62: Verify API endpoint compatibility with new parameters.

Ensure that the API endpoint /wp-parsely/v2/content-helper/excerpt-generator/generate supports the new persona and style query parameters.

✅ Verification successful

Let me check the endpoint implementation to verify the parameter support.


Let me try a different approach to find the endpoint registration and implementation.


API endpoint fully supports the new parameters

The endpoint /wp-parsely/v2/content-helper/excerpt-generator/generate explicitly supports both persona and style parameters:

  • persona parameter is optional with default value 'journalist'
  • style parameter is optional with default value 'neutral'

Both parameters are properly registered in the route configuration and handled in the generate_excerpt method of the Endpoint_Excerpt_Generator class.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for the API endpoint definition to verify parameter support
rg -l "excerpt-generator/generate" --type php

Length of output: 183


Script:

#!/bin/bash
# Check the endpoint implementation for parameter support
rg -A 20 "register_rest_route.*excerpt-generator/generate" --type php

# Also check the test file for parameter usage
rg -A 20 "function test.*excerpt.*generate" tests/Integration/RestAPI/ContentHelper/EndpointExcerptGeneratorTest.php

Length of output: 190


Script:

#!/bin/bash
# Check the endpoint class content
cat src/rest-api/content-helper/class-endpoint-excerpt-generator.php

# Check the test file content
cat tests/Integration/RestAPI/ContentHelper/EndpointExcerptGeneratorTest.php

Length of output: 13116

src/content-helper/editor-sidebar/excerpt-suggestions/component-panel-settings.tsx (1)

1-18: LGTM! Imports are well-organized.

The imports are properly structured and follow WordPress coding standards.

src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.scss (1)

1-2: LGTM: Import statements are properly structured

The imports for variables and functions are correctly defined using relative paths.

src/content-helper/common/css/common.scss (1)

48-56: LGTM! The new dropdown label styles follow best practices.

The implementation:

  • Uses CSS variables appropriately for colors and dimensions
  • Follows consistent naming conventions
  • Is well-structured and positioned logically in the file
src/content-helper/editor-sidebar/excerpt-suggestions/excerpt-suggestions.tsx (3)

11-13: LGTM: Import statements are well-organized.

The imports are properly structured with clear separation between WordPress and internal dependencies.


52-55: LGTM: Plugin registration is properly implemented.

The plugin registration uses the correct WordPress API and implements a clean render function.


69-72: LGTM: Initialization function is well-implemented.

The function correctly sets up the filter with appropriate priority and clear naming.

src/content-helper/editor-sidebar/class-editor-sidebar-feature.php (1)

1-16: LGTM: File-level structure and documentation are well-organized.

The file follows WordPress coding standards with proper documentation, namespace declaration, and use statements.

src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (2)

1-14: LGTM: File-level structure and documentation are well-organized.

The file follows WordPress coding standards with proper documentation, namespace declaration, and use statements.


15-20: LGTM: Class documentation is comprehensive.

The documentation properly tracks version history and changes, following WordPress standards.

src/rest-api/settings/class-endpoint-editor-sidebar-settings.php (4)

Line range hint 70-81: LGTM! Key naming standardization.

The removal of spaces from the key name improves consistency while maintaining the same functionality.


Line range hint 98-109: LGTM! Key naming standardization.

The removal of spaces from the key name improves consistency while maintaining the same functionality.


Line range hint 110-122: Verify backward compatibility after key renaming.

The standardization of the key name looks good and maintains structural consistency with the new ExcerptSuggestions feature.

Let's verify the impact of key renaming:

#!/bin/bash
# Search for any remaining usage of the old key format
rg -l "Title Suggestions" --type php --type ts --type js

54-65: Verify the empty values arrays for Persona and Tone settings.

The structure looks good and aligns with the PR objectives. However, the values arrays for Persona and Tone are empty. If these values are meant to be dynamic, please ensure they are populated correctly at runtime.

Let's verify if these values are defined elsewhere:

✅ Verification successful

Empty values arrays for Persona and Tone are intentionally designed

The empty values arrays for Persona and Tone settings are correct. The codebase shows this is a consistent pattern:

  • Both Title and Excerpt suggestions use the same structure with empty values arrays
  • Default values are consistently set to 'journalist' for Persona and 'neutral' for Tone
  • These values are used in the API endpoints (suggest-brief.php and suggest-headline.php)
  • The values are properly validated in the REST API endpoints
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for Persona and Tone values definition
rg -l "(?i)(persona|tone).+(values|options|choices)" --type php

Length of output: 546


Script:

#!/bin/bash
# Let's search for persona and tone related code in the codebase
rg -i "(persona|tone).+(values|options|choices|array)" --type php -A 5 -B 5

Length of output: 8126

src/content-helper/editor-sidebar/class-editor-sidebar.php (1)

36-36: LGTM! Type hint improvement.

The type hint change from array<Content_Helper_Feature> to array<Editor_Sidebar_Feature> provides better type safety by being more specific about the expected feature types in the sidebar.

src/class-permissions.php (1)

157-159: LGTM! Verify feature name consistency across codebase.

The addition of 'ExcerptSuggestions' to the features array is well-structured and maintains consistency with existing features.

Let's verify the feature name consistency across the codebase:

✅ Verification successful

Feature name consistency verified across codebase

The feature name 'ExcerptSuggestions' and its snake_case variant 'excerpt_suggestions' are used consistently throughout the codebase in appropriate contexts:

  • PascalCase 'ExcerptSuggestions' is used for class names, component names, and feature keys
  • snake_case 'excerpt_suggestions' is used for API endpoints, settings keys, and internal identifiers
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for consistent usage of 'ExcerptSuggestions' and 'excerpt_suggestions'
# across the codebase to ensure naming conventions are followed.

echo "Checking for ExcerptSuggestions usage..."
rg --type php --type typescript --type javascript "ExcerptSuggestions"

echo -e "\nChecking for excerpt_suggestions usage..."
rg --type php --type typescript --type javascript "excerpt_suggestions"

Length of output: 402


Script:

#!/bin/bash
# Let's try a different approach using ripgrep without specific file type filters
# and then filter the results in the script

echo "Checking for ExcerptSuggestions usage..."
rg "ExcerptSuggestions" --type-not md --type-not json

echo -e "\nChecking for excerpt_suggestions usage..."
rg "excerpt_suggestions" --type-not md --type-not json

# Also check package.json and composer.json for any relevant entries
echo -e "\nChecking configuration files..."
echo "package.json:"
cat package.json 2>/dev/null | grep -i "excerpt"
echo -e "\ncomposer.json:"
cat composer.json 2>/dev/null | grep -i "excerpt"

Length of output: 77089

wp-parsely.php (1)

31-31: LGTM! Import statement is correctly placed.

The new import for Excerpt_Suggestions is properly added and follows the alphabetical ordering convention.

src/content-helper/editor-sidebar/editor-sidebar.tsx (1)

34-34: LGTM: Import statement follows conventions.

The import statement follows TypeScript/React conventions and WordPress coding standards.

tests/Integration/RestAPI/Settings/EndpointEditorSidebarSettingsTest.php (1)

Line range hint 1-24: LGTM! Well-structured test class with comprehensive documentation.

The test class follows WordPress coding standards and provides thorough test coverage for the new excerpt suggestions feature. The documentation is clear and complete.

tests/Integration/ContentHelper/ContentHelperFeatureTest.php (1)

157-162: LGTM! Test coverage properly updated for the new implementation.

The changes consistently update all @covers annotations to reference the new Excerpt_Suggestions class instead of the old Excerpt_Generator class. This aligns well with the PR's objective of enhancing the Excerpt Suggestions feature and ensures proper test coverage for the new implementation.

Also applies to: 213-218, 269-274, 313-318, 358-363, 414-419, 458-463, 502-507, 558-563, 609-614, 653-658, 697-702, 754-759, 798-803

src/UI/class-settings-page.php (2)

13-13: LGTM: Import statement added for new Excerpt_Suggestions class.

The import aligns with the PR's objective of replacing the Excerpt_Generator with Excerpt_Suggestions.


499-499: LGTM: Updated filter name to use Excerpt_Suggestions class.

The code correctly updates the filter name to use the new Excerpt_Suggestions class, maintaining consistency with the class replacement.

src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

68-72: ⚠️ Potential issue

Ensure default values are set for persona and tone.

When initializing persona and tone state variables from settings.ExcerptSuggestions, make sure that default values are provided to prevent potential undefined values, which could lead to runtime errors.

Please verify that settings.ExcerptSuggestions.Persona and settings.ExcerptSuggestions.Tone have default values. If not, consider setting default values during initialization:

 const [ persona, setPersona ] = useState<PersonaProp>( settings.ExcerptSuggestions.Persona || 'defaultPersona' );
 const [ tone, setTone ] = useState<ToneProp>( settings.ExcerptSuggestions.Tone || 'defaultTone' );

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (3)
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (2)

1-8: Update file-level documentation to match the feature name.

The file-level documentation refers to "Excerpt Generator" but the feature has been renamed to "Excerpt Suggestions" as mentioned in the class documentation.

Apply this diff to maintain consistency:

 /**
- * Content Helper: Excerpt Generator feature class
+ * Content Helper: Excerpt Suggestions feature class
  *
  * @package Parsely
  * @since   3.13.0
  */

103-107: Update PHPDoc to reflect the actual implementation.

The PHPDoc suggests this method inserts inline scripts, but the actual implementation is intentionally empty as script handling is managed by the parent class.

Apply this diff to clarify the documentation:

 /**
- * Inserts Content Helper Excerpt Generator inline scripts.
+ * Implementation of the abstract run() method from the parent class.
+ * Script handling is managed by the Editor_Sidebar_Feature parent class.
  *
  * @since 3.17.0
  */
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

310-323: Consider enhancing accessibility for settings controls.

While the settings panel implementation is functionally correct, consider adding ARIA labels and roles to improve accessibility.

Add ARIA attributes to the settings controls:

 <ExcerptSuggestionsSettings
     isLoading={ isLoading }
+    aria-label={ __( 'Excerpt generation settings', 'wp-parsely' ) }
+    role="group"
     onPersonaChange={ ( selectedPersona ) => {
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 490bb40 and 9a02115.

⛔ Files ignored due to path filters (2)
  • build/content-helper/editor-sidebar.asset.php is excluded by !build/**
  • build/content-helper/editor-sidebar.js is excluded by !build/**
📒 Files selected for processing (3)
  • src/content-helper/editor-sidebar/editor-sidebar.tsx (4 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (1 hunks)
  • src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (8 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
src/content-helper/editor-sidebar/editor-sidebar.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (1)

Pattern **/*.{html,php}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the HTML and PHP code to ensure it is well-structured and adheres to best practices.
  • Ensure the code follows WordPress coding standards and is well-documented.
  • Confirm the code is secure and free from vulnerabilities.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Verify code compatibility with the latest version of WordPress, avoiding deprecated functions or features."
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."
📓 Learnings (1)
src/content-helper/editor-sidebar/editor-sidebar.tsx (1)
Learnt from: vaurdan
PR: Parsely/wp-parsely#2890
File: src/content-helper/editor-sidebar/editor-sidebar.tsx:283-286
Timestamp: 2024-10-25T12:52:20.502Z
Learning: The Excerpt Suggestions need to be initialized before the DOM loads, so it should not be wrapped in domReady().
🔇 Additional comments (11)
src/content-helper/editor-sidebar/excerpt-suggestions/class-excerpt-suggestions.php (5)

15-21: LGTM!

The class documentation is well-structured and properly documents the version history, including the rename from "Excerpt Generator" to "Excerpt Suggestions".


22-31: LGTM!

The feature name getter is well-documented and follows WordPress coding standards.


33-44: LGTM!

The feature filter name getter is well-documented, clearly indicating its deprecated status in favor of the new wp_parsely_current_user_can_use_pch_feature filter.


46-65: LGTM!

The constructor properly handles backward compatibility by conditionally adding the filter callback only when the deprecated filter is in use.


67-101: LGTM!

The callback method properly handles the deprecated filter using WordPress's apply_filters_deprecated() function and maintains backward compatibility.

src/content-helper/editor-sidebar/editor-sidebar.tsx (4)

34-34: LGTM!

The import statement follows WordPress coding standards and correctly imports the initialization function for Excerpt Suggestions.


96-100: LGTM!

The ExcerptSuggestions settings structure is consistent with TitleSuggestions and includes appropriate default values.


174-185: LGTM!

The validation logic for ExcerptSuggestions is comprehensive and follows the same robust pattern as TitleSuggestions, ensuring type safety for all properties.


295-298: LGTM!

The initialization is correctly implemented to run before DOM loads, as required for the Excerpt Suggestions feature.

src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (2)

12-12: LGTM: Import statements are well-organized.

The new imports for persona and tone functionality are correctly structured and follow WordPress conventions.

Also applies to: 15-15, 17-19


160-162: LGTM: Excerpt generation properly includes persona and tone settings.

The implementation correctly passes the persona and tone parameters to the excerpt generation provider.

Copy link
Collaborator Author

@acicovic acicovic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vaurdan, can you fix the empty line and approve? Looks good from my side.

Co-authored-by: Alex Cicovic <[email protected]>
@acicovic acicovic merged commit b2eb484 into develop Oct 25, 2024
36 checks passed
@acicovic acicovic deleted the add/excerpt-suggestions-settings-retry branch October 25, 2024 13:30
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (1)
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

159-162: Add parameter validation for persona and tone.

The generateExcerpt call should validate persona and tone parameters before making the request.

Consider adding validation:

+ if (!persona || !tone) {
+   throw new ContentHelperError(
+     __('Invalid persona or tone settings.', 'wp-parsely'),
+     ContentHelperErrorCode.InvalidParameters
+   );
+ }
 const requestedExcerpt = await ExcerptSuggestionsProvider
   .getInstance()
   .generateExcerpt( postTitle, postContent, persona, tone );
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 9a02115 and 4549a94.

📒 Files selected for processing (1)
  • src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (8 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
src/content-helper/editor-sidebar/excerpt-suggestions/component-panel.tsx (1)

Pattern **/*.{js,ts,tsx,jsx}: "Perform a detailed review of the provided code with following key aspects in mind:

  • Review the code to ensure it is well-structured and adheres to best practices.
  • Verify compliance with WordPress coding standards.
  • Ensure the code is well-documented.
  • Check for security vulnerabilities and confirm the code is secure.
  • Optimize the code for performance, removing any unnecessary elements.
  • Validate JSDoc comments for accuracy, currency, and adherence to WordPress coding standards.
  • Ensure each line comment concludes with a period.
  • Confirm every JSDoc comment includes a @SInCE tag indicating the next version of the plugin to include the code.
  • Guarantee compatibility with the latest version of WordPress, avoiding deprecated functions or features."

Comment on lines +70 to +71
const [ persona, setPersona ] = useState<PersonaProp>( settings.ExcerptSuggestions.Persona );
const [ tone, setTone ] = useState<ToneProp>( settings.ExcerptSuggestions.Tone );
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Add null checks for settings initialization.

The settings are accessed directly without null checks, which could cause runtime errors if settings are not properly loaded.

Apply this diff to add null safety:

- const [ persona, setPersona ] = useState<PersonaProp>( settings.ExcerptSuggestions.Persona );
- const [ tone, setTone ] = useState<ToneProp>( settings.ExcerptSuggestions.Tone );
+ const [ persona, setPersona ] = useState<PersonaProp>( settings?.ExcerptSuggestions?.Persona ?? 'default' );
+ const [ tone, setTone ] = useState<ToneProp>( settings?.ExcerptSuggestions?.Tone ?? 'neutral' );

Committable suggestion was skipped due to low confidence.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Excerpt Suggestions: Allow different personas/styles
2 participants