0cb24b4759
access.xml: 12 component-specific actions added: - mokosuitecross.crosspost (auto cross-post on publish) - mokosuitecross.crosspost.manual (manually create posts) - mokosuitecross.delete.remote (delete from remote platforms) - mokosuitecross.services.manage (create/edit/delete services) - mokosuitecross.services.credentials (view decrypted credentials) - mokosuitecross.templates.manage (create/edit/delete templates) - mokosuitecross.logs.view (view activity logs) - mokosuitecross.logs.purge (purge old logs) - mokosuitecross.queue.manage (manage post queue) - mokosuitecross.queue.export (export posts as CSV) - mokosuitecross.dispatch (trigger REST API dispatch) - mokosuitecross.migrate (run Perfect Publisher migration) config.xml: permissions fieldset with rules field for admin UI. Enforcement: - DisplayController: core.manage gate on all views - ServicesController: publish/delete ACL checks - TemplatesController: publish/delete ACL checks - PostsController: queue.export permission - ServiceController: services.manage for test connection - DispatchController: dispatch permission for REST API - All list views: preferences button gated by core.admin - All edit views: save/apply buttons gated by section permission - MokoSuiteCrossHelper::getActions() centralizes ACL lookups
85 lines
2.7 KiB
PHP
85 lines
2.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @package MokoSuiteCross
|
|
* @subpackage com_mokosuitecross
|
|
* @author Moko Consulting <hello@mokoconsulting.tech>
|
|
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
|
|
* @license GNU General Public License version 3 or later; see LICENSE
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
|
|
namespace Joomla\Component\MokoSuiteCross\Administrator\View\Posts;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
|
|
use Joomla\CMS\Router\Route;
|
|
use Joomla\CMS\Toolbar\Toolbar;
|
|
use Joomla\CMS\Toolbar\ToolbarHelper;
|
|
use Joomla\Component\MokoSuiteCross\Administrator\Helper\MokoSuiteCrossHelper;
|
|
|
|
class HtmlView extends BaseHtmlView
|
|
{
|
|
protected $items;
|
|
protected $pagination;
|
|
protected $state;
|
|
public $filterForm;
|
|
public $activeFilters;
|
|
public $sidebar;
|
|
|
|
public function display($tpl = null): void
|
|
{
|
|
$this->items = $this->get('Items');
|
|
$this->pagination = $this->get('Pagination');
|
|
$this->state = $this->get('State');
|
|
$this->filterForm = $this->get('FilterForm');
|
|
$this->activeFilters = $this->get('ActiveFilters');
|
|
|
|
$this->addToolbar();
|
|
|
|
parent::display($tpl);
|
|
}
|
|
|
|
protected function addToolbar(): void
|
|
{
|
|
$canDo = MokoSuiteCrossHelper::getActions();
|
|
|
|
ToolbarHelper::title('MokoSuiteCross — Post Queue', 'share-alt');
|
|
ToolbarHelper::addNew('post.add');
|
|
|
|
$toolbar = Toolbar::getInstance('toolbar');
|
|
$toolbar->standardButton('retry', 'COM_MOKOSUITECROSS_TOOLBAR_RETRY_FAILED', 'posts.retryFailed')
|
|
->icon('icon-refresh')
|
|
->listCheck(false);
|
|
$toolbar->standardButton('purge', 'COM_MOKOSUITECROSS_TOOLBAR_PURGE_POSTED', 'posts.purgePosted')
|
|
->icon('icon-trash')
|
|
->listCheck(false);
|
|
|
|
$toolbar->standardButton('retry-selected', 'COM_MOKOSUITECROSS_TOOLBAR_RETRY_SELECTED', 'posts.retrySelected')
|
|
->icon('icon-redo')
|
|
->listCheck(true);
|
|
$toolbar->standardButton('schedule', 'COM_MOKOSUITECROSS_TOOLBAR_SCHEDULE', 'posts.schedule')
|
|
->icon('icon-calendar')
|
|
->listCheck(true);
|
|
|
|
ToolbarHelper::deleteList('', 'posts.delete', 'JTOOLBAR_DELETE');
|
|
|
|
// Export CSV button
|
|
$toolbar->appendButton(
|
|
'Link',
|
|
'download',
|
|
'COM_MOKOSUITECROSS_EXPORT_CSV',
|
|
Route::_('index.php?option=com_mokosuitecross&task=posts.exportCsv&format=raw', false)
|
|
);
|
|
|
|
// Dashboard link in toolbar
|
|
$toolbar->appendButton(
|
|
'Link',
|
|
'home',
|
|
'COM_MOKOSUITECROSS_SUBMENU_DASHBOARD',
|
|
Route::_('index.php?option=com_mokosuitecross&view=dashboard', false)
|
|
);
|
|
}
|
|
}
|