Making WordPress.org

Changeset 2735


Ignore:
Timestamp:
03/11/2016 06:04:19 PM (9 years ago)
Author:
obenland
Message:

Plugin Directory: Use a custom comment type for internal notes.

See #1570, #1603.

Location:
sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory
Files:
1 added
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/class-customizations.php

    r2659 r2735  
    1111
    1212    /**
    13      * Fetch the instance of the Admin Customizations class.
     13     * Fetch the instance of the Customizations class.
    1414     */
    1515    public static function instance() {
     
    1919    }
    2020
     21    /**
     22     * Constructor.
     23     */
    2124    private function __construct() {
    2225        // Admin Metaboxes
     
    2730
    2831        add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) );
    29         add_action( 'wp_ajax_save-note', array( $this, 'save_note' ) );
     32        add_action( 'wp_ajax_replyto-comment', array( $this, 'save_custom_comment' ), 0 );
     33
     34        add_filter( 'postbox_classes_plugin_internal-notes', array( $this, 'postbox_classes' ) );
    3035    }
    3136
     
    3338     * Adds the plugin name into the post editing title.
    3439     *
    35      * @global $title The wp-admin title variable.
     40     * @global string $title The wp-admin title variable.
    3641     *
    3742     * @param string $post_type The post type of the current page
     
    4045    public function replace_title_global( $post_type ) {
    4146        global $title;
     47
    4248        if ( 'plugin' === $post_type ) {
    4349            $title = sprintf( $title, get_the_title() ); // esc_html() on output
     
    7985
    8086        add_meta_box(
    81             'plugin-notes',
     87            'internal-notes',
    8288            __( 'Internal Notes', 'wporg-plugins' ),
    83             array( __NAMESPACE__ . '\Metabox\Notes', 'display' ),
     89            array( __NAMESPACE__ . '\Metabox\Internal_Notes', 'display' ),
    8490            'plugin', 'normal', 'high'
    8591        );
     
    127133
    128134    /**
    129      * Saves a plugin note.
    130      */
    131     public function save_note() {
    132         check_admin_referer( 'save-note', 'notce' );
    133 
    134         if ( empty( $_POST['id'] ) ) {
    135             wp_send_json_error( array( 'errorCode' => 'no_post_specified' ) );
    136         }
    137 
    138         if ( ! current_user_can( 'review_plugin', absint( $_POST['id'] ) ) ) {
    139             wp_send_json_error( array(
    140                 'error' => __( 'You do not have sufficient permissions to edit notes on this site.' ),
    141             ) );
    142         }
    143 
    144         update_post_meta( absint( $_POST['id'] ), 'note', wp_kses_post( $_POST['note'] ) );
    145 
    146         wp_send_json_success( array(
    147             'note' => wpautop( wp_kses_post( $_POST['note'] ) ),
    148         ) );
     135     * Filters the postbox classes for custom comment meta boxes.
     136     *
     137     * @param array $classes An array of postbox classes.
     138     * @return array
     139     */
     140    public function postbox_classes( $classes ) {
     141        $classes[] = 'comments-meta-box';
     142
     143        return array_filter( $classes );
     144    }
     145
     146    /**
     147     * Saves a comment that is not built-in.
     148     *
     149     * We pretty much have to replicate all of `wp_ajax_replyto_comment()` to be able to comment on draft posts.
     150     */
     151    public function save_custom_comment() {
     152        $comment_post_ID = (int) $_POST['comment_post_ID'];
     153        $post            = get_post( $comment_post_ID );
     154
     155        if ( 'plugin' !== $post->post_type ) {
     156            return;
     157        }
     158        remove_action( 'wp_ajax_replyto-comment', 'wp_ajax_replyto_comment', 1 );
     159
     160        global $wp_list_table;
     161        if ( empty( $action ) ) {
     162            $action = 'replyto-comment';
     163        }
     164
     165        check_ajax_referer( $action, '_ajax_nonce-replyto-comment' );
     166
     167        if ( ! $post ) {
     168            wp_die( - 1 );
     169        }
     170
     171        if ( ! current_user_can( 'edit_post', $comment_post_ID ) ) {
     172            wp_die( - 1 );
     173        }
     174
     175        if ( empty( $post->post_status ) ) {
     176            wp_die( 1 );
     177        }
     178
     179        $user = wp_get_current_user();
     180        if ( ! $user->exists() ) {
     181            wp_die( __( 'Sorry, you must be logged in to reply to a comment.' ) );
     182        }
     183
     184        $user_ID              = $user->ID;
     185        $comment_author       = wp_slash( $user->display_name );
     186        $comment_author_email = wp_slash( $user->user_email );
     187        $comment_author_url   = wp_slash( $user->user_url );
     188        $comment_content      = trim( $_POST['content'] );
     189        $comment_type         = isset( $_POST['comment_type'] ) ? trim( $_POST['comment_type'] ) : '';
     190
     191        if ( current_user_can( 'unfiltered_html' ) ) {
     192            if ( ! isset( $_POST['_wp_unfiltered_html_comment'] ) ) {
     193                $_POST['_wp_unfiltered_html_comment'] = '';
     194            }
     195
     196            if ( wp_create_nonce( 'unfiltered-html-comment' ) != $_POST['_wp_unfiltered_html_comment'] ) {
     197                kses_remove_filters(); // start with a clean slate
     198                kses_init_filters(); // set up the filters
     199            }
     200        }
     201
     202        if ( '' == $comment_content ) {
     203            wp_die( __( 'ERROR: please type a comment.' ) );
     204        }
     205
     206        $comment_parent = 0;
     207        if ( isset( $_POST['comment_ID'] ) ) {
     208            $comment_parent = absint( $_POST['comment_ID'] );
     209        }
     210        $comment_auto_approved = false;
     211        $comment_data          = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID' );
     212
     213        // Automatically approve parent comment.
     214        if ( ! empty( $_POST['approve_parent'] ) ) {
     215            $parent = get_comment( $comment_parent );
     216
     217            if ( $parent && $parent->comment_approved === '0' && $parent->comment_post_ID == $comment_post_ID ) {
     218                if ( ! current_user_can( 'edit_comment', $parent->comment_ID ) ) {
     219                    wp_die( - 1 );
     220                }
     221
     222                if ( wp_set_comment_status( $parent, 'approve' ) ) {
     223                    $comment_auto_approved = true;
     224                }
     225            }
     226        }
     227
     228        $comment_id = wp_new_comment( $comment_data );
     229        $comment    = get_comment( $comment_id );
     230        if ( ! $comment ) {
     231            wp_die( 1 );
     232        }
     233
     234        $position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';
     235
     236        ob_start();
     237        if ( isset( $_REQUEST['mode'] ) && 'dashboard' == $_REQUEST['mode'] ) {
     238            require_once( ABSPATH . 'wp-admin/includes/dashboard.php' );
     239            _wp_dashboard_recent_comments_row( $comment );
     240        } else {
     241            if ( isset( $_REQUEST['mode'] ) && 'single' == $_REQUEST['mode'] ) {
     242                $wp_list_table = _get_list_table( 'WP_Post_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
     243            } else {
     244                $wp_list_table = _get_list_table( 'WP_Comments_List_Table', array( 'screen' => 'edit-comments' ) );
     245            }
     246            $wp_list_table->single_row( $comment );
     247        }
     248        $comment_list_item = ob_get_clean();
     249
     250        $response = array(
     251            'what'     => 'comment',
     252            'id'       => $comment->comment_ID,
     253            'data'     => $comment_list_item,
     254            'position' => $position
     255        );
     256
     257        $counts                   = wp_count_comments();
     258        $response['supplemental'] = array(
     259            'in_moderation'        => $counts->moderated,
     260            'i18n_comments_text'   => sprintf(
     261                _n( '%s Comment', '%s Comments', $counts->approved ),
     262                number_format_i18n( $counts->approved )
     263            ),
     264            'i18n_moderation_text' => sprintf(
     265                _nx( '%s in moderation', '%s in moderation', $counts->moderated, 'comments' ),
     266                number_format_i18n( $counts->moderated )
     267            )
     268        );
     269
     270        if ( $comment_auto_approved ) {
     271            $response['supplemental']['parent_approved'] = $parent->comment_ID;
     272            $response['supplemental']['parent_post_id']  = $parent->comment_post_ID;
     273        }
     274
     275        $x = new \WP_Ajax_Response();
     276        $x->add( $response );
     277        $x->send();
    149278    }
    150279}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/admin/metabox/class-internal-notes.php

    r2734 r2735  
    11<?php
    22namespace WordPressdotorg\Plugin_Directory\Admin\Metabox;
    3 use WordPressdotorg\Plugin_Directory\Tools;
     3use WordPressdotorg\Plugin_Directory\Admin\Plugin_Comments_List_Table;
    44
    55/**
     
    88 * @package WordPressdotorg\Plugin_Directory\Admin\Metabox
    99 */
    10 class Notes {
     10class Internal_Notes {
    1111
    1212    /**
    13      *
     13     * Displays comment box for internal notes.
    1414     */
    15     static function display( $post ) {
    16         $note = (string) get_post_meta( $post->ID, 'note', true );
    17 
     15    static function display() {
     16        $wp_list_table = new Plugin_Comments_List_Table( array(
     17            'comment_type' => 'internal-note',
     18        ) );
     19        wp_nonce_field( 'get-comments', 'add_comment_nonce', false );
    1820        ?>
    19         <div class="view-note hide-if-no-js">
    20             <?php echo empty( $note ) ? __( 'Add note', 'wporg-plugins' ) : wpautop( $note ); ?>
    21         </div>
    22         <div class="edit-note show-if-no-js" style="display: none;">
    23             <?php wp_nonce_field( 'save-note', 'notce' ); ?>
    24             <textarea class="note-content" rows="5" style="width: 100%;"><?php echo $note; ?></textarea>
    25             <p>
    26                 <button type="button" class="button button-primary save-note"><?php _e( 'Save', 'wporg-plugins' ); ?></button>
    27                 <button type="reset" class="button button-secondary cancel-note"><?php _e( 'Cancel', 'wporg-plugins' ); ?></button>
    28             </p>
    29         </div>
     21        <p class="hide-if-no-js" id="add-new-comment">
     22            <a class="button" href="#commentstatusdiv"><?php _e( 'Add note', 'wporg-plugins' ); ?></a>
     23        </p>
    3024        <?php
     25        $wp_list_table->display( true );
     26        wp_comment_trashnotice();
    3127    }
    3228}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php

    r2655 r2735  
    5454            ),
    5555            'description'     => __( 'A Repo Plugin', 'wporg-plugins' ),
    56             'supports'        => false,
     56            'supports'        => array( 'comments' ),
    5757            'public'          => true,
    5858            'show_ui'         => true,
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/css/edit-form.css

    r2659 r2735  
    5858        0 0 2px 1px rgba(30, 140, 190, .8);
    5959}
     60
     61/* Comment meta boxes */
     62.comments-meta-box #edithead .inside {
     63    float: left;
     64    padding: 3px 0 2px 5px;
     65    margin: 0;
     66    text-align: center;
     67}
     68
     69.comments-meta-box.postbox .inside,
     70.comments-meta-box .column-comment p {
     71    margin: 0;
     72    padding: 0;
     73}
     74
     75.comments-meta-box .inside .row-actions {
     76    line-height:18px;
     77}
     78
     79.comments-meta-box .inside .column-author *:not(strong) {
     80    display: none;
     81}
     82
     83.comments-meta-box #replyrow td {
     84    padding: 0;
     85}
     86
     87.comments-meta-box p {
     88    padding: 8px 10px;
     89    margin: 0;
     90}
     91
     92.comments-meta-box .comments-box {
     93    border: 0 none;
     94}
     95
     96.comments-meta-box .comments-box thead th,
     97.comments-meta-box .comments-box thead td {
     98    background: transparent;
     99    padding: 0 7px 4px;
     100    font-style: italic;
     101}
     102
     103.comments-meta-box .comments-box tr:last-child td {
     104    border-bottom: 0 none;
     105}
     106
     107.comments-meta-box #edithead .inside input {
     108    width: 160px;
     109}
     110
     111@media screen and ( max-width: 782px ) {
     112    .comments-meta-box .fixed .column-author {
     113        display: none !important;
     114    }
     115
     116    .comments-meta-box #edithead .inside {
     117        float: none;
     118        text-align: left;
     119        padding: 3px 5px;
     120    }
     121
     122    .comments-meta-box #edithead .inside input {
     123        width: 100%;
     124    }
     125}
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/js/edit-form.js

    r2659 r2735  
    44
    55( function( $, wp ) {
    6 
    76    var PluginEdit = {
    8         $notesBox: {},
    97        $testedWith: {},
    108        $pluginStatus: {},
    119
    1210        ready: function() {
    13             PluginEdit.$notesBox     = $( '#plugin-notes' );
    1411            PluginEdit.$testedWith   = $( '#tested-with-select' );
    1512            PluginEdit.$pluginStatus = $( '#plugin-status-select' );
     
    2320                .on( 'click', '.cancel-plugin-status', PluginEdit.cancelPluginStatus );
    2421
    25             PluginEdit.$notesBox
    26                 .on( 'click', '.cancel-note', PluginEdit.showNote )
    27                 .on( 'click', '.view-note',   PluginEdit.editNote )
    28                 .on( 'click', '.save-note',   PluginEdit.saveNote );
     22            _.each( $( '#post-body' ).find( '.comments-box' ), PluginEdit.loadComments );
     23
     24            $( '#add-new-comment' ).on( 'click', 'a.button', function( event ) {
     25                event.preventDefault();
     26
     27                window.commentReply && commentReply.addcomment( $( '#post_ID' ).val() );
     28
     29                $( '#replyrow' ).find( '.comment-reply' ).append( $( '<input/>' ).attr({
     30                    type: 'hidden',
     31                    name: 'comment_type',
     32                    value: $( '.comments-box' ).data( 'comment-type' )
     33                }) );
     34            } );
    2935        },
    3036
     
    6773        },
    6874
    69         showNote: function() {
    70             $( '.view-note', PluginEdit.$notesBox ).show();
    71             $( '.edit-note', PluginEdit.$notesBox ).hide();
    72         },
     75        loadComments: function ( element ) {
     76            var $commentsList = $( element ),
     77                data = {
     78                    _ajax_nonce:  $( '#add_comment_nonce' ).val(),
     79                    p:            $( '#post_ID' ).val(),
     80                    mode:         'single',
     81                    start:        0,
     82                    number:       20,
     83                    comment_type: $commentsList.data( 'comment-type' )
     84                };
    7385
    74         editNote: function() {
    75             var $textarea = $( '.note-content', PluginEdit.$notesBox );
     86            wp.ajax.post( 'get-comments', data ).always( function( response ) {
     87                response = wpAjax.parseAjaxResponse( response );
    7688
    77             $( '.view-note', PluginEdit.$notesBox ).hide();
    78             $( '.edit-note', PluginEdit.$notesBox ).show();
    79             $textarea.text( $textarea.val() ).focus();
    80         },
     89                if ( 'object' == typeof response && response.responses[0] ) {
     90                    $commentsList.append( response.responses[0].data ).show();
    8191
    82         saveNote: function() {
    83             wp.ajax.post( 'save-note', {
    84                 id: $( '#post_ID' ).val(),
    85                 note: $( '.note-content', PluginEdit.$notesBox ).val(),
    86                 notce: $( '#notce' ).val()
    87             } )
    88                 .done( function( response ) {
    89                     var note = response.note ? response.note : 'Add note';
    90 
    91                     $( '.view-note', PluginEdit.$notesBox ).html( note );
    92                     PluginEdit.showNote();
    93                 } );
     92                    $( 'a[className*=\':\']' ).unbind();
     93                }
     94            } );
    9495        }
    9596    };
Note: See TracChangeset for help on using the changeset viewer.