Making WordPress.org

Ticket #2272: 2272.patch

File 2272.patch, 11.4 KB (added by Clorith, 5 years ago)
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/inc/class-plugin.php

    <+>UTF-8
     
    4141                if ( $blog_id && defined( 'WPORG_SUPPORT_FORUMS_BLOGID' ) && WPORG_SUPPORT_FORUMS_BLOGID == $blog_id ) {
    4242                        $this->dropin          = new Dropin;
    4343                        $this->support_compat  = new Support_Compat;
     44                        $this->user_notes      = new User_Notes;
    4445
    4546                        // Only load Performance_Optimizations if necessary.
    4647                        $this->performance = new Performance_Optimizations;
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/inc/class-user-notes.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
     1<?php
     2
     3namespace WordPressdotorg\Forums;
     4
     5class User_Notes {
     6        /**
     7         * An array of authors who have written notes.
     8         *
     9         * These are stored to avoid looking up user IDs for every note.
     10         *
     11         * @access private
     12         *
     13         * @var array $note_authors
     14         */
     15        private $note_authors = array();
     16
     17        /**
     18         * An array of all notes for each user.
     19         *
     20         * As users may have written multiple replies, in a thread, this will save us needing to look up all notes multiple times.
     21         *
     22         * @access private
     23         *
     24         * @var array $user_notes
     25         */
     26        private $user_notes = array();
     27
     28        public function __construct() {
     29                add_action( 'bbp_theme_after_reply_author_details', array( $this, 'user_note_link' ) );
     30                add_action( 'bbp_theme_after_reply_content', array( $this, 'user_note_fields' ) );
     31
     32                add_action( 'bbp_template_after_user_profile', array( $this, 'user_profile_notes_section' ) );
     33
     34                add_action( 'init', array( $this, 'add_note' ) );
     35
     36                add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
     37        }
     38
     39        /**
     40         * Append a notes section to user profiles
     41         *
     42         * @return void
     43         */
     44        function user_profile_notes_section() {
     45                if ( ! current_user_can( 'moderate' ) ) {
     46                        return;
     47                }
     48                $user = bbp_get_user_id();
     49
     50                printf(
     51                        '<h2 class="entry-title">%s</h2>',
     52                        esc_html__( 'User Notes', 'wporg-forums' )
     53                );
     54
     55                $this->output_user_notes( $user );
     56        }
     57
     58        /**
     59         * Check if a note is added to a post and add it to the relevant users meta data
     60         *
     61         * @return void
     62         */
     63        function add_note() {
     64                // Make sure a note is added, and that the current user has capabilities to add them
     65                if ( ! isset( $_POST['bbp-user-notes-new-note'] ) || empty( $_POST['bbp-user-notes-new-note'] ) || ! current_user_can( 'moderate' ) ) {
     66                        return;
     67                }
     68
     69                // Make sure our nonces are in order
     70                if ( ! check_admin_referer( sprintf( 'bbp_user_note-add-%d', $_POST['bbp-user-note-user-id'] ), '_bbp_user_note_nonce' ) ) {
     71                        wp_die();
     72                }
     73
     74                // Ensure the ID used is an integer, and a legitimate user
     75                $check_user = get_user_by( 'ID', intval( $_POST['bbp-user-note-user-id'] ) );
     76                if ( ! $check_user ) {
     77                        return;
     78                }
     79
     80                // Get an array of existing notes, or create an array if there are none
     81                $user_notes = get_user_meta( $check_user->ID, '_bbp_user_note', true );
     82                if ( ! $user_notes ) {
     83                        $user_notes = array();
     84                }
     85
     86                // Add the new note to the array of notes
     87                $user_notes[] = (object) array(
     88                        'note'   => wp_kses( $_POST['bbp-user-notes-new-note'], array( 'a' => array( 'href' => array() ) ) ),
     89                        'time'   => date( "c" ),
     90                        'post'   => bbp_get_reply_url( intval( $_POST['bbp-user-note-original-reply'] ) ),
     91                        'author' => get_current_user_id()
     92                );
     93
     94                update_user_meta( $check_user->ID, '_bbp_user_note', $user_notes );
     95        }
     96
     97        /**
     98         * Register scripts and styles that plugin relies on.
     99         *
     100         * @return void
     101         */
     102        function enqueue_scripts() {
     103                if ( ! current_user_can( 'moderate' ) ) {
     104                        return;
     105                }
     106
     107                wp_enqueue_script( 'bbpress-user-notes', plugins_url( '/js/user-notes.js', __DIR__ ), array( 'jquery' ), false, true );
     108        }
     109
     110        /**
     111         * Add the toggle link for notes to the author area of a post
     112         *
     113         * @return void
     114         */
     115        function user_note_link() {
     116                if ( ! current_user_can( 'moderate' ) ) {
     117                        return;
     118                }
     119
     120                printf(
     121                        '<span class="bbpress-user-notes-toggle" data-bbp-user-note-toggle="#bbpress-user-notes-%d">%s</span>',
     122                        esc_attr( get_the_ID() ),
     123                        esc_html(
     124                                sprintf(
     125                                        __( 'Toggle user notes (%d)', 'wporg-forums' ),
     126                                        $this->user_note_count()
     127                                )
     128                        )
     129                );
     130
     131        }
     132
     133        /**
     134         * @param int $user Default null. The user to get counts for, the default being the current user.
     135         *
     136         * @return int
     137         */
     138        function user_note_count( $user = null ) {
     139                if ( empty( $user ) ) {
     140                        $user = get_the_author_meta( 'ID' );
     141                }
     142
     143                if ( ! isset( $this->user_notes[ $user ] ) ) {
     144                        $this->set_user_note_fields( $user );
     145                }
     146
     147                return $this->user_notes[ $user ]['count'];
     148        }
     149
     150        function set_user_note_fields( $user = null ) {
     151                if ( empty( $user ) ) {
     152                        $user = get_the_author_meta( 'ID' );
     153                }
     154
     155                // Break out early if the notes are already grabbed for this session
     156                if ( isset( $this->user_notes[ $user ] ) ) {
     157                        return;
     158                }
     159
     160                $user_notes = get_user_meta( $user, '_bbp_user_note', true );
     161
     162                $this->user_notes[ $user ] = array(
     163                        'count' => 0,
     164                        'raw'   => null,
     165                        'html'  => array()
     166                );
     167
     168                if ( is_array( $user_notes ) ) {
     169                        $this->user_notes[ $user ]['count'] = count( $user_notes );
     170                        $this->user_notes[ $user ]['raw']   = $user_notes;
     171
     172                        foreach ( $user_notes AS $user_note ) {
     173                                if ( ! isset( $this->note_authors[ $user_note->author ] ) ) {
     174                                        $this->note_authors[ $user_note->author ] = get_user_by( 'ID', $user_note->author );
     175                                }
     176
     177                                $this->user_notes[ $user ]['html'][] = sprintf(
     178                                        '<div class="bbpress-user-note-single">%s <span class="bbpress-user-note-meta">%s</span></div>',
     179                                        wp_kses( $user_note->note, array( 'a' => array( 'href' => array() ) ) ),
     180                                        sprintf(
     181                                        /* translators: 1: Users display name 2: Link to post 3: Time of creation */
     182                                                __( 'by %1$s at <a href="%2$s">%3$s</a>', 'wporg-forums' ),
     183                                                esc_html( $this->note_authors[ $user_note->author ]->display_name ),
     184                                                esc_url( $user_note->post ),
     185                                                date_i18n( "Y-m-d H:i:s", strtotime( $user_note->time ) )
     186                                        )
     187                                );
     188                        }
     189                }
     190        }
     191
     192        /**
     193         * @param $user
     194         *
     195         * @return void
     196         */
     197        function output_user_notes( $user ) {
     198                if ( ! isset( $this->user_notes[ $user ] ) ) {
     199                        $this->set_user_note_fields( $user );
     200                }
     201
     202                if ( ! empty( $this->user_notes[ $user ]['html'] ) ) {
     203                        echo implode( '', $this->user_notes[ $user ]['html'] );
     204                } else {
     205                        esc_html_e(
     206                                'No notes have been added to this user.',
     207                                'wporg-forums'
     208                        );
     209                }
     210        }
     211
     212        /**
     213         * Output all existing users notes, and the form for adding new ones to a hidden area in the post content.
     214         *
     215         * @return void
     216         */
     217        function user_note_fields() {
     218                if ( ! current_user_can( 'moderate' ) ) {
     219                        return;
     220                }
     221
     222                $lookup_user = get_the_author_meta( 'ID' );
     223
     224                $this->set_user_note_fields( $lookup_user );
     225
     226                printf(
     227                        '<div class="bbpress-user-notes" id="bbpress-user-notes-%d">',
     228                        esc_attr( get_the_ID() )
     229                );
     230
     231                printf(
     232                        '<h2>%s</h2>',
     233                        esc_html__( 'User notes', 'wporg-forums' )
     234                );
     235
     236                $this->output_user_notes( $lookup_user );
     237
     238                $this->add_note_form();
     239
     240                echo '</div>';
     241        }
     242
     243        /**
     244         * Generate the form for adding new notes
     245         *
     246         * @return void
     247         */
     248        function add_note_form() {
     249                ?>
     250                <form action="<?php echo esc_url( sprintf( '%s#post-%d', bbp_get_topic_permalink(), get_the_ID() ) ); ?>" method="post" class="bbp-add-user-note">
     251                        <input type="hidden" name="bbp-user-note-user-id" value="<?php echo esc_attr( get_the_author_meta( 'ID' ) ); ?>">
     252                        <input type="hidden" name="action" value="bbpress-user-notes-add">
     253                        <input type="hidden" name="bbp-user-note-original-reply" value="<?php echo esc_attr( get_the_ID() ); ?>">
     254
     255                        <?php wp_nonce_field( sprintf( 'bbp_user_note-add-%d', get_the_author_meta( 'ID' ) ), '_bbp_user_note_nonce' ); ?>
     256
     257                        <label for="bbp-user-notes-new-note" class="screen-reader-text"><?php esc_html_e( 'New note:', 'wporg-forums' ); ?></label>
     258                        <textarea name="bbp-user-notes-new-note" id="bbp-user-notes-new-note"></textarea>
     259
     260                        <button type="submit"><?php esc_html_e( 'Add your note', 'wporg-forums' ); ?></button>
     261                </form>
     262                <?php
     263        }
     264}
     265 No newline at end of file
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/js/user-notes.js

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
     1jQuery(document).ready(function ($) {
     2    $( ".bbp-reply-author" ).on( 'click', '.bbpress-user-notes-toggle', function (e) {
     3        e.preventDefault();
     4        $( $(this).data('bbp-user-note-toggle') ).slideToggle();
     5    } );
     6});
     7 No newline at end of file
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/support-forums.php

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    1616// General includes.
    1717include( dirname( __FILE__ ) . '/inc/class-plugin.php' );
    1818include( dirname( __FILE__ ) . '/inc/class-users.php' );
     19include( dirname( __FILE__ ) . '/inc/class-user-notes.php' );
    1920include( dirname( __FILE__ ) . '/inc/class-moderators.php' );
    2021include( dirname( __FILE__ ) . '/inc/class-hooks.php' );
    2122
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/support-forums/css/styles-moderators.css

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    55#bbpress-forums .status-archived.odd {
    66        background-color: #fdd !important;
    77}
     8
     9/** User notes **/
     10.bbpress-user-notes-toggle {
     11        cursor: pointer;
     12}
     13
     14.bbpress-user-note-single {
     15        display: inline-block;
     16        width: 100%;
     17        border-left: 2px solid #00a0d2;
     18        padding: .5rem;
     19        margin-bottom: 1rem;
     20}
     21.bbpress-user-note-meta {
     22        font-style: italic;
     23        display: inline-block;
     24        width: 100%;
     25        text-align: right;
     26}
     27
     28.bbpress-user-notes {
     29        display: none;
     30}
     31 No newline at end of file