Skip to:
Content

BuddyPress.org

Ticket #5500: 5500.2.diff

File 5500.2.diff, 14.7 KB (added by boonebgorges, 3 years ago)
  • src/bp-xprofile/admin/css/admin.css

    diff --git src/bp-xprofile/admin/css/admin.css src/bp-xprofile/admin/css/admin.css
    index 6dd7a20..4795078 100644
    p.member-type-none-notice { 
    284284        display: none;
    285285        visibility: hidden;
    286286}
     287
     288.form-table.bp-date-options {
     289        margin: 0 8px;
     290}
     291
     292.form-table.bp-date-options th {
     293        width: 150px;
     294}
     295
     296.date-format-label {
     297        display: inline-block;
     298        width: 150px;
     299}
     300
     301.date-format-custom-value,
     302.date-range-numeric {
     303        width: 56px;
     304}
  • src/bp-xprofile/admin/js/admin.js

    diff --git src/bp-xprofile/admin/js/admin.js src/bp-xprofile/admin/js/admin.js
    index 53f6b1c..b70a485 100644
    jQuery( document ).ready( function() { 
    270270        // Handle title placeholder text the WordPress way
    271271        titleHint( 'title' );
    272272
     273        // On Date fields, selecting a date_format radio button should change the Custom value.
     274        var $date_format = jQuery( 'input[name="date_format"]' );
     275        var $date_format_custom_value = jQuery( '#date-format-custom-value' );
     276        var $date_format_sample = jQuery( '#date-format-custom-sample' );
     277        $date_format.click( function( e ) {
     278                switch ( e.target.value ) {
     279                        case 'elapsed' :
     280                                $date_format_custom_value.val( '' );
     281                                $date_format_sample.html( '' );
     282                        break;
     283
     284                        case 'custom' :
     285                        break;
     286
     287                        default :
     288                                $date_format_custom_value.val( e.target.value );
     289                                $date_format_sample.html( jQuery( e.target ).siblings( '.date-format-label' ).html() );
     290                        break;
     291                }
     292        } );
     293
     294        // Clicking into the custom date format field should select the Custom radio button.
     295        var $date_format_custom = jQuery( '#date-format-custom' );
     296        $date_format_custom_value.focus( function() {
     297                $date_format_custom.prop( 'checked', 'checked' );
     298        } );
     299
     300        // Validate custom date field.
     301        var $date_format_spinner = jQuery( '#date-format-custom-spinner' );
     302        $date_format_custom_value.change( function( e ) {
     303                $date_format_spinner.addClass( 'is-active' );
     304                jQuery.post( ajaxurl, {
     305                        action: 'date_format',
     306                        date: e.target.value
     307                },
     308                function( response ) {
     309                        $date_format_spinner.removeClass( 'is-active' );
     310                        $date_format_sample.html( response );
     311                } );
     312        } );
     313
    273314        // tabs init with a custom tab template and an "add" callback filling in the content
    274315        var $tab_items,
    275316                $tabs = jQuery( '#tabs' ).tabs();
  • src/bp-xprofile/bp-xprofile-admin.php

    diff --git src/bp-xprofile/bp-xprofile-admin.php src/bp-xprofile/bp-xprofile-admin.php
    index 352a8b0..006af0b 100644
    function xprofile_admin_manage_field( $group_id, $field_id = null ) { 
    432432                                        bp_xprofile_update_field_meta( $field_id, 'do_autolink', 'off' );
    433433                                }
    434434
     435                                // @todo move this
     436                                $field->admin_save_settings();
     437
    435438                                /**
    436439                                 * Fires at the end of the process to save a field for a user, if successful.
    437440                                 *
  • src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php src/bp-xprofile/classes/class-bp-xprofile-field-type-datebox.php
    index 6074c5b..ca83627 100644
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    239239                        case 'year':
    240240                                $html = sprintf( '<option value="" %1$s>%2$s</option>', selected( $year, 0, false ), /* translators: no option picked in select box */ __( '----', 'buddypress' ) );
    241241
    242                                 for ( $i = 2037; $i > 1901; $i-- ) {
     242                                $settings = $this->get_field_settings( $this->field_obj->id );
     243
     244                                if ( 'relative' === $settings['range_type'] ) {
     245                                        $start = date( 'Y' ) + $settings['range_relative_start'];
     246                                        $end   = date( 'Y' ) + $settings['range_relative_end'];
     247                                } else {
     248                                        $start = $settings['range_absolute_start'];
     249                                        $end   = $settings['range_absolute_end'];
     250                                }
     251
     252                                for ( $i = $end; $i >= $start; $i-- ) {
    243253                                        $html .= sprintf( '<option value="%1$s" %2$s>%3$s</option>', (int) $i, selected( $year, $i, false ), (int) $i );
    244254                                }
    245255                        break;
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    315325        }
    316326
    317327        /**
    318          * This method usually outputs HTML for this field type's children options on the wp-admin Profile Fields
    319          * "Add Field" and "Edit Field" screens, but for this field type, we don't want it, so it's stubbed out.
     328         * Get settings for a given date field.
    320329         *
    321          * @since 2.0.0
     330         * @since 2.7.0
     331         *
     332         * @param int $field_id ID of the field.
     333         * @return array
     334         */
     335        public static function get_field_settings( $field_id ) {
     336                $defaults = array(
     337                        'date_format'          => 'Y-m-d',
     338                        'date_format_custom'   => '',
     339                        'range_type'           => 'absolute',
     340                        'range_absolute_start' => date( 'Y' ) - 60,
     341                        'range_absolute_end'   => date( 'Y' ) + 10,
     342                        'range_relative_start' => '-10',
     343                        'range_relative_end'   => '20',
     344                );
     345
     346                $settings = array();
     347                foreach ( $defaults as $key => $value ) {
     348                        $saved = bp_xprofile_get_meta( $field_id, 'field', $key, true );
     349                        if ( '' !== $saved ) {
     350                                $settings[ $key ] = $saved;
     351                        } else {
     352                                $settings[ $key ] = $value;
     353                        }
     354                }
     355
     356                $settings = self::validate_settings( $settings );
     357
     358                return $settings;
     359        }
     360
     361        /**
     362         * Validate date field settings.
     363         *
     364         * @since 2.7.0
     365         *
     366         * @param array $settings Raw settings.
     367         * @return array Validated settings.
     368         */
     369        public static function validate_settings( $settings ) {
     370                foreach ( $settings as $key => &$value ) {
     371                        switch ( $key ) {
     372                                case 'range_type' :
     373                                        if ( $value !== 'absolute' ) {
     374                                                $value = 'relative';
     375                                        }
     376                                break;
     377
     378                                // @todo More date restrictions?
     379                                case 'range_absolute_start' :
     380                                case 'range_absolute_end' :
     381                                        $value = absint( $value );
     382                                break;
     383
     384                                case 'range_relative_start' :
     385                                case 'range_relative_end' :
     386                                        $value = intval( $value );
     387                                break;
     388                        }
     389                }
     390
     391                return $settings;
     392        }
     393
     394        /**
     395         * Save settings from the field edit screen in the Dashboard.
     396         *
     397         * @param int $field_id ID of the field.
     398         * @return bool True on success.
     399         */
     400        public function admin_save_settings( $field_id ) {
     401                $existing_settings = self::get_field_settings( $field_id );
     402
     403                $saved_settings = array();
     404                foreach ( array_keys( $existing_settings ) as $setting ) {
     405                        switch ( $setting ) {
     406                                case 'range_relative_start' :
     407                                case 'range_relative_end' :
     408                                        $op_key = $setting . '_type';
     409                                        if ( isset( $_POST[ $op_key ] ) && 'past' === $_POST[ $op_key ] ) {
     410                                                $value = 0 - intval( $_POST[ $setting ] );
     411                                        } else {
     412                                                $value = intval( $_POST[ $setting ] );
     413                                        }
     414
     415                                        $saved_settings[ $setting ] = $value;
     416                                break;
     417
     418                                default :
     419                                        if ( isset( $_POST[ $setting ] ) ) {
     420                                                $saved_settings[ $setting ] = wp_unslash( $_POST[ $setting ] );
     421                                        }
     422                                break;
     423                        }
     424                }
     425
     426                $saved_settings = self::validate_settings( $saved_settings );
     427
     428                foreach ( $saved_settings as $setting_key => $setting_value ) {
     429                        bp_xprofile_update_meta( $field_id, 'field', $setting_key, $setting_value );
     430                }
     431
     432                return true;
     433        }
     434
     435        /**
     436         * Generate the settings markup for Date fields.
     437         *
     438         * @since 2.7.0
    322439         *
    323440         * @param BP_XProfile_Field $current_field The current profile field on the add/edit screen.
    324441         * @param string            $control_type  Optional. HTML input type used to render the current
    325442         *                                         field's child options.
    326443         */
    327         public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {}
     444        public function admin_new_field_html( BP_XProfile_Field $current_field, $control_type = '' ) {
     445                $type = array_search( get_class( $this ), bp_xprofile_get_field_types() );
     446
     447                if ( false === $type ) {
     448                        return;
     449                }
     450
     451                $class = $current_field->type != $type ? 'display: none;' : '';
     452                $current_type_obj = bp_xprofile_create_field_type( $type );
     453
     454                $settings = self::get_field_settings( $current_field->id );
     455                ?>
     456
     457<div id="<?php echo esc_attr( $type ); ?>" class="postbox bp-options-box" style="<?php echo esc_attr( $class ); ?> margin-top: 15px;">
     458        <table class="form-table bp-date-options">
     459                <tr>
     460                        <th scope="row">
     461                                <?php esc_html_e( 'Date format', 'buddypress' ); ?>
     462                        </th>
     463
     464                        <td>
     465                                <fieldset>
     466                                        <legend class="screen-reader-text">
     467                                                <?php esc_html_e( 'Date format', 'buddypress' ); ?>
     468                                        </legend>
     469
     470                                        <?php foreach ( $this->get_date_formats() as $format ): ?>
     471                                                <label for="date-format-<?php echo esc_attr( $format ); ?>">
     472                                                        <input type="radio" name="date_format" id="date-format-<?php echo esc_attr( $format ); ?>" value="<?php echo esc_attr( $format ); ?>" <?php checked( $format, $settings['date_format'] ); ?> />
     473                                                        <span class="date-format-label"><?php echo date_i18n( $format ); ?></span>
     474                                                        <code><?php echo esc_html( $format ); ?></code>
     475                                                </label>
     476                                                <br />
     477                                        <?php endforeach;?>
     478
     479                                        <label for="date-format-elapsed">
     480                                                <input type="radio" name="date_format" id="date-format-elapsed" <?php checked( 'elapsed', $settings['date_format'] ); ?> value="elapsed" />
     481                                                <span class="date-format-label"><?php esc_html_e( 'Time elapsed', 'buddypress' ); ?></span> <?php _e( '<code>4 years ago</code>, <code>4 years from now</code>', 'buddypress' ); ?>
     482                                        </label>
     483                                        <br />
     484
     485                                        <label for="date-format-custom">
     486                                                <input type="radio" name="date_format" id="date-format-custom" <?php checked( 'custom', $settings['date_format'] ); ?> value="custom" />
     487                                                <span class="date-format-label"><?php esc_html_e( 'Custom:', 'buddypress' ); ?></span>
     488                                                <input type="text" name="date_format_custom" id="date-format-custom-value" class="date-format-custom-value" value="<?php echo esc_attr( $settings['date_format_custom'] ); ?>" /> <span class="screen-reader-text"><?php esc_html_e( 'Example:', 'buddypress' ); ?></span><span class="date-format-custom-sample" id="date-format-custom-sample"><?php if ( $settings['date_format_custom'] ) : ?><?php echo esc_html( date( $settings['date_format_custom'] ) ); endif; ?></span><span class="spinner" id="date-format-custom-spinner"></span>
     489                                        </label>
     490                                </fieldset>
     491
     492                                <p><a href="https://codex.wordpress.org/Formatting_Date_and_Time"><?php esc_html_e( 'Documentation on date and time formatting', 'buddypress' ); ?></a></p>
     493                        </td>
     494                </tr>
     495
     496                <tr>
     497                        <th scope="row">
     498                                <?php esc_html_e( 'Range', 'buddypress' ); ?>
     499                        </th>
     500
     501                        <td>
     502                                <fieldset>
     503                                        <legend class="screen-reader-text">
     504                                                <?php esc_html_e( 'Range', 'buddypress' ); ?>
     505                                        </legend>
     506
     507                                        <label>
     508                                                <input type="radio" name="range_type" id="range_type_absolute" value="absolute" <?php checked( 'absolute', $settings['range_type'] ); ?> />
     509
     510                                                <?php
     511                                                printf(
     512                                                        __( 'From %s to %s', 'buddypress' ),
     513                                                        sprintf( '<input class="date-range-numeric" type="text" name="range_absolute_start" value="%s" />', esc_attr( $settings['range_absolute_start'] ) ),
     514                                                        sprintf( '<input class="date-range-numeric" type="text" name="range_absolute_end" value="%s" />', esc_attr( $settings['range_absolute_end'] ) )
     515                                                );
     516                                                ?>
     517                                        </label>
     518                                        <br />
     519
     520                                        <label>
     521                                                <input type="radio" name="range_type" id="range_type_relative" value="relative" <?php checked( 'relative', $settings['range_type'] ); ?> />
     522
     523                                                <?php
     524                                                printf(
     525                                                        __( 'From %s to %s', 'buddypress' ),
     526                                                        sprintf(
     527                                                                '<input type="text" class="date-range-numeric" name="range_relative_start" value="%s" /> <select name="range_relative_start_type"><option value="past" %s>%s</option><option value="future" %s>%s</option></select>',
     528                                                                esc_attr( abs( $settings['range_relative_start'] ) ),
     529                                                                selected( true, $settings['range_relative_start'] <= 0, false ),
     530                                                                esc_attr__( 'years ago', 'buddypress' ),
     531                                                                selected( true, $settings['range_relative_start'] > 0, false ),
     532                                                                esc_attr__( 'years from now', 'buddypress' )
     533                                                        ),
     534                                                        sprintf(
     535                                                                '<input type="text" class="date-range-numeric" name="range_relative_end" value="%s" /> <select name="range_relative_end_type"><option value="past" %s>%s</option><option value="future" %s>%s</option></select>',
     536                                                                esc_attr( abs( $settings['range_relative_end'] ) ),
     537                                                                selected( true, $settings['range_relative_end'] <= 0, false ),
     538                                                                esc_attr__( 'years ago', 'buddypress' ),
     539                                                                selected( true, $settings['range_relative_end'] > 0, false ),
     540                                                                esc_attr__( 'years from now', 'buddypress' )
     541                                                        )
     542                                                );
     543                                                ?>
     544                                        </label>
     545                                </fieldset>
     546                        </td>
     547                </tr>
     548        </table>
     549</div>
     550                <?php
     551        }
    328552
    329553        /**
    330554         * Format Date values for display.
    class BP_XProfile_Field_Type_Datebox extends BP_XProfile_Field_Type { 
    344568                        $field_value = strtotime( $field_value );
    345569                }
    346570
    347                 return bp_format_time( $field_value, true, false );
     571                $settings = self::get_field_settings( $field_id );
     572
     573                switch ( $settings['date_format'] ) {
     574                        case 'elapsed' :
     575                                $formatted = bp_core_time_since( $field_value );
     576                        break;
     577
     578                        case 'custom' :
     579                                $formatted = date( $settings['date_format_custom'], $field_value );
     580                        break;
     581
     582                        default :
     583                                $formatted = date( $settings['date_format'], $field_value );
     584                        break;
     585                }
     586
     587                return $formatted;
     588        }
     589
     590        public function get_date_formats() {
     591                $date_formats = array_unique( apply_filters( 'date_formats', array( __( 'F j, Y' ), 'Y-m-d', 'm/d/Y', 'd/m/Y' ) ) );
     592
     593                return apply_filters( 'bp_xprofile_date_field_date_formats', $date_formats );
    348594        }
    349595}
  • src/bp-xprofile/classes/class-bp-xprofile-field-type.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field-type.php src/bp-xprofile/classes/class-bp-xprofile-field-type.php
    index 7fd1940..70fac87 100644
    abstract class BP_XProfile_Field_Type { 
    451451                return $field_value;
    452452        }
    453453
     454        /**
     455         * Save miscellaneous settings related to this field type.
     456         *
     457         * Override in a specific field type if it requires an admin save routine.
     458         *
     459         * @since 2.7.0
     460         *
     461         * @param $field_id Field ID.
     462         */
     463        public function admin_save_settings( $field_id ) {}
     464
    454465        /** Protected *************************************************************/
    455466
    456467        /**
  • src/bp-xprofile/classes/class-bp-xprofile-field.php

    diff --git src/bp-xprofile/classes/class-bp-xprofile-field.php src/bp-xprofile/classes/class-bp-xprofile-field.php
    index 1a384ba..2e4ddc5 100644
    class BP_XProfile_Field { 
    10931093        }
    10941094
    10951095        /**
     1096         * Save miscellaneous settings for this field.
     1097         *
     1098         * Some field types have type-specific settings, which are saved here.
     1099         *
     1100         * @since 2.7.0
     1101         */
     1102        public function admin_save_settings() {
     1103                return $this->type_obj->admin_save_settings( $this->id );
     1104        }
     1105
     1106        /**
    10961107         * Populates the items for radio buttons, checkboxes, and dropdown boxes.
    10971108         */
    10981109        public function render_admin_form_children() {