fix(minify): keyword regex + remove JoomGallery overrides #121
@@ -9,7 +9,7 @@
|
||||
<display-name>Template - MokoOnyx</display-name>
|
||||
<org>MokoConsulting</org>
|
||||
<description>MokoOnyx - Joomla site template (successor to MokoCassiopeia)</description>
|
||||
<version>02.18.00</version>
|
||||
<version>02.18.03</version>
|
||||
<license spdx="GPL-3.0-or-later">GNU General Public License v3</license>
|
||||
</identity>
|
||||
<governance>
|
||||
|
||||
@@ -131,6 +131,19 @@ jobs:
|
||||
git config --local user.name "gitea-actions[bot]"
|
||||
git remote set-url origin "https://x-access-token:${{ secrets.MOKOGITEA_TOKEN }}@git.mokoconsulting.tech/${{ github.repository }}.git"
|
||||
|
||||
- name: Check for merge conflict markers
|
||||
run: |
|
||||
CONFLICTS=$(grep -rn '<<<<<<< \|>>>>>>> \|^=======$' --include='*.php' --include='*.xml' --include='*.css' --include='*.js' --include='*.json' --include='*.md' --include='*.yml' --include='*.yaml' --include='*.ini' --include='*.txt' . 2>/dev/null | grep -v '.git/' || true)
|
||||
if [ -n "$CONFLICTS" ]; then
|
||||
echo "::error::Merge conflict markers found — aborting release"
|
||||
echo "## Release Blocked: Conflict Markers" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
echo "$CONFLICTS" >> $GITHUB_STEP_SUMMARY
|
||||
echo '```' >> $GITHUB_STEP_SUMMARY
|
||||
exit 1
|
||||
fi
|
||||
echo "No conflict markers found"
|
||||
|
||||
- name: Setup moko-platform tools
|
||||
env:
|
||||
MOKO_CLONE_TOKEN: ${{ secrets.MOKOGITEA_TOKEN }}
|
||||
|
||||
@@ -5,17 +5,7 @@
|
||||
# FILE INFORMATION
|
||||
# DEFGROUP: Gitea.Workflow
|
||||
# INGROUP: moko-platform.Automation
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
# VERSION: 02.18.00
|
||||
=======
|
||||
# VERSION: 02.18.00
|
||||
=======
|
||||
# VERSION: 02.18.00
|
||||
=======
|
||||
# VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
# VERSION: 02.18.03
|
||||
# BRIEF: Auto-create feature branch when an issue is opened
|
||||
|
||||
name: "Universal: Issue Branch"
|
||||
|
||||
+2
-26
@@ -8,42 +8,18 @@
|
||||
DEFGROUP: Joomla.Template.Site
|
||||
INGROUP: MokoOnyx.Documentation
|
||||
PATH: ./CHANGELOG.md
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
VERSION: 02.18.00
|
||||
VERSION: 02.18.03
|
||||
BRIEF: Changelog file documenting version history of MokoOnyx
|
||||
-->
|
||||
|
||||
# Changelog — MokoOnyx (VERSION: 02.18.00)
|
||||
# Changelog — MokoOnyx (VERSION: 02.18.03)
|
||||
## [Unreleased]
|
||||
|
||||
## [02.18.00] --- 2026-06-02
|
||||
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
BRIEF: Changelog file documenting version history of MokoOnyx
|
||||
-->
|
||||
|
||||
# Changelog — MokoOnyx (VERSION: 02.18.00)
|
||||
>>>>>>> origin/main
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
BRIEF: Changelog file documenting version history of MokoOnyx
|
||||
-->
|
||||
|
||||
# Changelog — MokoOnyx (VERSION: 02.18.00)
|
||||
>>>>>>> origin/main
|
||||
## [02.17.00] --- 2026-06-02
|
||||
|
||||
## [02.15.00] --- 2026-05-30
|
||||
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
BRIEF: Changelog file documenting version history of MokoOnyx
|
||||
-->
|
||||
|
||||
# Changelog — MokoOnyx (VERSION: 02.18.00)
|
||||
>>>>>>> origin/main
|
||||
## [02.14.00] --- 2026-05-30
|
||||
|
||||
## [02.13.00] --- 2026-05-30
|
||||
|
||||
+1
-11
@@ -10,17 +10,7 @@
|
||||
INGROUP: MokoOnyx.Governance
|
||||
REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
FILE: SECURITY.md
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
VERSION: 02.18.00
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
=======
|
||||
VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
VERSION: 02.18.03
|
||||
BRIEF: Security policy and vulnerability reporting process for MokoOnyx.
|
||||
PATH: /SECURITY.md
|
||||
NOTE: This policy is process oriented and does not replace secure engineering practices.
|
||||
|
||||
@@ -161,7 +161,7 @@ class MokoMinifyHelper
|
||||
$js = preg_replace('/\s*([{}();,=+\-*\/<>!&|?:])\s*/', '$1', $js);
|
||||
|
||||
// Restore necessary spaces (after keywords)
|
||||
$js = preg_replace('/(var|let|const|return|typeof|instanceof|new|delete|throw|case|in|of)([^\s;})><=!&|?:,])/', '$1 $2', $js);
|
||||
$js = preg_replace('/\b(var|let|const|return|typeof|instanceof|new|delete|throw|case|in|of)\b([^\s;})><=!&|?:,])/', '$1 $2', $js);
|
||||
|
||||
return trim($js);
|
||||
}
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
*
|
||||
* This file is part of a Moko Consulting project.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: MokoOnyx.Override
|
||||
* INGROUP: MokoOnyx
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /html/com_joomgallery/category/default.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* BRIEF: Category view override — password gate then loads default_cat sub-layout
|
||||
*/
|
||||
|
||||
// No direct access
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
|
||||
// Import CSS & JS
|
||||
$wa = $this->document->getWebAssetManager();
|
||||
$wa->useStyle('com_joomgallery.site');
|
||||
$wa->useStyle('com_joomgallery.jg-icon-font');
|
||||
?>
|
||||
|
||||
<?php if ($this->item->pw_protected) : ?>
|
||||
<div class="com-joomgallery-category--locked">
|
||||
<form action="<?php echo Route::_('index.php?task=category.unlock&catid=' . $this->item->id); ?>" method="post" class="row g-3 align-items-end" autocomplete="off">
|
||||
<div class="col-12">
|
||||
<h3><i class="jg-icon-lock me-2" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_CATEGORY_PASSWORD_PROTECTED'); ?></h3>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<label for="jg_password" class="form-label"><?php echo Text::_('JGLOBAL_PASSWORD'); ?></label>
|
||||
<input type="password" name="password" id="jg_password" class="form-control" required />
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-primary" id="jg_unlock_button">
|
||||
<i class="jg-icon-unlock me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_CATEGORY_BUTTON_UNLOCK'); ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php echo HTMLHelper::_('form.token'); ?>
|
||||
</form>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<?php echo $this->loadTemplate('cat'); ?>
|
||||
<?php endif; ?>
|
||||
@@ -1,229 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
*
|
||||
* This file is part of a Moko Consulting project.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: MokoOnyx.Override
|
||||
* INGROUP: MokoOnyx
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /html/com_joomgallery/category/default_cat.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* BRIEF: Category sub-layout — subcategories grid + images grid with pagination
|
||||
*/
|
||||
|
||||
// No direct access
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Session\Session;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
use Joomgallery\Component\Joomgallery\Administrator\Helper\JoomHelper;
|
||||
|
||||
// Image params
|
||||
$image_type = $this->params['configs']->get('jg_category_view_type_image', 'thumbnail', 'STRING');
|
||||
$gallery_class = $this->params['configs']->get('jg_category_view_class', 'masonry', 'STRING');
|
||||
$num_columns = $this->params['configs']->get('jg_category_view_num_columns', 3, 'INT');
|
||||
$image_class = $this->params['configs']->get('jg_category_view_image_class', 0, 'INT');
|
||||
$justified_height = $this->params['configs']->get('jg_category_view_justified_height', 200, 'INT');
|
||||
$justified_gap = $this->params['configs']->get('jg_category_view_justified_gap', 5, 'INT');
|
||||
$image_link = $this->params['configs']->get('jg_category_view_image_link', 'defaultview', 'STRING');
|
||||
$lightbox_image = $this->params['configs']->get('jg_category_view_lightbox_image', 'detail', 'STRING');
|
||||
$pagination_type = $this->params['configs']->get('jg_category_view_pagination', 0, 'INT');
|
||||
$show_subcategories = $this->params['configs']->get('jg_category_view_subcategories', 1, 'INT');
|
||||
$subcategory_type_image = $this->params['configs']->get('jg_category_view_type_subcategory_image', 'thumbnail', 'STRING');
|
||||
$num_columns_subcats = $this->params['configs']->get('jg_category_view_subcategories_num_columns', 3, 'INT');
|
||||
|
||||
// Import CSS & JS
|
||||
$wa = $this->document->getWebAssetManager();
|
||||
|
||||
if ($gallery_class == 'masonry') {
|
||||
$wa->useScript('com_joomgallery.masonry');
|
||||
}
|
||||
|
||||
if ($gallery_class == 'justified') {
|
||||
$wa->useScript('com_joomgallery.justified');
|
||||
$wa->addInlineStyle('.jg-images[class*=" justified-"] .jg-image-caption-hover { right: ' . $justified_gap . 'px; }');
|
||||
}
|
||||
|
||||
$lightbox = false;
|
||||
if ($image_link == 'lightgallery') {
|
||||
$lightbox = true;
|
||||
$wa->useScript('com_joomgallery.lightgallery');
|
||||
$wa->useScript('com_joomgallery.lg-thumbnail');
|
||||
$wa->useStyle('com_joomgallery.lightgallery-bundle');
|
||||
}
|
||||
|
||||
// Initialise the grid script
|
||||
$iniJS = 'window.joomGrid = {';
|
||||
$iniJS .= ' itemid: ' . $this->item->id . ',';
|
||||
$iniJS .= ' pagination: ' . $pagination_type . ',';
|
||||
$iniJS .= ' layout: "' . $gallery_class . '",';
|
||||
$iniJS .= ' num_columns: ' . $num_columns . ',';
|
||||
$iniJS .= ' lightbox: ' . ($lightbox ? 'true' : 'false') . ',';
|
||||
$iniJS .= ' justified: {height: ' . $justified_height . ', gap: ' . $justified_gap . '}';
|
||||
$iniJS .= '};';
|
||||
|
||||
$wa->addInlineScript($iniJS, ['position' => 'before'], [], ['com_joomgallery.joomgrid']);
|
||||
$wa->useScript('com_joomgallery.joomgrid');
|
||||
|
||||
// Access check
|
||||
$canEdit = $this->getAcl()->checkACL('edit', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true);
|
||||
$canAdd = $this->getAcl()->checkACL('add', 'com_joomgallery.image', 0, $this->item->id, true);
|
||||
$canDelete = $this->getAcl()->checkACL('delete', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true);
|
||||
$canCheckin = $this->getAcl()->checkACL('editstate', 'com_joomgallery.category', $this->item->id, $this->item->parent_id, true) || $this->item->checked_out == Factory::getUser()->id;
|
||||
$returnURL = base64_encode(JoomHelper::getViewRoute('category', $this->item->id, $this->item->parent_id, $this->item->language, $this->getLayout()));
|
||||
|
||||
$hasSubcats = $show_subcategories && !empty($this->item->children->items) && count($this->item->children->items) > 0;
|
||||
$hasImages = !empty($this->item->images->items) && count($this->item->images->items) > 0;
|
||||
?>
|
||||
|
||||
<div class="com-joomgallery-category" itemscope itemtype="https://schema.org/ImageGallery">
|
||||
<?php // Page heading ?>
|
||||
<?php if ($this->params['menu']->get('show_page_heading')) : ?>
|
||||
<div class="page-header">
|
||||
<h1><?php echo $this->escape($this->params['menu']->get('page_heading')); ?></h1>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Category title ?>
|
||||
<h2 itemprop="name"><?php echo $this->escape($this->item->title); ?></h2>
|
||||
|
||||
<?php // Category description ?>
|
||||
<?php if (!empty($this->item->description)) : ?>
|
||||
<div class="com-joomgallery-category__description mb-3" itemprop="description">
|
||||
<?php echo $this->item->description; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Admin buttons ?>
|
||||
<?php if ($canEdit || $canCheckin || $canAdd || $canDelete) : ?>
|
||||
<div class="com-joomgallery-category__actions btn-toolbar mb-3" role="toolbar" aria-label="<?php echo Text::_('JTOOLBAR'); ?>">
|
||||
<?php if ($canCheckin && $this->item->checked_out > 0) : ?>
|
||||
<a class="btn btn-outline-secondary btn-sm me-2" href="<?php echo Route::_('index.php?option=com_joomgallery&task=category.checkin&id=' . $this->item->id . '&return=' . $returnURL . '&' . Session::getFormToken() . '=1'); ?>">
|
||||
<i class="jg-icon-checkin me-1" aria-hidden="true"></i><?php echo Text::_('JLIB_HTML_CHECKIN'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canEdit) : ?>
|
||||
<a class="btn btn-outline-primary btn-sm me-2<?php echo ($this->item->checked_out > 0) ? ' disabled' : ''; ?>" href="<?php echo Route::_('index.php?option=com_joomgallery&task=category.edit&id=' . $this->item->id . '&return=' . $returnURL); ?>">
|
||||
<i class="jg-icon-edit me-1" aria-hidden="true"></i><?php echo Text::_('JGLOBAL_EDIT'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canAdd) : ?>
|
||||
<a class="btn btn-outline-success btn-sm me-2<?php echo ($this->item->checked_out > 0) ? ' disabled' : ''; ?>" href="<?php echo Route::_('index.php?option=com_joomgallery&task=image.add&catid=' . $this->item->id . '&return=' . $returnURL); ?>">
|
||||
<i class="jg-icon-upload me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_IMG_UPLOAD_IMAGE'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canDelete) : ?>
|
||||
<a class="btn btn-outline-danger btn-sm<?php echo ($this->item->checked_out > 0) ? ' disabled' : ''; ?>" href="#deleteCatModal" role="button" data-bs-toggle="modal">
|
||||
<i class="jg-icon-delete me-1" aria-hidden="true"></i><?php echo Text::_('JACTION_DELETE'); ?>
|
||||
</a>
|
||||
<?php echo HTMLHelper::_(
|
||||
'bootstrap.renderModal',
|
||||
'deleteCatModal',
|
||||
[
|
||||
'title' => Text::_('JACTION_DELETE'),
|
||||
'modalWidth' => '50',
|
||||
'bodyHeight' => '100',
|
||||
'footer' => '<button class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JCANCEL') . '</button>'
|
||||
. '<a href="' . Route::_('index.php?option=com_joomgallery&task=category.remove&id=' . $this->item->id . '&return=' . $returnURL . '&' . Session::getFormToken() . '=1', false, 2) . '" class="btn btn-danger">' . Text::_('JACTION_DELETE') . '</a>',
|
||||
],
|
||||
Text::_('COM_JOOMGALLERY_COMMON_ALERT_SURE_DELETE_SELECTED_ITEM')
|
||||
); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Subcategories ?>
|
||||
<?php if ($hasSubcats) : ?>
|
||||
<section class="com-joomgallery-category__subcategories mb-4" aria-label="<?php echo Text::_('COM_JOOMGALLERY_SUBCATEGORIES'); ?>">
|
||||
<h3><?php echo Text::_('COM_JOOMGALLERY_SUBCATEGORIES'); ?></h3>
|
||||
<?php
|
||||
$catsData = [
|
||||
'id' => (int) $this->item->id,
|
||||
'items' => $this->item->children->items,
|
||||
'num_columns' => (int) $num_columns_subcats,
|
||||
'image_type' => $subcategory_type_image,
|
||||
];
|
||||
echo LayoutHelper::render('joomgallery.grids.categories', $catsData);
|
||||
?>
|
||||
</section>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Images ?>
|
||||
<?php if ($hasImages) : ?>
|
||||
<section class="com-joomgallery-category__images" aria-label="<?php echo Text::_('COM_JOOMGALLERY_IMAGES'); ?>">
|
||||
<?php if ($hasSubcats) : ?>
|
||||
<h3><?php echo Text::_('COM_JOOMGALLERY_IMAGES'); ?></h3>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php
|
||||
$imgsData = [
|
||||
'id' => (int) $this->item->id,
|
||||
'layout' => $gallery_class,
|
||||
'items' => $this->item->images->items,
|
||||
'num_columns' => (int) $num_columns,
|
||||
'caption_align' => 'center',
|
||||
'image_class' => $image_class,
|
||||
'image_type' => $image_type,
|
||||
'lightbox_type' => $lightbox_image,
|
||||
'image_link' => $image_link,
|
||||
'image_title' => false,
|
||||
'title_link' => 'defaultview',
|
||||
'image_desc' => false,
|
||||
'image_date' => false,
|
||||
'image_author' => false,
|
||||
'image_tags' => false,
|
||||
];
|
||||
echo LayoutHelper::render('joomgallery.grids.images', $imgsData);
|
||||
?>
|
||||
|
||||
<?php // Pagination ?>
|
||||
<nav class="mt-4" aria-label="<?php echo Text::_('JLIB_HTML_PAGINATION'); ?>">
|
||||
<?php echo $this->item->images->pagination->getListFooter(); ?>
|
||||
</nav>
|
||||
</section>
|
||||
<?php elseif (!$hasSubcats) : ?>
|
||||
<div class="alert alert-info" role="alert">
|
||||
<p class="mb-0"><?php echo Text::_('COM_JOOMGALLERY_GALLERY_NO_IMAGES'); ?></p>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Back to parent category ?>
|
||||
<?php if ($this->item->parent_id > 0 && $this->item->parent_id != 1) : ?>
|
||||
<div class="mt-4">
|
||||
<a class="btn btn-outline-secondary" href="<?php echo Route::_('index.php?option=com_joomgallery&view=category&id=' . (int) $this->item->parent_id); ?>">
|
||||
<i class="jg-icon-arrow-left-alt me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_BACK'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<script>
|
||||
if (window.joomGrid.layout != 'justified') {
|
||||
document.querySelectorAll('.' + window.joomGrid.imgclass).forEach(function(image) {
|
||||
image.addEventListener('load', function() {
|
||||
this.closest('.' + window.joomGrid.imgboxclass).classList.add('loaded');
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,148 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
*
|
||||
* This file is part of a Moko Consulting project.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: MokoOnyx.Override
|
||||
* INGROUP: MokoOnyx
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /html/com_joomgallery/gallery/default.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* BRIEF: Gallery view override — main image grid with masonry/justified layout
|
||||
*/
|
||||
|
||||
// No direct access
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Layout\LayoutHelper;
|
||||
|
||||
// Image params
|
||||
$image_type = $this->params['configs']->get('jg_gallery_view_type_image', 'thumbnail', 'STRING');
|
||||
$gallery_class = $this->params['configs']->get('jg_gallery_view_class', 'masonry', 'STRING');
|
||||
$num_columns = $this->params['configs']->get('jg_gallery_view_num_columns', 3, 'INT');
|
||||
$image_class = $this->params['configs']->get('jg_gallery_view_image_class', 0, 'INT');
|
||||
$justified_height = $this->params['configs']->get('jg_gallery_view_justified_height', 200, 'INT');
|
||||
$justified_gap = $this->params['configs']->get('jg_gallery_view_justified_gap', 5, 'INT');
|
||||
$image_link = $this->params['configs']->get('jg_gallery_view_image_link', 'defaultview', 'STRING');
|
||||
$lightbox_image = $this->params['configs']->get('jg_category_view_lightbox_image', 'detail', 'STRING');
|
||||
$browse_categories_link = $this->params['configs']->get('jg_gallery_view_browse_categories_link', 1, 'INT');
|
||||
|
||||
// Import CSS & JS
|
||||
$wa = $this->document->getWebAssetManager();
|
||||
$wa->useStyle('com_joomgallery.site');
|
||||
$wa->useStyle('com_joomgallery.jg-icon-font');
|
||||
|
||||
if ($gallery_class == 'masonry') {
|
||||
$wa->useScript('com_joomgallery.masonry');
|
||||
}
|
||||
|
||||
if ($gallery_class == 'justified') {
|
||||
$wa->useScript('com_joomgallery.justified');
|
||||
$wa->addInlineStyle('.jg-images[class*=" justified-"] .jg-image-caption-hover { right: ' . $justified_gap . 'px; }');
|
||||
}
|
||||
|
||||
$lightbox = false;
|
||||
if ($image_link == 'lightgallery') {
|
||||
$lightbox = true;
|
||||
$wa->useScript('com_joomgallery.lightgallery');
|
||||
$wa->useScript('com_joomgallery.lg-thumbnail');
|
||||
$wa->useStyle('com_joomgallery.lightgallery-bundle');
|
||||
}
|
||||
|
||||
// Initialise the grid script
|
||||
$iniJS = 'window.joomGrid = {';
|
||||
$iniJS .= ' itemid: ' . $this->item->id . ',';
|
||||
$iniJS .= ' pagination: 0,';
|
||||
$iniJS .= ' layout: "' . $gallery_class . '",';
|
||||
$iniJS .= ' num_columns: ' . $num_columns . ',';
|
||||
$iniJS .= ' lightbox: ' . ($lightbox ? 'true' : 'false') . ',';
|
||||
$iniJS .= ' justified: {height: ' . $justified_height . ', gap: ' . $justified_gap . '}';
|
||||
$iniJS .= '};';
|
||||
|
||||
$wa->addInlineScript($iniJS, ['position' => 'before'], [], ['com_joomgallery.joomgrid']);
|
||||
$wa->useScript('com_joomgallery.joomgrid');
|
||||
?>
|
||||
|
||||
<div class="com-joomgallery-gallery" itemscope itemtype="https://schema.org/ImageGallery">
|
||||
<?php if ($this->params['menu']->get('show_page_heading')) : ?>
|
||||
<div class="page-header">
|
||||
<h1><?php echo $this->escape($this->params['menu']->get('page_heading')); ?></h1>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Browse categories link (top) ?>
|
||||
<?php if ($browse_categories_link == '1') : ?>
|
||||
<div class="text-center mb-4">
|
||||
<a class="btn btn-outline-primary" href="<?php echo Route::_('index.php?option=com_joomgallery&view=category&id=1'); ?>">
|
||||
<i class="jg-icon-folder me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_GALLERY_VIEW_BROWSE_CATEGORIES'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if (count($this->item->images->items) == 0) : ?>
|
||||
<div class="alert alert-info" role="alert">
|
||||
<p class="mb-0"><?php echo Text::_('COM_JOOMGALLERY_GALLERY_NO_IMAGES'); ?></p>
|
||||
</div>
|
||||
<?php else : ?>
|
||||
<?php
|
||||
$imgsData = [
|
||||
'id' => (int) $this->item->id,
|
||||
'layout' => $gallery_class,
|
||||
'items' => $this->item->images->items,
|
||||
'num_columns' => (int) $num_columns,
|
||||
'caption_align' => 'center',
|
||||
'image_class' => $image_class,
|
||||
'image_type' => $image_type,
|
||||
'lightbox_type' => $lightbox_image,
|
||||
'image_link' => $image_link,
|
||||
'image_title' => false,
|
||||
'title_link' => 'defaultview',
|
||||
'image_desc' => false,
|
||||
'image_date' => false,
|
||||
'image_author' => false,
|
||||
'image_tags' => false,
|
||||
];
|
||||
?>
|
||||
<?php echo LayoutHelper::render('joomgallery.grids.images', $imgsData); ?>
|
||||
|
||||
<?php // Pagination ?>
|
||||
<nav class="mt-4" aria-label="<?php echo Text::_('JLIB_HTML_PAGINATION'); ?>">
|
||||
<?php echo $this->item->images->pagination->getListFooter(); ?>
|
||||
</nav>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Browse categories link (bottom) ?>
|
||||
<?php if ($browse_categories_link == '2') : ?>
|
||||
<div class="text-center mt-4">
|
||||
<a class="btn btn-outline-primary" href="<?php echo Route::_('index.php?option=com_joomgallery&view=category&id=1'); ?>">
|
||||
<i class="jg-icon-folder me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_GALLERY_VIEW_BROWSE_CATEGORIES'); ?>
|
||||
</a>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<script>
|
||||
if (window.joomGrid.layout != 'justified') {
|
||||
document.querySelectorAll('.' + window.joomGrid.imgclass).forEach(function(image) {
|
||||
image.addEventListener('load', function() {
|
||||
this.closest('.' + window.joomGrid.imgboxclass).classList.add('loaded');
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -1,259 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
*
|
||||
* This file is part of a Moko Consulting project.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
||||
*
|
||||
* FILE INFORMATION
|
||||
* DEFGROUP: MokoOnyx.Override
|
||||
* INGROUP: MokoOnyx
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /html/com_joomgallery/image/default.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* BRIEF: Image detail view override — single image with metadata, tags, custom fields
|
||||
*/
|
||||
|
||||
// No direct access
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Router\Route;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\CMS\Session\Session;
|
||||
use Joomla\CMS\HTML\HTMLHelper;
|
||||
use Joomla\CMS\Layout\FileLayout;
|
||||
use Joomla\CMS\User\UserFactoryInterface;
|
||||
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;
|
||||
use Joomgallery\Component\Joomgallery\Administrator\Helper\JoomHelper;
|
||||
|
||||
// Image params
|
||||
$image_type = $this->params['configs']->get('jg_detail_view_type_image', 'detail', 'STRING');
|
||||
$show_title = $this->params['configs']->get('jg_detail_view_show_title', 0, 'INT');
|
||||
$show_category = $this->params['configs']->get('jg_detail_view_show_category', 0, 'INT');
|
||||
$show_description = $this->params['configs']->get('jg_detail_view_show_description', 0, 'INT');
|
||||
$show_imgdate = $this->params['configs']->get('jg_detail_view_show_imgdate', 0, 'INT');
|
||||
$show_imgauthor = $this->params['configs']->get('jg_detail_view_show_imgauthor', 0, 'INT');
|
||||
$show_created_by = $this->params['configs']->get('jg_detail_view_show_created_by', 0, 'INT');
|
||||
$show_votes = $this->params['configs']->get('jg_detail_view_show_votes', 0, 'INT');
|
||||
$show_rating = $this->params['configs']->get('jg_detail_view_show_rating', 0, 'INT');
|
||||
$show_hits = $this->params['configs']->get('jg_detail_view_show_hits', 0, 'INT');
|
||||
$show_downloads = $this->params['configs']->get('jg_detail_view_show_downloads', 0, 'INT');
|
||||
$show_tags = $this->params['configs']->get('jg_detail_view_show_tags', 0, 'INT');
|
||||
$show_metadata = $this->params['configs']->get('jg_detail_view_show_metadata', 0, 'INT');
|
||||
|
||||
// Import CSS & JS
|
||||
$wa = $this->document->getWebAssetManager();
|
||||
$wa->useStyle('com_joomgallery.site');
|
||||
$wa->useStyle('com_joomgallery.jg-icon-font');
|
||||
|
||||
// Access check
|
||||
$canEdit = $this->getAcl()->checkACL('edit', 'com_joomgallery.image', $this->item->id, $this->item->catid, true);
|
||||
$canDelete = $this->getAcl()->checkACL('delete', 'com_joomgallery.image', $this->item->id, $this->item->catid, true);
|
||||
$canCheckin = $this->getAcl()->checkACL('editstate', 'com_joomgallery.image', $this->item->id, $this->item->catid, true) || $this->item->checked_out == Factory::getUser()->id;
|
||||
$returnURL = base64_encode(JoomHelper::getViewRoute('image', $this->item->id, $this->item->catid, $this->item->language, $this->getLayout()));
|
||||
|
||||
// Tags
|
||||
$tagLayout = new FileLayout('joomgallery.content.tags');
|
||||
$tags = $tagLayout->render($this->item->tags);
|
||||
|
||||
// Metadata
|
||||
$metadataLayout = new FileLayout('joomgallery.content.metadata');
|
||||
$metadata = $metadataLayout->render($this->item->imgmetadata);
|
||||
|
||||
// Custom Fields
|
||||
$fields = FieldsHelper::getFields('com_joomgallery.image', $this->item);
|
||||
|
||||
// Check if we have any info rows to show
|
||||
$hasInfo = $show_category || $show_imgdate || $show_imgauthor || $show_created_by
|
||||
|| $show_votes || $show_rating || $show_hits || $show_downloads
|
||||
|| $show_tags || $show_metadata || count($fields) > 0;
|
||||
?>
|
||||
|
||||
<div class="com-joomgallery-image" itemscope itemtype="https://schema.org/ImageObject">
|
||||
<?php if ($show_title) : ?>
|
||||
<h2 itemprop="name"><?php echo $this->escape($this->item->title); ?></h2>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Back to category ?>
|
||||
<a class="btn btn-outline-primary btn-sm mb-3" href="<?php echo Route::_('index.php?option=com_joomgallery&view=category&id=' . (int) $this->item->catid); ?>">
|
||||
<i class="jg-icon-arrow-left-alt me-1" aria-hidden="true"></i><?php echo Text::_('COM_JOOMGALLERY_IMAGE_BACK_TO_CATEGORY') . ' ' . $this->escape($this->item->cattitle); ?>
|
||||
</a>
|
||||
|
||||
<?php // Admin buttons ?>
|
||||
<?php if ($canEdit || $canCheckin || $canDelete) : ?>
|
||||
<div class="com-joomgallery-image__actions btn-toolbar mb-3" role="toolbar" aria-label="<?php echo Text::_('JTOOLBAR'); ?>">
|
||||
<?php if ($canCheckin && $this->item->checked_out > 0) : ?>
|
||||
<a class="btn btn-outline-secondary btn-sm me-2" href="<?php echo Route::_('index.php?option=com_joomgallery&task=image.checkin&id=' . $this->item->id . '&return=' . $returnURL . '&' . Session::getFormToken() . '=1'); ?>">
|
||||
<i class="jg-icon-checkin me-1" aria-hidden="true"></i><?php echo Text::_('JLIB_HTML_CHECKIN'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canEdit) : ?>
|
||||
<a class="btn btn-outline-primary btn-sm me-2<?php echo ($this->item->checked_out > 0) ? ' disabled' : ''; ?>" href="<?php echo Route::_('index.php?option=com_joomgallery&task=image.edit&id=' . $this->item->id . '&return=' . $returnURL); ?>">
|
||||
<i class="jg-icon-edit me-1" aria-hidden="true"></i><?php echo Text::_('JGLOBAL_EDIT'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($canDelete) : ?>
|
||||
<a class="btn btn-outline-danger btn-sm<?php echo ($this->item->checked_out > 0) ? ' disabled' : ''; ?>" href="#deleteImgModal" role="button" data-bs-toggle="modal">
|
||||
<i class="jg-icon-delete me-1" aria-hidden="true"></i><?php echo Text::_('JACTION_DELETE'); ?>
|
||||
</a>
|
||||
<?php echo HTMLHelper::_(
|
||||
'bootstrap.renderModal',
|
||||
'deleteImgModal',
|
||||
[
|
||||
'title' => Text::_('JACTION_DELETE'),
|
||||
'modalWidth' => '50',
|
||||
'bodyHeight' => '100',
|
||||
'footer' => '<button class="btn btn-secondary" data-bs-dismiss="modal">' . Text::_('JCANCEL') . '</button>'
|
||||
. '<a href="' . Route::_('index.php?option=com_joomgallery&task=image.remove&id=' . $this->item->id . '&return=' . $returnURL . '&' . Session::getFormToken() . '=1', false, 2) . '" class="btn btn-danger">' . Text::_('COM_JOOMGALLERY_COMMON_DELETE_IMAGE_TIPCAPTION') . '</a>',
|
||||
],
|
||||
Text::_('COM_JOOMGALLERY_COMMON_ALERT_SURE_DELETE_SELECTED_ITEM')
|
||||
); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Image ?>
|
||||
<figure class="figure com-joomgallery-image__figure text-center w-100 mb-4">
|
||||
<div id="jg-loader"></div>
|
||||
<img
|
||||
src="<?php echo JoomHelper::getImg($this->item, $image_type); ?>"
|
||||
class="figure-img img-fluid rounded"
|
||||
alt="<?php echo $this->escape($this->item->title); ?>"
|
||||
style="width:auto;"
|
||||
itemprop="contentUrl"
|
||||
loading="lazy"
|
||||
/>
|
||||
<?php if ($show_description && !empty($this->item->description)) : ?>
|
||||
<figcaption class="figure-caption" itemprop="description"><?php echo $this->item->description; ?></figcaption>
|
||||
<?php endif; ?>
|
||||
</figure>
|
||||
|
||||
<?php // Image info table ?>
|
||||
<?php if ($hasInfo) : ?>
|
||||
<div class="com-joomgallery-image__info">
|
||||
<h3><?php echo Text::_('COM_JOOMGALLERY_IMAGE_INFO'); ?></h3>
|
||||
<table class="table table-striped">
|
||||
<tbody>
|
||||
<?php if ($show_category) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('JCATEGORY'); ?></th>
|
||||
<td>
|
||||
<a href="<?php echo Route::_('index.php?option=com_joomgallery&view=category&id=' . (int) $this->item->catid); ?>">
|
||||
<?php echo $this->escape($this->item->cattitle); ?>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_imgdate) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_DATE'); ?></th>
|
||||
<td>
|
||||
<time datetime="<?php echo HTMLHelper::_('date', $this->item->date, 'c'); ?>" itemprop="dateCreated">
|
||||
<?php echo HTMLHelper::_('date', $this->item->date, Text::_('DATE_FORMAT_LC4')); ?>
|
||||
</time>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_imgauthor) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('JAUTHOR'); ?></th>
|
||||
<td itemprop="author"><?php echo $this->escape($this->item->author); ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_created_by) : ?>
|
||||
<?php $user = Factory::getContainer()->get(UserFactoryInterface::class)->loadUserById($this->item->created_by); ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_OWNER'); ?></th>
|
||||
<td><?php echo $this->escape($user->name); ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_votes) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_VOTES'); ?></th>
|
||||
<td><?php echo $this->escape($this->item->votes); ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_rating) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_IMAGE_RATING'); ?></th>
|
||||
<td><?php echo $this->escape($this->item->rating); ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_hits) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('JGLOBAL_HITS'); ?></th>
|
||||
<td><?php echo (int) $this->item->hits; ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_downloads) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_DOWNLOADS'); ?></th>
|
||||
<td><?php echo (int) $this->item->downloads; ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_tags) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_TAGS'); ?></th>
|
||||
<td><?php echo $tags; ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php if ($show_metadata) : ?>
|
||||
<tr>
|
||||
<th scope="row"><?php echo Text::_('COM_JOOMGALLERY_IMGMETADATA'); ?></th>
|
||||
<td><?php echo $metadata; ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php // Custom fields ?>
|
||||
<?php if (count($fields) > 0) : ?>
|
||||
<tr>
|
||||
<th scope="row" colspan="2"><strong><?php echo Text::_('JGLOBAL_FIELDS'); ?></strong></th>
|
||||
</tr>
|
||||
<?php foreach ($fields as $field) : ?>
|
||||
<?php if ($this->component->getAccess()->checkViewLevel($field->access) && $field->params->get('display') > 0) : ?>
|
||||
<tr class="<?php echo $this->escape($field->params->get('render_class')); ?>">
|
||||
<?php if ($field->params->get('showlabel', true)) : ?>
|
||||
<th scope="row" class="<?php echo $this->escape($field->params->get('label_render_class')); ?>"><?php echo $this->escape($field->title); ?></th>
|
||||
<?php else : ?>
|
||||
<th scope="row"></th>
|
||||
<?php endif; ?>
|
||||
<td class="<?php echo $this->escape($field->params->get('value_render_class')); ?>"><?php echo $field->value; ?></td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
<?php endforeach; ?>
|
||||
<?php endif; ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<script>
|
||||
window.onload = function() {
|
||||
var el = document.querySelector('#jg-loader');
|
||||
if (el) el.classList.add('hidden');
|
||||
};
|
||||
</script>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
<!DOCTYPE html><title></title>
|
||||
@@ -10,17 +10,7 @@
|
||||
* INGROUP: MokoOnyx
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /html/layouts/joomla/module/card.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* VERSION: 02.18.03
|
||||
* BRIEF: Custom card module chrome — renders module titles for all modules
|
||||
*/
|
||||
|
||||
|
||||
@@ -11,17 +11,7 @@
|
||||
* INGROUP: MokoOnyx.Layouts
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: /src/html/layouts/mokoonyx/article-metadata.php
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* VERSION: 02.18.03
|
||||
* BRIEF: Article metadata footer layout -- renders jcfields grouped by field group
|
||||
*/
|
||||
|
||||
|
||||
@@ -10,17 +10,7 @@
|
||||
* INGROUP: MokoOnyx.Accessibility
|
||||
* REPO: https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx
|
||||
* PATH: ./media/css/a11y-high-contrast.css
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
=======
|
||||
* VERSION: 02.18.00
|
||||
>>>>>>> origin/main
|
||||
>>>>>>> origin/main
|
||||
* VERSION: 02.18.03
|
||||
* BRIEF: High-contrast stylesheet for accessibility toolbar
|
||||
*/
|
||||
|
||||
|
||||
@@ -93,6 +93,7 @@ class Tpl_MokoonyxInstallerScript implements InstallerScriptInterface
|
||||
$this->replaceCassiopeiaReferences();
|
||||
$this->clearFaviconStamp();
|
||||
$this->cleanMediaFolder();
|
||||
$this->removeDeletedFiles();
|
||||
$this->lockExtension();
|
||||
}
|
||||
|
||||
@@ -483,6 +484,68 @@ class Tpl_MokoonyxInstallerScript implements InstallerScriptInterface
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove files and directories that were shipped in previous versions
|
||||
* but have since been deleted from the package.
|
||||
*
|
||||
* Joomla's installer never deletes files on upgrade — it only
|
||||
* adds/overwrites. This method fills that gap so stale overrides
|
||||
* and deprecated assets don't linger on disk.
|
||||
*
|
||||
* Maintain this list: when you delete a file from the repo, add its
|
||||
* path here (relative to the template root) so existing installs
|
||||
* get cleaned up on the next update.
|
||||
*/
|
||||
private function removeDeletedFiles(): void
|
||||
{
|
||||
$templateRoot = JPATH_ROOT . '/templates/' . self::NEW_NAME;
|
||||
|
||||
// Paths relative to templates/mokoonyx/
|
||||
$deletedFiles = [
|
||||
// JoomGallery template overrides — removed in 02.19.00
|
||||
'html/com_joomgallery/category/default.php',
|
||||
'html/com_joomgallery/category/default_cat.php',
|
||||
'html/com_joomgallery/category/index.html',
|
||||
'html/com_joomgallery/gallery/default.php',
|
||||
'html/com_joomgallery/gallery/index.html',
|
||||
'html/com_joomgallery/image/default.php',
|
||||
'html/com_joomgallery/image/index.html',
|
||||
];
|
||||
|
||||
// Directories to remove (only if empty after file deletion)
|
||||
$deletedDirs = [
|
||||
'html/com_joomgallery/image',
|
||||
'html/com_joomgallery/gallery',
|
||||
'html/com_joomgallery/category',
|
||||
'html/com_joomgallery',
|
||||
];
|
||||
|
||||
$removed = 0;
|
||||
|
||||
foreach ($deletedFiles as $relPath) {
|
||||
$file = $templateRoot . '/' . $relPath;
|
||||
if (is_file($file)) {
|
||||
@unlink($file);
|
||||
$removed++;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($deletedDirs as $relPath) {
|
||||
$dir = $templateRoot . '/' . $relPath;
|
||||
if (is_dir($dir)) {
|
||||
// Only remove if empty
|
||||
$entries = @scandir($dir);
|
||||
if ($entries && count($entries) <= 2) { // . and .. only
|
||||
@rmdir($dir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($removed > 0) {
|
||||
$this->logMessage("Removed {$removed} deprecated file(s) from previous versions.");
|
||||
}
|
||||
}
|
||||
|
||||
private function logMessage(string $message, string $priority = 'info'): void
|
||||
{
|
||||
$priorities = [
|
||||
|
||||
@@ -36,11 +36,7 @@
|
||||
</server>
|
||||
</updateservers>
|
||||
<name>mokoonyx</name>
|
||||
<<<<<<< HEAD
|
||||
<version>02.18.00</version>
|
||||
=======
|
||||
<version>02.18.00</version>
|
||||
>>>>>>> origin/main
|
||||
<version>02.18.03-dev</version>
|
||||
<scriptfile>script.php</scriptfile>
|
||||
<creationDate>2026-05-16</creationDate>
|
||||
<author>Jonathan Miller || Moko Consulting</author>
|
||||
|
||||
+5
-5
@@ -1,7 +1,7 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
||||
SPDX-License-Identifier: GPL-3.0-or-later
|
||||
VERSION: 02.16.03-dev
|
||||
VERSION: 02.18.03-dev
|
||||
-->
|
||||
|
||||
<updates>
|
||||
@@ -11,13 +11,13 @@
|
||||
<element>mokoonyx</element>
|
||||
<type>template</type>
|
||||
<client>site</client>
|
||||
<version>02.16.03-dev</version>
|
||||
<creationDate>2026-06-03</creationDate>
|
||||
<version>02.18.03-dev</version>
|
||||
<creationDate>2026-06-04</creationDate>
|
||||
<infourl title='Template - MokoOnyx'>https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/releases/tag/development</infourl>
|
||||
<downloads>
|
||||
<downloadurl type='full' format='zip'>https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/releases/download/development/tpl_mokoonyx-02.16.03-dev.zip</downloadurl>
|
||||
<downloadurl type='full' format='zip'>https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/releases/download/development/tpl_mokoonyx-02.18.03-dev.zip</downloadurl>
|
||||
</downloads>
|
||||
<sha256>24d67eb360fb9dbc40dfdb5b37167a9fabc8ca9b518987a8fc978a93b53731dc</sha256>
|
||||
<sha256>5ae848d5bf54e9c3ba4f3255e023658635e3371979bf88df38cb1478b98aeee6</sha256>
|
||||
<tags><tag>dev</tag></tags>
|
||||
<changelogurl>https://git.mokoconsulting.tech/MokoConsulting/MokoOnyx/raw/branch/main/CHANGELOG.md</changelogurl>
|
||||
<maintainer>Moko Consulting</maintainer>
|
||||
|
||||
Reference in New Issue
Block a user