356 lines
14 KiB
PHP
356 lines
14 KiB
PHP
<?php
|
|
|
|
namespace BitApps\FM\Views;
|
|
|
|
use BitApps\FM\Config;
|
|
|
|
use function BitApps\FM\Functions\view;
|
|
|
|
use BitApps\FM\Plugin;
|
|
|
|
use BitApps\WPKit\Hooks\Hooks;
|
|
|
|
use BitApps\WPKit\Utils\Capabilities;
|
|
|
|
/**
|
|
* The admin Layout and page handler class.
|
|
*/
|
|
class Admin
|
|
{
|
|
private $_reviewBlock;
|
|
|
|
public function __construct()
|
|
{
|
|
Hooks::addAction('in_admin_header', [$this, 'removeAdminNotices']);
|
|
Hooks::addAction('admin_menu', [$this, 'sideBarMenuItem']);
|
|
Hooks::addAction('admin_notices', [$this, 'adminNotice']);
|
|
Hooks::addFilter(Config::withPrefix('localized_script'), [$this, 'filterConfigVariable']);
|
|
Hooks::addFilter('script_loader_tag', [$this, 'filterScriptTag'], 0, 3);
|
|
|
|
/*
|
|
* // For testing --
|
|
* Hooks::addFilter('can_access_fm_home', [$this, 'filterCapabilityForHomeMenu']);
|
|
*/
|
|
}
|
|
|
|
/**
|
|
* Register the admin left sidebar menu item.
|
|
*/
|
|
public function sideBarMenuItem()
|
|
{
|
|
$menus = Hooks::applyFilter(Config::withPrefix('admin_sidebar_menu'), $this->sideBarMenus());
|
|
global $submenu;
|
|
foreach ($menus as $menu) {
|
|
if (isset($menu['capability']) && Capabilities::check($menu['capability'])) {
|
|
if ($menu['type'] == 'menu') {
|
|
add_menu_page(
|
|
$menu['title'],
|
|
$menu['name'],
|
|
$menu['capability'],
|
|
$menu['slug'],
|
|
$menu['callback'],
|
|
$menu['icon'],
|
|
$menu['position']
|
|
);
|
|
} elseif (isset($menu['callback'])) {
|
|
add_submenu_page(
|
|
$menu['parent'],
|
|
$menu['title'],
|
|
$menu['name'],
|
|
$menu['capability'],
|
|
$menu['slug'],
|
|
$menu['callback']
|
|
);
|
|
} else {
|
|
$submenu[$menu['parent']][] = [
|
|
$menu['name'],
|
|
$menu['capability'],
|
|
'admin.php?page=' . $menu['slug'],
|
|
];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public function removeAdminNotices()
|
|
{
|
|
// phpcs:disable
|
|
global $plugin_page, $wp_filter;
|
|
if (empty($plugin_page) || strpos($plugin_page, Config::SLUG) === false) {
|
|
return;
|
|
}
|
|
// phpcs:enable
|
|
remove_all_actions('admin_notices');
|
|
remove_all_actions('all_admin_notices');
|
|
|
|
$this->adminNotice();
|
|
}
|
|
|
|
public function filterConfigVariable($config)
|
|
{
|
|
if (Capabilities::check('list_users')) {
|
|
$config['users'] = Plugin::instance()->permissions()->allUsers();
|
|
}
|
|
|
|
if (Capabilities::check('install_plugins')) {
|
|
$config['sys_info'] = $this->getSystemInfo();
|
|
}
|
|
|
|
if ($adBanner = Config::adBanner()) {
|
|
$config['adBanner'] = $adBanner;
|
|
}
|
|
|
|
return (array) $config + [
|
|
'nonce' => wp_create_nonce(Config::withPrefix('nonce')),
|
|
'baseURL' => Config::get('ADMIN_URL') . 'admin.php?page=' . Config::SLUG . '#elf_l1_Lw/',
|
|
'pluginSlug' => Config::SLUG,
|
|
'rootURL' => Config::get('ROOT_URI'),
|
|
'assetsURL' => Config::get('ASSET_URI'),
|
|
'routePrefix' => Config::VAR_PREFIX,
|
|
'plugin_dir' => BFM_ROOT_DIR,
|
|
'plugin_url' => BFM_ROOT_URL,
|
|
'action' => Config::withPrefix('connector'),
|
|
'options' => Plugin::instance()->preferences()->finderOptions(),
|
|
];
|
|
}
|
|
|
|
public function enqueueAssets()
|
|
{
|
|
$preferences = Plugin::instance()->preferences();
|
|
|
|
wp_enqueue_style('bfm-jquery-ui-css');
|
|
if (\in_array($preferences->getTheme(), ['default', 'bootstrap'])) {
|
|
wp_enqueue_style(Config::SLUG . 'elfinder-css');
|
|
wp_enqueue_style(Config::SLUG . 'theme-css');
|
|
}
|
|
|
|
wp_enqueue_script(Config::SLUG . 'elfinder-script');
|
|
wp_enqueue_script(Config::SLUG . 'elfinder-editor-script');
|
|
wp_enqueue_script(Config::SLUG . 'elfinder-lang', $preferences->getLangUrl(), [Config::SLUG . 'elfinder-script']);
|
|
|
|
if (Config::isDev()) {
|
|
$port = file_get_contents(Config::get('BASEDIR') . '/port');
|
|
$devUrl = 'http://localhost:' . $port;
|
|
wp_enqueue_script(
|
|
Config::SLUG . '-MODULE-vite-client-helper',
|
|
$devUrl . '/config/devHotModule.js',
|
|
[],
|
|
null
|
|
);
|
|
wp_enqueue_script(Config::SLUG . '-MODULE-vite-client', $devUrl . '/@vite/client', [], null);
|
|
wp_enqueue_script(Config::SLUG . '-MODULE-index', $devUrl . '/main.tsx', [], null);
|
|
} else {
|
|
wp_enqueue_script(
|
|
Config::SLUG . '-MODULE-main',
|
|
Config::get('ASSET_JS_URI') . '/main.' . Config::VERSION . '.js',
|
|
[Config::SLUG . 'elfinder-script'],
|
|
Config::VERSION
|
|
);
|
|
|
|
wp_enqueue_style(
|
|
Config::SLUG . '-style-main',
|
|
Config::get('ASSET_JS_URI') . '/main.' . Config::VERSION . '.css'
|
|
);
|
|
}
|
|
}
|
|
|
|
public function dashboard()
|
|
{
|
|
$this->enqueueAssets();
|
|
// phpcs:ignore
|
|
echo "<div id='bit-fm-root'></div>";
|
|
}
|
|
|
|
public function homePage()
|
|
{
|
|
return view('admin.index');
|
|
}
|
|
|
|
public function settingsPage()
|
|
{
|
|
return view('admin.settings');
|
|
}
|
|
|
|
public function logsPage()
|
|
{
|
|
return view('admin.logs');
|
|
}
|
|
|
|
public function systemInfoPage()
|
|
{
|
|
return view('admin.utility');
|
|
}
|
|
|
|
public function permissionsPage()
|
|
{
|
|
return view('admin.permission_system');
|
|
}
|
|
|
|
/**
|
|
* Adds admin notices to the admin page
|
|
*
|
|
* @return void
|
|
* */
|
|
public function adminNotice()
|
|
{
|
|
// DISALLOW_FILE_EDIT Macro checking
|
|
if (\defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT) {
|
|
?>
|
|
<div class='update-nag fm-error notice notice-success is-dismissible'>
|
|
<b>DISALLOW_FILE_EDIT</b> <?php esc_html_e('is set to', 'file-manager'); ?>
|
|
<b>TRUE</b>.
|
|
<?php esc_html_e('You will not be able to edit files with', 'file-manager'); ?>
|
|
<a href='admin.php?page=file-manager#/settings'>Bit File Manager</a>.
|
|
<?php esc_html_e('Please set', 'file-manager'); ?>
|
|
<b>DISALLOW_FILE_EDIT</b> <?php esc_html_e('to', 'file-manager'); ?>
|
|
<b>FALSE</b>
|
|
</div>
|
|
<style>
|
|
.fm-error {
|
|
border-left: 4px solid red;
|
|
display: block;
|
|
}
|
|
</style>
|
|
<?php
|
|
}
|
|
}
|
|
|
|
public function filterCapabilityForHomeMenu()
|
|
{
|
|
if (Plugin::instance()->permissions()->isCurrentUserHasPermission()
|
|
|| Plugin::instance()->permissions()->isCurrentRoleHasPermission()
|
|
) {
|
|
return Plugin::instance()->permissions()->currentUserRole();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Modify script tags.
|
|
*
|
|
* @param string $html script tag
|
|
* @param mixed $handle
|
|
* @param mixed $href
|
|
*
|
|
* @return string new script tag
|
|
*/
|
|
public function filterScriptTag($html, $handle)
|
|
{
|
|
$newTag = $html;
|
|
if (str_contains($handle, Config::SLUG . '-MODULE')) {
|
|
$newTag = preg_replace('/<script /', '<script type="module" ', $newTag);
|
|
}
|
|
|
|
return $newTag;
|
|
}
|
|
|
|
private function getSystemInfo()
|
|
{
|
|
return [
|
|
'currentMediaDir' => esc_url(wp_upload_dir()['path']),
|
|
'phpVersion' => esc_html(PHP_VERSION),
|
|
'iniPath' => esc_html(php_ini_loaded_file()),
|
|
'uploadMaxFilesize' => esc_html(\ini_get('upload_max_filesize')),
|
|
'postMaxSize' => esc_html(\ini_get('post_max_size')),
|
|
'memoryLimit' => esc_html(\ini_get('memory_limit')),
|
|
'maxExecutionTime' => esc_html(\ini_get('max_execution_time')),
|
|
'ua' => esc_html($_SERVER['HTTP_USER_AGENT']),
|
|
'fileEditNotAllowed' => \defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Provides menus for wordpress admin sidebar.
|
|
* should return an array of menus with the following structure:
|
|
* [
|
|
* 'type' => menu | submenu,
|
|
* 'name' => 'Name of menu will shown in sidebar',
|
|
* 'capability' => 'capability required to access menu',
|
|
* 'slug' => 'slug of menu after ?page=',.
|
|
*
|
|
* 'title' => 'page title will be shown in browser title if type is menu',
|
|
* 'callback' => 'function to call when menu is clicked',
|
|
* 'icon' => 'icon to display in menu if menu type is menu',
|
|
* 'position' => 'position of menu in sidebar if menu type is menu',
|
|
*
|
|
* 'parent' => 'parent slug if submenu'
|
|
* ]
|
|
*
|
|
* @return array<string,array{type:string,title:string,name:string,slug:string,callback:callable}>
|
|
*/
|
|
private function sideBarMenus()
|
|
{
|
|
return [
|
|
'Bit File Manager' => [
|
|
'type' => 'menu',
|
|
'title' => __('Dashboard | Bit File Manager', 'file-manager'),
|
|
'name' => __('Bit File Manager', 'file-manager'),
|
|
'capability' => Hooks::applyFilter('can_access_fm_home', 'manage_options'),// fm_capabilities
|
|
'slug' => Config::SLUG,
|
|
'callback' => [$this, 'dashboard'],
|
|
'icon' => 'data:image/svg+xml;base64,' . base64_encode('<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 34 30"><g fill="#606060"><path d="M13.54 24.53a7.39 7.39 0 0 1-3.34-9.42Zm5.64.54a7.46 7.46 0 0 1-2.18.32 7.16 7.16 0 0 1-2.28-.39L17 19Z"/><path d="M20.53 14c0 .78 2.28 1.87 1 5.37l-1 2.73L18 14.63h1v-.72h-4.54v.72h1l1.15 3.26-1.49 4.25-2.66-7.51h1v-.72h-2.61a7.4 7.4 0 0 1 11.22-1.28H22A1.42 1.42 0 0 0 20.53 14Zm3.86 4a7.4 7.4 0 0 1-3.92 6.53L23 17.41a7.4 7.4 0 0 0 .25-.7l.11-.32a5.41 5.41 0 0 0 .09-2 7.38 7.38 0 0 1 .94 3.61Z"/><path d="M32.82.76H18.64a1 1 0 0 0-.83.46l-1.6 2.5-2.32 3.9a1 1 0 0 1-.89.48H1.19a1 1 0 0 0-1 1v15c0 2.86 1.82 5.17 4 5.17h25.52c2.23 0 4-2.32 4-5.18l.06-22.32a1 1 0 0 0-.95-1.01ZM17 26.21A8.21 8.21 0 1 1 25.21 18 8.22 8.22 0 0 1 17 26.21Z"/><path d="M20.53 14c0 .78 2.28 1.87 1 5.37l-1 2.73L18 14.63h1v-.72h-4.54v.72h1l1.15 3.26-1.49 4.25-2.66-7.51h1v-.72h-2.61a7.4 7.4 0 0 1 11.22-1.28H22A1.42 1.42 0 0 0 20.53 14Zm-6.99 10.53a7.39 7.39 0 0 1-3.34-9.42ZM24.39 18a7.4 7.4 0 0 1-3.92 6.53L23 17.41a7.4 7.4 0 0 0 .25-.7l.11-.32a5.41 5.41 0 0 0 .09-2 7.38 7.38 0 0 1 .94 3.61Z"/><path d="M19.18 25.07a7.46 7.46 0 0 1-2.18.32 7.16 7.16 0 0 1-2.28-.39L17 19Z"/><path d="M23.24 11.76a8.83 8.83 0 1 0-12.48 12.49 8.83 8.83 0 1 0 12.48-12.49ZM17 26.21A8.21 8.21 0 1 1 25.21 18 8.22 8.22 0 0 1 17 26.21Z"/></g></svg>'),
|
|
'position' => '2',
|
|
],
|
|
'Home' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'title' => __('Dashboard | Bit File Manager', 'file-manager'),
|
|
'name' => __('Home', 'file-manager'),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_access_home', 'manage_options'),
|
|
'slug' => Config::SLUG . '#elf_l1_Lw/',
|
|
'position' => '2',
|
|
],
|
|
'Logs' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'name' => 'Logs',
|
|
'title' => __('Logs | Bit File Manager', 'file-manager'),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_access_logs', 'install_plugins'),
|
|
'slug' => Config::SLUG . '#/logs',
|
|
],
|
|
'Settings' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'name' => 'Settings',
|
|
'title' => __('Settings | Bit File Manager', 'file-manager'),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_change_settings', 'install_plugins'),
|
|
'slug' => Config::SLUG . '#/settings',
|
|
],
|
|
'Permissions' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'name' => 'Permissions',
|
|
'title' => __(
|
|
'Permissions - Sets permission for specific user or by user role | Bit File Manager',
|
|
'file-manager'
|
|
),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_change_permissions', 'install_plugins'),
|
|
'slug' => Config::SLUG . '#/permissions',
|
|
],
|
|
'Support' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'name' => 'Support',
|
|
'title' => __(
|
|
'Support | Bit File Manager',
|
|
'file-manager'
|
|
),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_access_home', 'manage_options'),
|
|
'slug' => Config::SLUG . '#/support',
|
|
],
|
|
'System Information' => [
|
|
'parent' => Config::SLUG,
|
|
'type' => 'submenu',
|
|
'name' => 'System Information',
|
|
'title' => __(
|
|
'System Information | Bit File Manager',
|
|
'file-manager'
|
|
),
|
|
'capability' => Hooks::applyFilter('bitapps_fm_can_view_sys_info', 'install_plugins'),
|
|
'slug' => Config::SLUG . '#/system-info',
|
|
],
|
|
];
|
|
}
|
|
}
|