* @link https://www.tassos.gr * @copyright Copyright © 2024 Tassos All Rights Reserved * @license GNU GPLv3 or later */ namespace NRFramework\Library; defined('_JEXEC') or die; use Joomla\CMS\Language\Text; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Session\Session; use Joomla\CMS\Layout\LayoutHelper; use Joomla\CMS\Uri\Uri; class Library { /** * Library item info popup. * * @var string */ private $info_modal_id = 'tf-library-item-info-popup'; /** * Library preview popup. * * @var string */ private $preview_modal_id = 'tf-library-preview-popup'; /** * The library settings * * @var array */ public $library_settings = []; /** * Favorites. * * @var Faovirtes */ public $favorites; /** * Templates. * * @var Templates */ public $templates; public function __construct($library_settings = []) { $this->library_settings = $library_settings; $this->favorites = new Favorites($this); $this->templates = new Templates($this); } public function init() { $this->prepare(); // Enqueue media $this->register_media(); // Add library popups $this->add_library_popup(); $this->add_library_item_info_popup(); $this->add_library_preview_template_popup(); } /** * Prepares the Library. * * @return void */ private function prepare() { $this->library_settings['preview_url'] = TF_TEMPLATES_SITE_URL . '?template_preview=1&template=TEMPLATE_ID&project=' . $this->library_settings['project']; if (!$this->templates->hasFilters()) { $this->library_settings['class'] = 'no-sidebar'; } $this->prepareModal(); } /** * Adds the toolbar to the modal's header. * * @return void */ public function prepareModal() { // Upgrade to Pro Button if ($this->getLibrarySetting('project_license_type') === 'lite') { ?> addScriptDeclaration(' document.addEventListener("DOMContentLoaded", function() { /** * Main Templates Library Popup */ let mainPopup = document.querySelector("#' . $this->library_settings['id'] . '"); /** * Append Upgrade to Pro button to header */ let upgradeButton = document.querySelector(".tf-header-upgrade-button"); if (upgradeButton) { upgradeButton.removeAttribute("style"); mainPopup.querySelector(".modal-header").append(upgradeButton); } // Append actions let modalToolbar = document.querySelector(".tfTemplatesLibraryModalToolbar") modalToolbar.removeAttribute("style"); mainPopup.querySelector(".modal-header").append(modalToolbar); // Add class to library popup mainPopup.classList.add("tf-templates-library", "tf-templates-library-popup", "' . (defined('nrJ4') ? 'isJ4' : 'isJ3') . '"); /** * Info Templates Library Popup */ let infoPopup = document.querySelector("#' . $this->info_modal_id . '"); // Append actions modalToolbar = document.querySelector(".tfInfoTemplatesLibraryModalToolbar") modalToolbar.removeAttribute("style"); infoPopup.querySelector(".modal-header").append(modalToolbar); // Add class to info popup infoPopup.classList.add("tf-templates-library-item-info", "tf-templates-library-popup", "' . (defined('nrJ4') ? 'isJ4' : 'isJ3') . '"); /** * Preview Templates Library Popup */ let previewPopup = document.querySelector("#' . $this->preview_modal_id . '"); // Append toolbar on the left side of the header modalToolbar = document.querySelector(".tfPreviewTemplatesLibraryModalToolbarLeft").cloneNode(true); modalToolbar.removeAttribute("style"); previewPopup.querySelector(".modal-header").insertBefore(modalToolbar, previewPopup.querySelector(".modal-header").firstChild); // Append responsive icons on the center of the header modalToolbar = document.querySelector(".tfPreviewTemplatesLibraryModalToolbarCenter").cloneNode(true); modalToolbar.removeAttribute("style"); previewPopup.querySelector(".modal-header").append(modalToolbar); // Append actions modalToolbar = document.querySelector(".tfPreviewTemplatesLibraryModalToolbar") modalToolbar.removeAttribute("style"); previewPopup.querySelector(".modal-header").append(modalToolbar); // Add class to preview popup previewPopup.classList.add("tf-templates-library-popup-preview", "tf-templates-library-popup", "' . (defined('nrJ4') ? 'isJ4' : 'isJ3') . '"); }); '); } /** * Adds admin media * * @return void */ public function register_media() { // Templates Library CSS HTMLHelper::stylesheet('plg_system_nrframework/tf_templates_library.css', ['relative' => true, 'version' => 'auto']); // Templates Library JS HTMLHelper::script('plg_system_nrframework/tf_templates_library.js', ['relative' => true, 'version' => 'auto']); // Add Javascript options $doc = Factory::getDocument(); $options = $doc->getScriptOptions('tassos_framework'); $options = is_array($options) ? $options : []; $options = [ 'project_name' => $this->library_settings['project_name'], 'pro' => Text::_('NR_PRO'), 'lite' => Text::_('NR_LITE'), 'license_key' => Text::_('NR_LICENSE_KEY'), 'license' => $this->library_settings['license_key'], 'install_extension' => TEXT::_('NR_INSTALL_EXTENSION'), 'update_extension' => TEXT::_('NR_UPDATE_EXTENSION'), 'templates_library_ajax_url' => Uri::base() . '?option=com_ajax&format=raw&plugin=nrframework&task=TemplatesLibrary', 'csrf_token' => Session::getFormToken() ]; $doc->addScriptOptions('tassos_framework', $options); } /** * Adds the popup at the footer of the page. Appears when you click the "New" / "Add New" button. * * @return void */ public function add_library_popup() { $payload = [ 'title' => $this->library_settings['title'], 'closeButton' => false, 'backdrop' => 'static' ]; $content = LayoutHelper::render('library/tmpl', $this->library_settings, JPATH_PLUGINS . '/system/nrframework/layouts'); echo HTMLHelper::_('bootstrap.renderModal', $this->library_settings['id'], $payload, $content); } /** * Adds the popup that displays the info for each template. * * @return void */ public function add_library_item_info_popup() { $info_payload = [ 'category_label' => $this->library_settings['main_category_label'] ]; $content = LayoutHelper::render('library/info_popup', $info_payload, JPATH_PLUGINS . '/system/nrframework/layouts'); $payload = [ 'title' => 'Template Title', 'closeButton' => false, 'backdrop' => 'static' ]; echo HTMLHelper::_('bootstrap.renderModal', $this->info_modal_id, $payload, $content); } /** * Adds the popup at that allows us to preview a template. * * @return void */ public function add_library_preview_template_popup() { $content = LayoutHelper::render('library/preview', [], JPATH_PLUGINS . '/system/nrframework/layouts'); $payload = [ 'title' => 'Template Title', 'closeButton' => false, 'backdrop' => 'static' ]; echo HTMLHelper::_('bootstrap.renderModal', $this->preview_modal_id, $payload, $content); } /** * Return templates folder path * * @return string */ public function getTemplatesPath() { $component = isset($this->library_settings['component']) ? $this->library_settings['component'] : 'com_rstbox'; return JPATH_ROOT . '/media/' . $component . '/templates/'; } /** * Returns the Framework Plugin URL. * * @return string */ public function getNRFrameworkPluginURL() { return Uri::base() . 'index.php?option=com_plugins&task=plugin.edit&extension_id=' . \NRFramework\Extension::getID('nrframework', 'plugin', 'system'); } /** * Returns a library settings value. * * @param string $key * @param string $default * * @return string */ public function getLibrarySetting($key, $default = '') { return isset($this->library_settings[$key]) ? $this->library_settings[$key] : $default; } /** * Sets a library settings value. * * @param string $key * @param mixed $value * * @return string */ public function setLibrarySetting($key, $value) { $this->library_settings[$key] = $value; } /** * Returns the refresh icon. * * @return string */ public function getRefreshIcon() { return ' '; } }