/home/arranoyd/telegastro/wp-content/plugins/restrict-user-access/list-capabilities.php
<?php
/**
 * @package Restrict User Access
 * @author Joachim Jensen <joachim@dev.institute>
 * @license GPLv3
 * @copyright 2020 by Joachim Jensen
 */

defined('ABSPATH') || exit;

if (! class_exists('WP_List_Table')) {
    require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}

final class RUA_Capabilities_List extends WP_List_Table
{
    public function __construct()
    {
        parent::__construct(array(
            'singular' => __('Capability', 'restrict-user-access'),
            'plural'   => __('Capabilities', 'restrict-user-access'),
            'ajax'     => false,
            'screen'   => RUA_App::TYPE_RESTRICT.'_caps'
        ));
    }

    /**
     * Text for no caps
     *
     * @since  0.8
     * @return void
     */
    public function no_items()
    {
        _e('No capabilities found.', 'restrict-user-access');
    }

    /**
     * Table columns with titles
     *
     * @since  0.8
     * @return array
     */
    public function get_columns()
    {
        return array(
            'name'   => __('Capability'),
            'permit' => __('Permit').$this->get_sum_label(1),
            'deny'   => __('Deny').$this->get_sum_label(0),
            'unset'  => __('Unset').$this->get_sum_label(-1)
        );
    }

    private function get_sum_label($type)
    {
        return ' <span class="hide-if-no-js">(<span class="sum-'.$type.'">0</span>)</span>';
    }

    /**
     * Columns to make sortable.
     *
     * @since  0.8
     * @return array
     */
    public function get_sortable_columns()
    {
        return array();
    }

    /**
     * Primary column used for responsive view
     *
     * @since  0.8
     * @return string
     */
    protected function get_default_primary_column_name()
    {
        return 'name';
    }

    /**
     * Default fallback for column render
     *
     * @since  0.8
     * @param  WP_User  $item
     * @param  string  $column_name
     * @return mixed
     */
    protected function column_default($item, $column_name)
    {
        switch ($column_name) {
            default:
                return print_r($item, true);
        }
    }

    /**
     * Render name column
     *
     * @since  0.8
     * @param  string  $name
     * @return string
     */
    protected function column_name($name)
    {
        return '<strong>'.$name.'</strong>';
    }


    /**
     * Render permit column
     *
     * @since  0.8
     * @param  string  $user
     * @return string
     */
    protected function column_permit($name)
    {
        return $this->_column_cap($name, 1);
    }

    /**
     * Render deny column
     *
     * @since  0.8
     * @param  string  $name
     * @return string
     */
    protected function column_deny($name)
    {
        return $this->_column_cap($name, 0);
    }

    protected function column_unset($name)
    {
        return $this->_column_cap($name, -1);
    }

    /**
     * Helper function for cap checkbox
     *
     * @since  0.8
     * @param  string  $name
     * @param  int     $value
     * @return string
     */
    protected function _column_cap($name, $value)
    {
        $metadata = RUA_App::instance()->level_manager->metadata()->get('caps')->get_data(get_the_ID());
        $checked_value = -1;
        $parent_input = '';
        $parent_value = $this->get_inherited_cap($name);

        if (!is_null($parent_value)) {
            $checked_value = $parent_value;
            if ($checked_value == $value) {
                $parent_input = '<input type="hidden" name="inherited_caps['.$name.']" value="'.$checked_value.'">';
            }
        }
        if (isset($metadata[$name])) {
            $checked_value = $metadata[$name];
        }

        return $parent_input.sprintf(
            '<input class="rua-cb" type="radio" id="cap-%1$s-%2$d" name="caps[%1$s]" value="%2$d" %3$s/><label class="rua-cb-label rua-cb-label-%2$d" for="cap-%1$s-%2$d"></label>',
            $name,
            $value,
            checked($checked_value, $value, false)
        );
    }

    protected $caps;

    /**
     * @param string $name
     *
     * @return int|null
     */
    protected function get_inherited_cap($name)
    {
        if (is_null($this->caps)) {
            $level_ids = array_reverse(get_post_ancestors(get_the_ID()));
            $this->caps = array();
            foreach ($level_ids as $level) {
                $this->caps = array_merge(
                    $this->caps,
                    RUA_App::instance()->level_manager->metadata()->get('caps')->get_data($level, true)
                );
            }
        }
        return isset($this->caps[$name]) ? (int)$this->caps[$name] : null;
    }

    /**
     * Bulk actions
     *
     * @since  0.8
     * @return array
     */
    public function get_bulk_actions()
    {
        return array();
    }

    /**
     * Generate the table navigation above or below the table
     *
     * @since 0.8
     * @param string $which
     */
    public function display_tablenav($which)
    {
        ?>
<div class="tablenav <?php echo esc_attr($which); ?>">

    <?php if ($this->has_items()): ?>
    <div class="alignleft actions bulkactions">
        <?php $this->bulk_actions($which); ?>
    </div>
    <?php endif;
        $this->extra_tablenav($which);
        $this->pagination($which); ?>

    <br class="clear" />
</div>
<?php
    }

    /**
     * Render column headers
     *
     * @since  0.8
     * @param  boolean $with_id
     * @return void
     */
    public function print_column_headers($with_id = true)
    {
        parent::print_column_headers($with_id);
        if ($with_id) {
            $sep = '</tr><tr>';

            $sum_columns = array(
                'deny'   => 0,
                'permit' => 1,
                'unset'  => -1,
            );

            //backwards compat
            if (method_exists(get_parent_class($this), 'get_default_primary_column_name')) {
                list($columns, $hidden, $sortable, $primary) = $this->get_column_info();
            } else {
                list($columns, $hidden, $sortable) = $this->get_column_info();
                $primary = '';
            }

            echo $sep;
            foreach ($columns as $column_key => $column_display) {
                $class = array( 'manage-column', "column-$column_key" );

                if (in_array($column_key, $hidden)) {
                    $class[] = 'hidden';
                }

                if (isset($sum_columns[$column_key])) {
                    $sum = '<input class="rua-cb js-rua-cb-all" type="radio" value="'.$sum_columns[$column_key].'"/>';
                }

                if ($column_key === $primary) {
                    $class[] = 'column-primary';
                }

                $tag = 'th';
                $scope = 'scope="col"';

                if ($column_key == 'name') {
                    $sum = __('Select All');
                }

                if (!empty($class)) {
                    $class = "class='" . implode(' ', $class) . "'";
                }

                echo "<$tag $scope $class>$sum</$tag>";
            }
        }
    }

    /**
     * Get data and set pagination
     *
     * @since  0.8
     * @return void
     */
    public function prepare_items()
    {
        $this->_column_headers = $this->get_column_info();

        $capabilities = $this->get_capabilities();
        $per_page = $this->get_items_per_page('caps_per_page', count($capabilities));
        $current_page = $this->get_pagenum();
        $total_items = $per_page;

        //sometimes interferes with pagination of other tables on same page
        // $this->set_pagination_args(array(
        //     'total_items' => $total_items,
        //     'total_pages' => 1,
        //     'per_page'    => $per_page
        // ));
        $this->items = $capabilities;
    }

    public function get_capabilities()
    {
        global $wp_roles;

        $capabilities = array();
        foreach ($wp_roles->role_objects as $role) {
            if (is_array($role->capabilities)) {
                foreach ($role->capabilities as $cap => $v) {
                    $capabilities[$cap] = $cap;
                }
            }
        }

        /**
         * There seems to be consensus among plugin authors
         * to use this filter
         *
         * @see {@link https://wordpress.org/plugins/members/}
         */
        $capabilities = apply_filters('members_get_capabilities', array_values($capabilities));

        //$capabilities[] = RUA_App::CAPABILITY;
        $capabilities = array_flip($capabilities);

        foreach ($this->get_hidden_capabilities() as $cap) {
            unset($capabilities[$cap]);
        }

        return array_keys($capabilities);
    }

    /**
     * @return array
     */
    public function get_hidden_capabilities()
    {
        return array(
            'level_0',
            'level_1',
            'level_2',
            'level_3',
            'level_4',
            'level_5',
            'level_6',
            'level_7',
            'level_8',
            'level_9',
            'level_10'
        );
    }
}