Plugin Directory

Changeset 1843718


Ignore:
Timestamp:
03/20/2018 06:50:51 PM (8 years ago)
Author:
pressshack
Message:

Releasing 1.11.3

Location:
publishpress/trunk
Files:
116 added
13 deleted
34 edited

Legend:

Unmodified
Added
Removed
  • publishpress/trunk/common/css/pressshack-admin.css

    r1839780 r1843718  
    7979}
    8080
    81 .pressshack-admin-wrapper > header h1 {
     81.pressshack-admin-wrapper > header .pressshack-title {
    8282    margin: .67em 0 15px .15em;
    8383    font-weight: 600;
  • publishpress/trunk/common/php/class-module.php

    r1839780 r1843718  
    161161        public function get_post_types_for_module($module)
    162162        {
    163             return PublishPress\Util::get_post_types_for_module($module);
     163            return PublishPress\Legacy\Util::get_post_types_for_module($module);
    164164        }
    165165
     
    335335        public function get_current_post_type()
    336336        {
    337             return PublishPress\Util::get_current_post_type();
     337            return PublishPress\Legacy\Util::get_current_post_type();
    338338        }
    339339
     
    624624        public function users_select_form($selected = null, $args = null)
    625625        {
     626            global $publishpress;
    626627
    627628            // Set up arguments
     
    649650                $selected = array();
    650651            }
     652
     653            $roles = get_editable_roles();
    651654            ?>
    652655
    653656            <?php if (!empty($users)) : ?>
    654             <ul class="<?php echo esc_attr($list_class) ?>">
    655                 <?php foreach ($users as $user) : ?>
    656                     <?php $checked = (in_array($user->ID, $selected)) ? 'checked="checked"' : '';
    657                     ?>
    658                     <li>
    659                         <label for="<?php echo esc_attr($input_id . '-' . $user->ID) ?>">
    660                             <input type="checkbox" id="<?php echo esc_attr($input_id . '-' . $user->ID) ?>"
    661                                    name="<?php echo esc_attr($input_id) ?>[]" value="<?php echo esc_attr($user->ID);
    662                             ?>" <?php echo $checked;
    663                             ?> />
    664                             <span class="pp-user_displayname"><?php echo esc_html($user->display_name);
    665                                 ?></span>
    666                             <span class="pp-user_useremail"><?php echo esc_html($user->user_email);
    667                                 ?></span>
    668                         </label>
    669                     </li>
    670                 <?php endforeach;
    671                 ?>
    672             </ul>
    673         <?php endif;
    674             ?>
     657                <select class="chosen-select" name="to_notify[]" multiple>
     658                    <?php if (!empty($roles)) : ?>
     659                        <optgroup label="<?php echo __('Roles', 'publishpress'); ?>">
     660                            <?php foreach ($roles as $role => $data) : ?>
     661                                <?php $attrSelected = (in_array($role, $selected)) ? 'selected="selected"' : ''; ?>
     662                                <option value="<?php echo $role; ?>" <?php echo $attrSelected; ?>><?php echo __('Role', 'publishpress'); ?>: <?php echo $data['name']; ?></option>
     663                            <?php endforeach; ?>
     664                        </optgroup>
     665                    <?php endif; ?>
     666                    <optgroup label="<?php echo __('Users', 'publishpress'); ?>">
     667                        <?php foreach ($users as $user) : ?>
     668                            <?php $attrSelected = (in_array($user->ID, $selected)) ? 'selected="selected"' : ''; ?>
     669                            <option value="<?php echo $user->ID; ?>" <?php echo $attrSelected; ?>><?php echo $user->display_name; ?></option>
     670                        <?php endforeach; ?>
     671                    </optgroup>
     672                </select>
     673            <?php endif; ?>
    675674            <?php
    676 
    677675        }
    678676
     
    686684        {
    687685
    688             PublishPress\Util::add_caps_to_role($role, $caps);
     686            PublishPress\Legacy\Util::add_caps_to_role($role, $caps);
    689687        }
    690688
  • publishpress/trunk/includes.php

    r1843103 r1843718  
    2929 */
    3030
    31 use PublishPress\Auto_loader;
     31use PublishPress\Legacy\Auto_loader;
    3232
    33 if (!defined('PP_LOADED'))
    34 {
     33if (!defined('PP_LOADED')) {
    3534    $settingsPage = add_query_arg(
    3635        array(
     
    4241
    4342    // Define contants
    44     define('PUBLISHPRESS_VERSION', '1.11.2');
    45     define('PUBLISHPRESS_ROOT', dirname(__FILE__));
    46     define('PUBLISHPRESS_FILE_PATH', PUBLISHPRESS_ROOT . '/' . basename(__FILE__));
     43    define('PUBLISHPRESS_VERSION', '1.11.3');
     44    define('PUBLISHPRESS_BASE_PATH', __DIR__);
     45    define('PUBLISHPRESS_FILE_PATH', PUBLISHPRESS_BASE_PATH . '/' . basename(__FILE__));
    4746    define('PUBLISHPRESS_URL', plugins_url('/', __FILE__));
    4847    define('PUBLISHPRESS_SETTINGS_PAGE', $settingsPage);
    49     define('PUBLISHPRESS_LIBRARIES_PATH', PUBLISHPRESS_ROOT . '/libraries');
     48    define('PUBLISHPRESS_LIBRARIES_PATH', PUBLISHPRESS_BASE_PATH . '/libraries');
     49
     50    /**
     51     * Use PUBLISHPRESS_BASE_PATH instead.
     52     *
     53     * @deprecated
     54     */
     55    define('PUBLISHPRESS_ROOT', PUBLISHPRESS_BASE_PATH);
    5056
    5157    // Define the Priority for the notification/notification_status_change method
    5258    // Added to allow users select a custom priority
    53     if (!defined('PP_NOTIFICATION_PRIORITY_STATUS_CHANGE'))
    54     {
     59    if (!defined('PP_NOTIFICATION_PRIORITY_STATUS_CHANGE')) {
    5560        define('PP_NOTIFICATION_PRIORITY_STATUS_CHANGE', 10);
    5661    }
    5762
    58     require_once PUBLISHPRESS_ROOT . '/vendor/autoload.php';
     63    if (file_exists(PUBLISHPRESS_BASE_PATH . '/vendor/autoload.php')) {
     64        require_once PUBLISHPRESS_BASE_PATH . '/vendor/autoload.php';
     65    }
    5966
    6067    // Register the autoloader
    61     if (!class_exists('\\PublishPress\\Auto_loader'))
    62     {
    63         require_once PUBLISHPRESS_LIBRARIES_PATH . '/Auto_loader.php';
     68    if (!class_exists('\\PublishPress\\Legacy\\Auto_loader')) {
     69        require_once PUBLISHPRESS_LIBRARIES_PATH . '/Legacy/Auto_loader.php';
    6470    }
    6571
    6672    // Register the library
    67     Auto_loader::register('\\PublishPress\\', PUBLISHPRESS_LIBRARIES_PATH);
     73    Auto_loader::register('\\PublishPress\\Legacy\\', PUBLISHPRESS_LIBRARIES_PATH . '/Legacy');
     74    Auto_loader::register('\\PublishPress\\Notifications\\', PUBLISHPRESS_LIBRARIES_PATH . '/Notifications');
     75
     76    require_once PUBLISHPRESS_BASE_PATH . '/deprecated.php';
    6877
    6978    define('PP_LOADED', 1);
  • publishpress/trunk/includes_notifications.php

    r1839780 r1843718  
    1010 */
    1111
    12 use PublishPress\Notifications\Auto_loader;
    13 
    1412defined('ABSPATH') or die('No direct script access allowed.');
    15 
    16 require_once 'vendor/autoload.php';
    1713
    1814if (!defined('PUBLISHPRESS_NOTIF_LOADED'))
    1915{
    2016    define('PUBLISHPRESS_NOTIF_MODULE_PATH', __DIR__ . '/modules/improved-notifications');
    21     define('PUBLISHPRESS_NOTIF_TWIG_PATH', PUBLISHPRESS_ROOT . '/twig');
     17    define('PUBLISHPRESS_NOTIF_TWIG_PATH', PUBLISHPRESS_BASE_PATH . '/twig');
    2218    define('PUBLISHPRESS_NOTIF_LOADED', 1);
    2319
  • publishpress/trunk/libraries/Notifications/Workflow/Controller.php

    r1839780 r1843718  
    139139            '\\PublishPress\\Notifications\\Workflow\\Step\\Receiver\\Author',
    140140            '\\PublishPress\\Notifications\\Workflow\\Step\\Receiver\\User',
    141             '\\PublishPress\\Notifications\\Workflow\\Step\\Receiver\\User_Group',
     141            '\\PublishPress\\Notifications\\Workflow\\Step\\Receiver\\Role',
    142142            '\\PublishPress\\Notifications\\Workflow\\Step\\Receiver\\Follower',
    143143        ];
  • publishpress/trunk/libraries/Notifications/Workflow/Step/Channel/Email.php

    r1839780 r1843718  
    4646        if (empty($receivers)) {
    4747            return;
     48        }
     49
     50        // Make sure we unserialize the content when it comes from async notifications.
     51        if (is_string($content)) {
     52            $content = maybe_unserialize($content);
    4853        }
    4954
  • publishpress/trunk/libraries/Notifications/Workflow/Step/Event/Filter/Base.php

    r1839780 r1843718  
    4141     *
    4242     * @return string
     43     *
     44     * @throws \Exception
    4345     */
    4446    public function render()
  • publishpress/trunk/libraries/Notifications/Workflow/Step/Event/Filter/Post_Status.php

    r1839780 r1843718  
    5050    {
    5151        $statuses = $this->get_post_statuses();
     52        $metadata = (array)$this->get_metadata('');
    5253        $options  = [];
    53         $metadata = (array)$this->get_metadata('');
     54
     55        if ('from' === $group) {
     56            // Add an status to represent new posts
     57            $options = [
     58                [
     59                    'value'    => 'auto-draft',
     60                    'label'    => __('"New"', 'publishpress'),
     61                    'selected' => in_array('auto-draft', $metadata[$group]),
     62                ],
     63            ];
     64        }
    5465
    5566        foreach ($statuses as $status)
  • publishpress/trunk/libraries/Notifications/Workflow/Step/Receiver/Follower.php

    r1839780 r1843718  
    4646        if ($this->is_selected($workflow->ID))
    4747        {
    48 
    4948            $post_id = $args['post']->ID;
    5049
     
    5655            $followers = array();
    5756
    58             if ($publishpress->improved_notifications->module_enabled('user_groups'))
    59             {
    60                 // Get following users and usergroups
    61                 $usergroups = $publishpress->notifications->get_following_usergroups($post_id, 'ids');
    6257
    63                 foreach ((array)$usergroups as $usergroup_id)
     58            // Check if we just created the post and the metadata is not saved yet.
     59            if ('POST' === $_SERVER['REQUEST_METHOD']
     60                && (isset($_POST['action']) && 'editpost' === $_POST['action'])
     61                && (isset($_POST['original_post_status']) && 'auto-draft' === $_POST['original_post_status'])
     62            ) {
     63                $toNotify = $_POST['to_notify'];
     64
     65                $roles = array();
     66                $users = array();
     67
     68                foreach ($toNotify as $item) {
     69                    if (is_numeric($item)) {
     70                        $users[] = $item;
     71                    } else {
     72                        $roles[] = $item;
     73                    }
     74                }
     75            } else {
     76                // Get following users and roles
     77                $roles = $publishpress->notifications->get_roles_to_notify($post_id, 'slugs');
     78                $users = $publishpress->notifications->get_users_to_notify($post_id, 'id');
     79            }
     80
     81            // Extract users from roles
     82            if (!empty($roles)) {
     83                foreach ($roles as $role)
    6484                {
    65                     $usergroup = $publishpress->user_groups->get_usergroup_by('id', $usergroup_id);
     85                    $roleUsers = get_users(
     86                        [
     87                            'role' => $role,
     88                        ]
     89                    );
    6690
    67                     foreach ((array)$usergroup->user_ids as $user_id)
    68                     {
    69                         $usergroup_user = get_user_by('id', $user_id);
    70 
    71                         if ($usergroup_user && is_user_member_of_blog($user_id))
     91                    if (!empty($roleUsers)) {
     92                        foreach ($roleUsers as $user)
    7293                        {
    73                             $followers[] = $usergroup_user;
     94                            if (is_user_member_of_blog($user->ID))
     95                            {
     96                                $followers[] = $user->ID;
     97                            }
    7498                        }
    7599                    }
     
    77101            }
    78102
    79             $users = $publishpress->notifications->get_following_users($post_id, 'object');
    80 
    81             // Merge usergroup users and users
     103            // Merge roles' users and users
    82104            $followers = array_merge($followers, $users);
    83105
    84106            // Process the recipients for this email to be sent
    85             foreach ($followers as $key => $user)
    86             {
     107            if (!empty($followers)) {
     108                foreach ($followers as $key => $user)
     109                {
     110                    // Make sure we have only user objects in the list
     111                    if (is_numeric($user)) {
     112                        $user = get_user_by('ID', $user);
     113                    }
    87114
    88                 // Don't send the email to the current user unless we've explicitly indicated they should receive it
    89                 if (false === apply_filters('pp_notification_email_current_user', false) && wp_get_current_user()->user_email == $user->user_email)
    90                 {
    91                     unset($followers[$key]);
     115                    // Don't send the email to the current user unless we've explicitly indicated they should receive it
     116                    if (false === apply_filters('publishpress_notify_current_user', false) && wp_get_current_user()->user_email == $user->user_email)
     117                    {
     118                        unset($followers[$key]);
     119                    }
    92120                }
    93121            }
     
    107135                foreach ($followers as $user)
    108136                {
    109                     $receivers[] = $user->ID;
     137                    if (is_object($user)) {
     138                        $receivers[] = $user->ID;
     139                    } else {
     140                        $receivers[] = $user;
     141                    }
    110142                }
    111143            }
  • publishpress/trunk/libraries/Notifications/Workflow/Step/Receiver/User.php

    r1839780 r1843718  
    112112        $template_context['list_class'] = 'publishpress_notif_user_list';
    113113        $template_context['input_name'] = 'publishpress_notif[receiver_user][]';
    114         $template_context['input_id']   = 'publishpress_notif_user_';
     114        $template_context['input_id']   = 'publishpress_notif_user_list';
    115115
    116116        $template_context = parent::filter_workflow_metabox_context($template_context);
     
    137137
    138138            // Get the users following the post
    139             $users     = $this->get_service('publishpress')->notifications->get_following_users($args['post']->ID, 'id');
     139            $users     = $this->get_service('publishpress')->notifications->get_users_to_notify($args['post']->ID, 'id');
    140140            $receivers = array_merge($receivers, $users);
    141141
  • publishpress/trunk/modules/addons/addons.php

    r1839780 r1843718  
    136136        protected function is_plugin_installed($plugin)
    137137        {
    138             return file_exists(plugin_dir_path(PUBLISHPRESS_ROOT) . "{$plugin}/{$plugin}.php");
     138            return file_exists(plugin_dir_path(PUBLISHPRESS_BASE_PATH) . "{$plugin}/{$plugin}.php");
    139139        }
    140140
  • publishpress/trunk/modules/async-notifications/async-notifications.php

    r1839780 r1843718  
    2929 */
    3030
    31 use PublishPress\Auto_loader;
     31use PublishPress\Legacy\Auto_loader;
    3232use PublishPress\Notifications\Traits\Dependency_Injector;
    3333use PublishPress\Notifications\Traits\PublishPress_Module;
     
    8989            $args['default_options'] = apply_filters('publishpress_async_notif_default_options', $args['default_options']);
    9090            $this->module            = $publishpress->register_module(
    91                 PublishPress\Util::sanitize_module_name($this->module_name),
     91                PublishPress\Legacy\Util::sanitize_module_name($this->module_name),
    9292                $args
    9393            );
     
    183183            ];
    184184            $receivers    = [$receiver];
     185
     186            // Decode the content
     187            $content = base64_decode(maybe_unserialize($content));
    185188
    186189            /**
  • publishpress/trunk/modules/async-notifications/library/Queue/WPCron.php

    r1843103 r1843718  
    5555        if (!empty($receivers))
    5656        {
    57             $data = [
    58                 'workflow_post_id' => $workflowPost->ID,
    59                 'action'           => $actionArgs['action'],
    60                 'post_id'          => $actionArgs['post']->ID,
    61                 'content'          => $content,
    62                 'old_status'       => isset($actionArgs['old_status']) ? $actionArgs['old_status'] : null,
    63                 'new_status'       => isset($actionArgs['new_status']) ? $actionArgs['new_status'] : null,
    64                 'channel'          => $channel,
     57            $baseData = [
     58                // workflow_post_id
     59                $workflowPost->ID,
     60                // action
     61                $actionArgs['action'],
     62                // post_id
     63                $actionArgs['post']->ID,
     64                // content
     65                base64_encode(maybe_serialize($content)),
     66                // old_status
     67                isset($actionArgs['old_status']) ? $actionArgs['old_status'] : null,
     68                // new_status
     69                isset($actionArgs['new_status']) ? $actionArgs['new_status'] : null,
     70                // channel
     71                $channel,
    6572            ];
    6673
     
    6875            foreach ($receivers as $receiver)
    6976            {
    70                 $data['receiver'] = $receiver;
     77                // Base data
     78                $data = $baseData;
     79
     80                // Receiver
     81                $data[] = $receiver;
    7182
    7283                $this->scheduleEvent($data);
  • publishpress/trunk/modules/calendar/calendar.php

    r1839780 r1843718  
    184184            $this->create_post_cap = apply_filters('pp_calendar_create_post_cap', 'edit_posts');
    185185
    186             require_once(PUBLISHPRESS_ROOT . '/common/php/' . 'screen-options.php');
     186            require_once(PUBLISHPRESS_BASE_PATH . '/common/php/' . 'screen-options.php');
    187187
    188188            add_action('admin_init', array($this, 'register_settings'));
  • publishpress/trunk/modules/calendar/lib/calendar.css

    r1839780 r1843718  
    614614    }
    615615}
     616
     617#publishpress-ics-copy .dashicons,
     618#publishpress-ics-download .dashicons {
     619    margin-top: 4px;
     620    margin-right: 2px;
     621}
     622
  • publishpress/trunk/modules/content-overview/content-overview.php

    r1839780 r1843718  
    147147        add_action('admin_init', array($this, 'handle_form_date_range_change'));
    148148
    149         include_once PUBLISHPRESS_ROOT . '/common/php/' . 'screen-options.php';
     149        include_once PUBLISHPRESS_BASE_PATH . '/common/php/' . 'screen-options.php';
    150150
    151151        if (function_exists('add_screen_options_panel'))
  • publishpress/trunk/modules/custom-status/custom-status.php

    r1839780 r1843718  
    216216        {
    217217            $default_terms = $this->get_default_terms();
     218            $roles         = ['administrator', 'author', 'editor', 'contributor'];
    218219
    219220            // Okay, now add the default statuses to the db if they don't already exist
     
    223224                {
    224225                    $this->add_custom_status($term['term'], $term['args']);
     226                }
     227            }
     228
     229            // Add basic capabilities for each post status
     230            $default_terms['publish'] = array();
     231            foreach ($default_terms as $termSlug => $data)
     232            {
     233                foreach ($roles as $roleName) {
     234                    $role = get_role($roleName);
     235                    $role->add_cap('status_change_' . str_replace('-', '_', $termSlug));
     236
     237                    if ('publish' === $termSlug) {
     238                        $role->add_cap('status_change_private');
     239                        $role->add_cap('status_change_future');
     240                    }
    225241                }
    226242            }
     
    927943            $this->custom_statuses_cache = array();
    928944
     945            // Set permissions for the base roles
     946            $roles = ['administrator', 'editor', 'author', 'contributor'];
     947            foreach ($roles as $roleSlug) {
     948                $role = get_role($roleSlug);
     949                if (!empty($role)) {
     950                    $role->add_cap('status_change_' . str_replace('-', '_', $slug));
     951                }
     952            }
     953
    929954            return $response;
    930955        }
  • publishpress/trunk/modules/dashboard/dashboard.php

    r1839780 r1843718  
    247247            global $publishpress;
    248248
    249             $myposts = $publishpress->notifications->get_user_following_posts();
     249            $myposts = $publishpress->notifications->get_user_to_notify_posts();
    250250
    251251            ?>
  • publishpress/trunk/modules/improved-notifications/assets/css/admin.css

    r1839780 r1843718  
    9393}
    9494
    95 #psppno-workflow-metabox-section-receiver #pp-post_following_users_box {
     95#psppno-workflow-metabox-section-receiver #pp_post_notify_users_box {
    9696    float: none;
    9797    margin-right: 0;
    9898}
    9999
    100 #psppno-workflow-metabox-section-receiver #pp-post_following_users_box,
     100#psppno-workflow-metabox-section-receiver #pp_post_notify_users_box,
    101101#psppno-workflow-metabox-section-receiver #pp-post_following_usergroups_box {
    102102    width: 100%;
     
    112112
    113113#psppno-workflow-metabox-section-receiver .publishpress_notif_user_list,
    114 #psppno-workflow-metabox-section-receiver .publishpress_notif_user_group_list {
     114#psppno-workflow-metabox-section-receiver .publishpress_notif_role_list {
    115115    margin-bottom: 9px;
    116116}
     
    168168}
    169169
    170 /* Branding for pages */
    171 body.post-type-psppnotif_workflow h1.wp-heading-inline:before {
    172     display: block;
    173     padding: 10px 0 10px 55px;
    174     background-image: url(../../../settings/lib/icon-128x128.png);
    175     background-size: 45px auto;
    176     background-position: left center;
    177     background-repeat: no-repeat;
    178     background-color: transparent;
    179     content: 'PublishPress';
    180     font-weight: bold;
    181     font-size: 26px;
    182     margin-bottom: 15px;
    183     margin-top: 8px;
    184     margin-left: 4px;
    185     margin-right: 0;
    186     padding-bottom: 10px;
    187     padding-left: 55px;
    188     padding-right: 0px;
    189     padding-top: 10px;
    190 }
    191 
    192170body.post-type-psppnotif_workflow #wpbody-content {
    193171    margin-bottom: 100px;
     
    211189    border-left: 8px solid #f3f3f3;
    212190}
     191
     192
     193.psppno_workflow_metabox_section_header.invalid {
     194    background-color: #ff8585 !important;
     195}
  • publishpress/trunk/modules/improved-notifications/assets/js/workflow_form.js

    r1839780 r1843718  
    4444        setupFieldFilters('event_content_category');
    4545        setupFieldFilters('user');
    46         setupFieldFilters('user_group');
     46        setupFieldFilters('role');
    4747
    4848        // List search
    49         // $('.publishpress-filter-checkbox-list ul').listFilterizer();
    5049        $('.publishpress-filter-checkbox-list select').multipleSelect({
    5150            filter: true
     
    5352
    5453        // Form validation
    55 
     54        $('form#post').on('submit', function (event) {
     55            var selected,
     56                sections = ['event', 'event_content'],
     57                messages = [];
     58
     59            /**
     60             * Set the validation status to the given section.
     61             *
     62             * @param section
     63             * @param status
     64             */
     65            function set_validation_status(section, status) {
     66                var selector = '#psppno-workflow-metabox-section-' + section + ' .psppno_workflow_metabox_section_header';
     67
     68                if (status) {
     69                    $(selector).removeClass('invalid');
     70                } else {
     71                    $(selector).addClass('invalid');
     72                }
     73            }
     74
     75            function set_tooltip(section) {
     76                var selector = '#psppno-workflow-metabox-section-' + section + ' .psppno_workflow_metabox_section_header';
     77
     78                $(selector).tooltip();
     79            }
     80
     81            // Check the Event and Event Content sections
     82            $.each(sections, function (index, section) {
     83                // Check if the "When" and "Which content" filter has at least one selected option.
     84                selected = $('[name="publishpress_notif[' + section + '][]"]:checked').length;
     85
     86                if (selected === 0) {
     87                    set_validation_status(section, false);
     88
     89                        messages.push(workflowFormData.messages['selectAllIn_' + section]);
     90                } else {
     91                    set_validation_status(section, true);
     92                }
     93            });
     94
     95            // Check if any status was selected for "moving to new status"
     96            if ($('#publishpress_notif_event_post_save:checked').length > 0) {
     97                if ($('#publishpress_notif_event_post_save_filters_post_status_from').val() == null
     98                    || $('#publishpress_notif_event_post_save_filters_post_status_to').val() == null) {
     99
     100                    set_validation_status('event', false);
     101
     102                    if ($('#publishpress_notif_event_post_save_filters_post_status_from').val() == null) {
     103                        messages.push(workflowFormData.messages['selectAPreviousStatus']);
     104                    }
     105
     106                    if ($('#publishpress_notif_event_post_save_filters_post_status_to').val() == null) {
     107                        messages.push(workflowFormData.messages['selectANewStatus']);
     108                    }
     109                } else {
     110                    set_validation_status('event', true);
     111                }
     112            }
     113
     114            // Check if any post type was selected (if checked)
     115            if ($('#publishpress_notif_event_content_post_type:checked').length > 0) {
     116                if ($('#publishpress_notif_event_content_post_type_filters_post_type').val() == null) {
     117                    set_validation_status('event_content', false);
     118
     119                    messages.push(workflowFormData.messages['selectPostType']);
     120                } else {
     121                    set_validation_status('event_content', true);
     122                }
     123            }
     124
     125            // Check if any category was selected (if checked)
     126            if ($('#publishpress_notif_event_content_category:checked').length > 0) {
     127                if ($('#publishpress_notif_event_content_category_filters_category').val() == null) {
     128                    set_validation_status('event_content', false);
     129
     130                    messages.push(workflowFormData.messages['selectCategory']);
     131                } else {
     132                    set_validation_status('event_content', true);
     133                }
     134            }
     135
     136            // Check the Receivers section
     137            if ($('#psppno-workflow-metabox-section-receiver input[type="checkbox"][name^="publishpress_notif"]:checked').length === 0) {
     138                set_validation_status('receiver', false);
     139
     140                messages.push(workflowFormData.messages['selectAReceiver']);
     141            } else {
     142                set_validation_status('receiver', true);
     143            }
     144
     145            // Check if any user was selected (if checked)
     146            if ($('#publishpress_notif_user:checked').length > 0) {
     147                if ($('#publishpress_notif_user_list').val() == null) {
     148                    set_validation_status('receiver', false);
     149
     150                    messages.push(workflowFormData.messages['selectAUser']);
     151                } else {
     152                    set_validation_status('receiver', true);
     153                }
     154            }
     155
     156            // Check if any role was selected (if checked)
     157            if ($('#publishpress_notif_role:checked').length > 0) {
     158                if ($('#publishpress_notif_roles').val() == null) {
     159                    set_validation_status('receiver', false);
     160
     161                    messages.push(workflowFormData.messages['selectARole']);
     162                } else {
     163                    set_validation_status('receiver', true);
     164                }
     165            }
     166
     167            // Check the Content section
     168            if ($('#publishpress_notification_content_main_subject').val().trim() == ''
     169                || tinymce.activeEditor.getContent().trim() === '') {
     170                set_validation_status('content', false);
     171
     172                if ($('#publishpress_notification_content_main_subject').val().trim() == '') {
     173                    messages.push(workflowFormData.messages['setASubject']);
     174                }
     175
     176                if (tinymce.activeEditor.getContent().trim() === '') {
     177                    messages.push(workflowFormData.messages['setABody']);
     178                }
     179            } else {
     180                set_validation_status('content', true);
     181            }
     182
     183            var valid = $('form#post .invalid').length === 0;
     184
     185            if (!valid) {
     186                if (messages.length > 0) {
     187                    $('#error_messages').remove();
     188                    var $messageBox = $('<div id="error_messages" class="notice notice-error"></div>');
     189                    $('.wp-header-end').after($messageBox);
     190
     191                    for (var i = 0; i < messages.length; i++) {
     192                        $element = $('<p>');
     193                        $element.text(messages[i]);
     194                        $messageBox.append($element);
     195                    }
     196                }
     197            } else {
     198                $('#error_messages').remove();
     199            }
     200
     201            return valid;
     202        });
    56203    });
    57204})(jQuery);
  • publishpress/trunk/modules/improved-notifications/improved-notifications.php

    r1839780 r1843718  
    103103            $args['default_options'] = apply_filters('publishpress_notif_default_options', $args['default_options']);
    104104            $this->module            = $publishpress->register_module(
    105                 PublishPress\Util::sanitize_module_name($this->module_name),
     105                PublishPress\Legacy\Util::sanitize_module_name($this->module_name),
    106106                $args
    107107            );
     
    362362                }
    363363            }
    364         }
     364
     365            if (version_compare($previous_version, '1.10', '<=')) {
     366                $this->migrate_legacy_metadata_for_role();
     367            }
     368        }
     369
     370        protected function migrate_legacy_metadata_for_role()
     371        {
     372            global $wpdb;
     373
     374            $query = "UPDATE {$wpdb->prefix}postmeta SET meta_key = '_psppno_torole' WHERE meta_key = '_psppno_togroup'";
     375            $wpdb->query($query);
     376
     377            $query = "UPDATE {$wpdb->prefix}postmeta SET meta_key = '_psppno_torolelist' WHERE meta_key = '_psppno_togrouplist'";
     378            $wpdb->query($query);
     379        }
     380
    365381
    366382        /**
     
    451467            if (in_array($hook_suffix, ['post.php', 'post-new.php']))
    452468            {
    453                 wp_enqueue_script('psppno-workflow-form', plugin_dir_url(__FILE__) . 'assets/js/workflow_form.js', [], PUBLISHPRESS_VERSION);
    454                 wp_enqueue_script('psppno-multiple-select', plugin_dir_url(__FILE__) . 'assets/js/multiple-select.js', [], PUBLISHPRESS_VERSION);
     469                wp_enqueue_script('psppno-multiple-select', plugin_dir_url(__FILE__) . 'assets/js/multiple-select.js', ['jquery'], PUBLISHPRESS_VERSION);
     470                wp_enqueue_script('psppno-workflow-tooltip', plugin_dir_url(__FILE__) . 'libs/opentip/downloads/opentip-jquery.js', ['jquery'], PUBLISHPRESS_VERSION);
     471                wp_enqueue_script('psppno-workflow-form', plugin_dir_url(__FILE__) . 'assets/js/workflow_form.js', ['jquery', 'psppno-workflow-tooltip', 'psppno-multiple-select'], PUBLISHPRESS_VERSION);
     472
     473                wp_localize_script(
     474                    'psppno-workflow-form',
     475                    'workflowFormData',
     476                    [
     477                        'messages' => [
     478                            'selectAllIn_event'         => 'Select at least one event.',
     479                            'selectAllIn_event_content' => 'Select at least a filter for the content.',
     480                            'selectAPreviousStatus'     => 'Select at least one previous status.',
     481                            'selectANewStatus'          => 'Select at least one new status.',
     482                            'selectPostType'            => 'Select at least one post type.',
     483                            'selectCategory'            => 'Select at least one category.',
     484                            'selectAReceiver'           => 'Select at least one receiver.',
     485                            'selectAUser'               => 'Select at least one user.',
     486                            'selectARole'               => 'Select at least one role.',
     487                            'setASubject'               => 'Type a subject for the notification.',
     488                            'setABody'                  => 'Type a body text for the notification.',
     489                        ],
     490                    ]
     491                );
    455492            }
    456493        }
     
    526563            $context = [
    527564                'id'     => 'event_content',
    528                 'header' => __('Filter the content?', 'publishpress'),
     565                'header' => __('For which content?', 'publishpress'),
    529566                'html'   => apply_filters('publishpress_notif_render_metabox_section_event_content', ''),
    530567                'class'  => 'pure-u-1-3 pure-u-sm-1 pure-u-md-1-2 pure-u-lg-1-3',
     
    571608            $context = [
    572609                'labels' => [
     610                    'validation_help'  => __('Select at least one option for each section.', 'publishpress'),
    573611                    'pre_text'         => __('You can add dynamic information to the Subject or Body text using the following shortcodes:', 'publishpress'),
    574612                    'content'          => __('Content', 'publishpress'),
     
    597635         * @param int     $id   Unique ID for the post being saved
    598636         * @param WP_Post $post Post object
     637         *
     638         * @return int|null
    599639         */
    600640        public function save_meta_boxes($id, $post)
  • publishpress/trunk/modules/notifications/assets/notifications.css

    r1839780 r1843718  
    77}
    88
    9 .pp-post_following_list {
     9.pp_post_notify_list {
    1010}
    1111
    12 .pp-post_following_list li {
     12.pp_post_notify_list li {
    1313    padding: 10px 5px 5px 5px;
    1414    margin: 0;
     
    1616}
    1717
    18 .pp-post_following_list li:hover {
     18.pp_post_notify_list li:hover {
    1919    background: #EAF2FA;
    2020}
    2121
    22 .pp-post_following_list li input {
     22.pp_post_notify_list li input {
    2323    float: right;
    2424}
    2525
    26 .pp-post_following_list .pp-user_displayname,
    27 .pp-post_following_list .pp-usergroup_name {
     26.pp_post_notify_list .pp-user_displayname,
     27.pp_post_notify_list .pp-usergroup_name {
    2828    display: block;
    2929    font-size: 14px;
    3030}
    3131
    32 .pp-post_following_list .pp-user_useremail,
    33 .pp-post_following_list .pp-usergroup_description {
     32.pp_post_notify_list .pp-user_useremail,
     33.pp_post_notify_list .pp-usergroup_description {
    3434    display: block;
    3535    color: #ccc;
     
    3737}
    3838
    39 #pp-post_following_box {
     39#pp_post_notify_box {
    4040    margin: 10px 0;
    4141}
    4242
    43 #pp-post_following_box h4 {
     43#pp_post_notify_box h4 {
    4444    background: #F1F1F1;
    4545    font-weight: bold;
     
    5050}
    5151
    52 #pp-post_following_box .error {
     52#pp_post_notify_box .error {
    5353    color: red;
    5454}
    5555
    56 #pp-post_following_box label.pp-select_all_box {
     56#pp_post_notify_box label.pp-select_all_box {
    5757    float: right;
    5858    margin: -20px 10px;
    5959}
    6060
    61 #pp-post_following_box label.pp-select_all_box input {
     61#pp_post_notify_box label.pp-select_all_box input {
    6262    margin-bottom: 5px;
    6363}
    64 
    65 #pp-post_following_users_box,
    66 #pp-post_following_usergroups_box {
    67     width: 49%;
    68 }
    69 
    70 #pp-post_following_users_box {
    71     float: left;
    72     margin-right: 10px;
    73 }
    74 
    75 #pp-post_following_usergroups_box {
    76     float: right;
    77 }
    78 
    79 #pp-post_following_users_box .pp-post_following_list,
    80 #pp-post_following_usergroups_box .pp-post_following_list {
    81     max-height: 300px !important;
    82     overflow: auto !important;
    83 }
    84 
    85 #pp-post_following_users_box .list-filterizer-tools,
    86 #pp-post_following_usergroups_box .list-filterizer-tools {
    87     margin-top: 5px;
    88 }
    89 
    90 /** User Groups **/
    91 #profile-page #post_following_usergroups {
    92     width: 300px;
    93 }
    94 
    95 #pp-usergroup-users form.quicksearch,
    96 #pp-post_following_users_box form.quicksearch {
    97     display: none;
    98 }
    99 
    100 #pp-usergroup-users h4 {
    101     margin-top: 0;
    102 }
  • publishpress/trunk/modules/notifications/assets/notifications.js

    r1839780 r1843718  
    1 jQuery(document).ready(function ($) {
    2     $('#pp-post_following_users_box ul').listFilterizer();
    3 
    4     var params = {
    5         action: 'save_notifications',
    6         post_id: $('#post_ID').val(),
    7     };
    8 
    9     $(document).on('click', '.pp-post_following_list li input:checkbox, .pp-following_usergroups li input:checkbox', function () {
    10         var user_group_ids = [];
    11         var parent_this = $(this);
    12         params.pp_notifications_name = $(this).attr('name');
    13         params._nonce = $("#pp_notifications_nonce").val();
    14 
    15         $(this)
    16             .parent()
    17             .parent()
    18             .parent()
    19             .find('input:checked')
    20             .map(function () {
    21                 user_group_ids.push($(this).val());
    22             })
    23 
    24         params.user_group_ids = user_group_ids;
    25 
    26         $.ajax({
    27             type: 'POST',
    28             url: (ajaxurl) ? ajaxurl : wpListL10n.url,
    29             data: params,
    30             success: function (x) {
    31                 var backgroundColor = parent_this.css('background-color');
    32                 $(parent_this.parent().parent())
    33                     .animate({'backgroundColor': '#CCEEBB'}, 200)
    34                     .animate({'backgroundColor': backgroundColor}, 200);
    35             },
    36             error: function (r) {
    37                 $('#pp-post_following_users_box').prev().append(' <p class="error">There was an error. Please reload the page.</p>');
    38             }
    39         });
     1jQuery(function ($) {
     2    $(".chosen-select").chosen({
     3        'width': '95%'
    404    });
    415});
  • publishpress/trunk/modules/roles/lib/list_table.php

    r1843103 r1843718  
    138138            $actions                       = array();
    139139            $actions['edit edit-role']     = sprintf('<a href="%1$s">' . __('Edit', 'publishpress') . '</a>', $publishpress->roles->getLink(array('action' => 'edit-role', 'role-id' => $role->name)));
    140             $actions['delete delete-role'] = sprintf('<a href="%1$s">' . __('Delete', 'publishpress') . '</a>', $publishpress->roles->getLink(array('action' => 'delete-role', 'role-id' => $role->name)));
     140
     141            if ('administrator' !== $role->name) {
     142                $actions['delete delete-role'] = sprintf('<a href="%1$s">' . __('Delete', 'publishpress') . '</a>', $publishpress->roles->getLink(array('action' => 'delete-role', 'role-id' => $role->name)));
     143            }
    141144
    142145            return $this->twig->render(
  • publishpress/trunk/modules/roles/roles.php

    r1843103 r1843718  
    162162        public function install()
    163163        {
     164            $this->addCapabilitiesToAdmin();
    164165            $this->scheduleUserGroupMigration();
    165166        }
     
    172173        public function upgrade($previous_version)
    173174        {
    174             if (version_compare($previous_version, '1.10.0', '<=')) {
     175            if (version_compare($previous_version, '1.11.3', '<')) {
    175176                $this->addCapabilitiesToAdmin();
    176177                $this->scheduleUserGroupMigration();
     
    243244            ?>
    244245            <div class="notice notice-warning is-dismissible">
    245                 <p><?php _e('PublishPress detected legacy data which needs to be migrated. This task should run in the background in the next minutes.', 'publishpress'); ?></p>
     246                <p><?php _e('PublishPress detected legacy data which needs to be migrated. This task should run in the background in the next few minutes.', 'publishpress'); ?></p>
    246247                </div>
    247248            <?php
     
    255256            ?>
    256257            <div class="notice notice-success is-dismissible">
    257                 <p><?php _e('PublishPress finished migrating the legacy data successfully.', 'publishpress'); ?></p>
     258                <p><?php _e('PublishPress finished migrating the legacy data.', 'publishpress'); ?></p>
    258259                </div>
    259260            <?php
     
    685686
    686687        /**
    687          *
     688         * @throws Exception
    688689         */
    689690        public function render_admin_page()
     
    765766                            'publishpress'),
    766767                        'users'                    => __("Users", 'publishpress'),
    767                         'users_description'        => __("Add users that belongs to this role.", 'publishpress'),
     768                        'users_description'        => __("Add users to this role.", 'publishpress'),
    768769                    ],
    769770                    'role'               => $role,
     
    890891            $name         = sanitize_title(strip_tags(trim($_POST['role-id'])));
    891892            $display_name = stripslashes(strip_tags(trim($_POST['display_name'])));
    892             $users        = $_POST['users'];
     893            $users        = isset($_POST['users']) ? $_POST['users'] : [];
    893894
    894895            $_REQUEST['form-errors'] = [];
     
    941942            if (!empty($users_in_the_role)) {
    942943                foreach ($users_in_the_role as $user) {
     944                    // Check if you not are trying to remove yourself from administrator, and block if so.
     945                    if ('administrator' === $name && $user->ID === get_current_user_id()) {
     946                        continue;
     947                    }
     948
    943949                    if (!in_array($user->ID, $users)) {
    944950                        $user->remove_role($name);
     
    986992            $name = sanitize_title(strip_tags(trim($_GET['role-id'])));
    987993
     994            // Avoid deleting administrator
     995            if ('administrator' === $name) {
     996                wp_die(__('You can\'t delete the administrator role.', 'publishpress'));
     997            }
     998
    988999            // Check if the role exists
    9891000            $role = get_role($name);
  • publishpress/trunk/modules/roles/twig/settings-tab-roles.twig.html

    r1843103 r1843718  
    4646                    <select data-placeholder="{{ labels.select_users }}" multiple class="chosen-select" name="users[]">
    4747                        {% for user in users %}
    48                             <option value="{{ user.id }}" {% if user.id in role_users %}selected{% endif %}>{{ user.display_name }}</option>
     48                            <option value="{{ user.ID }}" {% if user.ID in role_users %}selected{% endif %}>{{ user.display_name }}</option>
    4949                        {% endfor %}
    5050                    </select>
  • publishpress/trunk/modules/settings/settings.php

    r1839780 r1843718  
    165165            <div class="publishpress-admin pressshack-admin-wrapper wrap">
    166166                <header>
    167                     <h1 class="pressshack-title">
    168                         <a href="//wordpress.org/plugins/publishpress" target="_blank" rel="noopener noreferrer" title="PublishPress">
    169                             <?php _e('PublishPress', 'publishpress') ?>
    170                         </a>
    171                     </h1>
     167                    <h1 class="wp-heading-inline"><?php echo $current_module->title; ?></h1>
    172168
    173169                    <?php echo !empty($display_text) ? $display_text : ''; ?>
     
    344340
    345341            foreach ($_POST['publishpress_module_name'] as $moduleSlug) {
    346                 $module_name = sanitize_key( PublishPress\Util::sanitize_module_name( $moduleSlug ) );
     342                $module_name = sanitize_key( PublishPress\Legacy\Util::sanitize_module_name( $moduleSlug ) );
    347343
    348344                if ($_POST['action'] != 'update'
  • publishpress/trunk/modules/user-groups/lib/user-groups.css

    r1839780 r1843718  
    11/** Post subscriptions **/
    2 .pp-post_following_list {
     2.pp_post_notify_list {
    33}
    44
    5 .pp-post_following_list li {
     5.pp_post_notify_list li {
    66    padding: 10px 5px 5px 5px;
    77    margin: 0;
     
    99}
    1010
    11 .pp-post_following_list li:hover {
     11.pp_post_notify_list li:hover {
    1212    background: #EAF2FA;
    1313}
    1414
    15 .pp-post_following_list li input {
     15.pp_post_notify_list li input {
    1616    float: right;
    1717}
    1818
    19 .pp-post_following_list .pp-user_displayname,
    20 .pp-post_following_list .pp-usergroup_name {
     19.pp_post_notify_list .pp-user_displayname,
     20.pp_post_notify_list .pp-usergroup_name {
    2121    display: block;
    2222    font-size: 14px;
    2323}
    2424
    25 .pp-post_following_list .pp-user_useremail,
    26 .pp-post_following_list .pp-usergroup_description {
     25.pp_post_notify_list .pp-user_useremail,
     26.pp_post_notify_list .pp-usergroup_description {
    2727    display: block;
    2828    color: #ccc;
     
    3030}
    3131
    32 #pp-post_following_box {
     32#pp_post_notify_box {
    3333    margin: 10px 0;
    3434}
    3535
    36 #pp-post_following_box h4 {
     36#pp_post_notify_box h4 {
    3737    background: #F1F1F1;
    3838    font-weight: bold;
     
    4343}
    4444
    45 #pp-post_following_box label.pp-select_all_box {
     45#pp_post_notify_box label.pp-select_all_box {
    4646    float: right;
    4747    margin: -20px 10px;
    4848}
    4949
    50 #pp-post_following_box label.pp-select_all_box input {
     50#pp_post_notify_box label.pp-select_all_box input {
    5151    margin-bottom: 5px;
    5252}
    5353
    54 #pp-post_following_users_box,
    55 #pp-post_following_usergroups_box {
    56     width: 49%;
    57 }
    58 
    59 #pp-post_following_users_box {
    60     float: left;
    61     margin-right: 2%;
    62 }
    63 
    64 #pp-post_following_usergroups_box {
    65     float: right;
    66 }
    67 
    68 .pp-post_following_list {
     54.pp_post_notify_list {
    6955    max-height: 500px !important;
    7056    overflow: auto !important;
    7157    margin-bottom: 0;
    7258}
    73 
    74 #pp-post_following_users_box .list-filterizer-tools,
    75 #pp-post_following_usergroups_box .list-filterizer-tools {
    76     margin-top: 5px;
    77 }
    78 
    79 /** User Groups **/
    80 #profile-page #post_following_usergroups {
    81     width: 300px;
    82 }
    83 
    84 #pp-usergroup-users form.quicksearch,
    85 #pp-post_following_users_box form.quicksearch {
    86     display: none;
    87 }
    88 
    89 #pp-usergroup-users h4 {
    90     margin-top: 0;
    91 }
    92 
    93 .list-filterizer-tabs li {
    94     color: #655997;
    95 }
    96 
    97 .list-filterizer-tabs li.active,
    98 .list-filterizer-tabs li:hover {
    99     background: #655997;
    100     border-color: #655997;
    101     color: #fff;
    102 }
    103 
    104 @media (max-width: 767px) {
    105 
    106     #pp-post_following_usergroups_box,
    107     #pp-post_following_users_box {
    108         float: none;
    109         width: 100%;
    110     }
    111 
    112     #pp-post_following_users_box {
    113         margin-right: 0;
    114         margin-bottom: 20px;
    115     }
    116 }
  • publishpress/trunk/publishpress.php

    r1843103 r1843718  
    66 * Author: PublishPress
    77 * Author URI: https://publishpress.com
    8  * Version: 1.11.2
     8 * Version: 1.11.3
    99 * Text Domain: publishpress
    1010 * Domain Path: /languages
     
    137137        foreach ($roles as $role => $caps)
    138138        {
    139             PublishPress\Util::add_caps_to_role($role, $caps);
    140         }
    141 
    142         // User groups
     139            PublishPress\Legacy\Util::add_caps_to_role($role, $caps);
     140        }
     141
     142        // Additional capabilities
    143143        $roles = array(
    144             'administrator' => array('edit_usergroups'),
     144            'administrator' => array(apply_filters('pp_manage_roles_cap', 'pp_manage_roles')),
    145145        );
    146146
    147147        foreach ($roles as $role => $caps)
    148148        {
    149             PublishPress\Util::add_caps_to_role($role, $caps);
     149            PublishPress\Legacy\Util::add_caps_to_role($role, $caps);
    150150        }
    151151    }
     
    222222        if (!class_exists('PP_Module'))
    223223        {
    224             require_once(PUBLISHPRESS_ROOT . '/common/php/class-module.php');
     224            require_once(PUBLISHPRESS_BASE_PATH . '/common/php/class-module.php');
    225225        }
    226226
    227227        // Scan the modules directory and include any modules that exist there
    228         // $module_dirs = scandir(PUBLISHPRESS_ROOT . '/modules/');
     228        // $module_dirs = scandir(PUBLISHPRESS_BASE_PATH . '/modules/');
    229229        $default_module_dirs = array(
    230             'modules-settings'       => PUBLISHPRESS_ROOT,
    231             'calendar'               => PUBLISHPRESS_ROOT,
    232             'editorial-metadata'     => PUBLISHPRESS_ROOT,
    233             'notifications'          => PUBLISHPRESS_ROOT,
    234             'content-overview'       => PUBLISHPRESS_ROOT,
    235             'custom-status'          => PUBLISHPRESS_ROOT,
    236             'user-groups'            => PUBLISHPRESS_ROOT,
    237             'improved-notifications' => PUBLISHPRESS_ROOT,
    238             'async-notifications'    => PUBLISHPRESS_ROOT,
     230            'modules-settings'       => PUBLISHPRESS_BASE_PATH,
     231            'calendar'               => PUBLISHPRESS_BASE_PATH,
     232            'editorial-metadata'     => PUBLISHPRESS_BASE_PATH,
     233            'notifications'          => PUBLISHPRESS_BASE_PATH,
     234            'content-overview'       => PUBLISHPRESS_BASE_PATH,
     235            'custom-status'          => PUBLISHPRESS_BASE_PATH,
     236            'roles'                  => PUBLISHPRESS_BASE_PATH,
     237            'improved-notifications' => PUBLISHPRESS_BASE_PATH,
     238            'async-notifications'    => PUBLISHPRESS_BASE_PATH,
     239            'user-groups'            => PUBLISHPRESS_BASE_PATH,
    239240
    240241            // @TODO: Move for settings, and remove after cleanup
    241             'dashboard'              => PUBLISHPRESS_ROOT,
    242             'editorial-comments'     => PUBLISHPRESS_ROOT,
    243             'settings'               => PUBLISHPRESS_ROOT,
    244             'efmigration'            => PUBLISHPRESS_ROOT,
     242            'dashboard'              => PUBLISHPRESS_BASE_PATH,
     243            'editorial-comments'     => PUBLISHPRESS_BASE_PATH,
     244            'settings'               => PUBLISHPRESS_BASE_PATH,
     245            'efmigration'            => PUBLISHPRESS_BASE_PATH,
    245246        );
    246247
     
    249250
    250251        // Add add-ons as the last tab
    251         $module_dirs['addons'] = PUBLISHPRESS_ROOT;
     252        $module_dirs['addons'] = PUBLISHPRESS_BASE_PATH;
    252253
    253254        $class_names = array();
     
    280281
    281282        // Other utils
    282         require_once(PUBLISHPRESS_ROOT . '/common/php/util.php');
     283        require_once(PUBLISHPRESS_BASE_PATH . '/common/php/util.php');
    283284
    284285        // Instantiate all of our classes onto the PublishPress object
     
    288289            if (class_exists($class_name))
    289290            {
    290                 $slug        = PublishPress\Util::sanitize_module_name($slug);
     291                $slug        = PublishPress\Legacy\Util::sanitize_module_name($slug);
    291292                $this->$slug = new $class_name();
    292293            }
  • publishpress/trunk/readme.txt

    r1843103 r1843718  
    77Requires PHP: 5.4
    88Tested up to: 4.9.4
    9 Stable tag: 1.11.2
     9Stable tag: 1.11.3
    1010License: GPLv2 or later
    1111License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    133133The format is based on [Keep a Changelog](http://keepachangelog.com/)
    134134and this project adheres to [Semantic Versioning](http://semver.org/).
     135
     136= [1.11.3] - 2018-03-20 =
     137
     138*Fixed:*
     139
     140* Fixed roles editing form, denying to remove current user from the administrator role;
     141* Fixed error in the dashboard widget "My Content Notifications"
     142* Fixed default permissions for administrators for being able to see the Roles menu item;
     143
     144*Changed:*
     145
     146* Removed option to delete the administrator role;
     147* Improved some text;
    135148
    136149= [1.11.2] - 2018-03-19 =
  • publishpress/trunk/twig/workflow_help.twig

    r1839780 r1843718  
     1<p>{{ labels.validation_help }}</p>
    12<h3>Content</h3>
    23<p>{{ labels.pre_text }}</p>
  • publishpress/trunk/twig/workflow_metabox.twig

    r1839780 r1843718  
    11<div id="psppno-workflow-metabox" class="pure-g">
    2     <!-- Events -->
     2
     3    <!-- Events -->
    34    {{ section_event|raw }}
    45
  • publishpress/trunk/twig/workflow_receiver_user_field.twig

    r1839780 r1843718  
    77
    88    {% if users %}
    9         <select multiple="multiple" class="{{ list_class }}" name="{{ input_name }}">
     9        <select multiple="multiple" class="{{ list_class }}" name="{{ input_name }}" id="{{ input_id }}">
    1010            {% for user in users %}
    1111                <option value="{{ user.ID }}" {{ selected( user.selected, true ) }}>{{ user.display_name }}</option>
  • publishpress/trunk/vendor/composer/installed.json

    r1839664 r1843718  
    109109        "source": {
    110110            "type": "git",
    111             "url": "https://github.com/OSTraining/WordPress-Plugin-Builder.git",
     111            "url": "https://github.com/OSTraining/WordPress-Plugin-Builder",
    112112            "reference": "6658ad5e35ec32877ee941e3680702bfb86986e5"
    113113        },
    114         "dist": {
    115             "type": "zip",
    116             "url": "https://api.github.com/repos/OSTraining/WordPress-Plugin-Builder/zipball/6658ad5e35ec32877ee941e3680702bfb86986e5",
    117             "reference": "6658ad5e35ec32877ee941e3680702bfb86986e5",
    118             "shasum": ""
    119         },
    120114        "time": "2018-03-01T22:09:46+00:00",
    121115        "type": "library",
    122         "installation-source": "dist",
     116        "installation-source": "source",
    123117        "autoload": {
    124118            "psr-4": {
     
    136130            }
    137131        ],
    138         "description": "Base class for WordPress plugin builder",
    139         "support": {
    140             "source": "https://github.com/OSTraining/WordPress-Plugin-Builder/tree/2.1.4",
    141             "issues": "https://github.com/OSTraining/WordPress-Plugin-Builder/issues"
    142         }
     132        "description": "Base class for WordPress plugin builder"
    143133    },
    144134    {
Note: See TracChangeset for help on using the changeset viewer.