Initial commit: igny8 project

This commit is contained in:
igny8
2025-11-09 10:27:02 +00:00
commit 60b8188111
27265 changed files with 4360521 additions and 0 deletions

View File

@@ -0,0 +1,136 @@
<?php
/**
* ==========================
* 🔐 IGNY8 FILE RULE HEADER
* ==========================
* @file : pagination-tpl.php
* @location : /modules/components/pagination-tpl.php
* @type : Component
* @scope : Cross-Module
* @allowed : Pagination rendering, navigation controls
* @reusability : Shared
* @notes : Dynamic pagination component for all modules
*/
// Prevent direct access
if (!defined('ABSPATH')) {
exit;
}
// Render pagination function
function igny8_render_pagination($table_id, $pagination = []) {
// Set variables for component
$module = explode('_', $table_id)[0];
$tab = explode('_', $table_id)[1] ?? '';
// Set default pagination values
$pagination = array_merge([
'current_page' => 1,
'total_pages' => 1,
'per_page' => 10,
'total_items' => 0
], $pagination);
// Start output buffering to capture HTML
ob_start();
?>
<!-- Pagination -->
<div class="igny8-pagination igny8-mt-20"
data-table="<?php echo esc_attr($table_id); ?>"
data-current-page="<?php echo esc_attr($pagination['current_page']); ?>"
data-per-page="<?php echo esc_attr($pagination['per_page']); ?>"
data-total-items="<?php echo esc_attr($pagination['total_items']); ?>"
data-module="<?php echo esc_attr($module); ?>"
data-tab="<?php echo esc_attr($tab); ?>">
<button class="igny8-btn igny8-btn-sm igny8-btn-outline igny8-page-btn"
data-page="<?php echo max(1, $pagination['current_page'] - 1); ?>"
<?php echo $pagination['current_page'] <= 1 ? 'disabled' : ''; ?>>
Previous
</button>
<?php if ($pagination['total_items'] > 20): ?>
<?php
$current = $pagination['current_page'];
$total = $pagination['total_pages'];
?>
<?php // Always show first 2 pages ?>
<?php for ($i = 1; $i <= min(2, $total); $i++): ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn <?php echo $i === $current ? 'igny8-btn-primary' : 'igny8-btn-outline'; ?>"
data-page="<?php echo $i; ?>">
<?php echo $i; ?>
</button>
<?php endfor; ?>
<?php // Add ellipsis if there's a gap ?>
<?php if ($total > 4 && $current > 3): ?>
<span style="margin: 0 8px; color: #666;">...</span>
<?php endif; ?>
<?php // Show current page if it's not in first 2 or last 2 ?>
<?php if ($current > 2 && $current < $total - 1): ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn igny8-btn-primary"
data-page="<?php echo $current; ?>">
<?php echo $current; ?>
</button>
<?php endif; ?>
<?php // Add ellipsis before last 2 if there's a gap ?>
<?php if ($total > 4 && $current < $total - 2): ?>
<span style="margin: 0 8px; color: #666;">...</span>
<?php endif; ?>
<?php // Always show last 2 pages (if different from first 2) ?>
<?php for ($i = max(3, $total - 1); $i <= $total; $i++): ?>
<?php if ($i > 2): // Don't duplicate first 2 pages ?>
<button class="igny8-btn igny8-btn-sm igny8-page-btn <?php echo $i === $current ? 'igny8-btn-primary' : 'igny8-btn-outline'; ?>"
data-page="<?php echo $i; ?>">
<?php echo $i; ?>
</button>
<?php endif; ?>
<?php endfor; ?>
<?php endif; ?>
<button class="igny8-btn igny8-btn-sm igny8-btn-outline igny8-page-btn"
data-page="<?php echo min($pagination['total_pages'], $pagination['current_page'] + 1); ?>"
<?php echo $pagination['current_page'] >= $pagination['total_pages'] ? 'disabled' : ''; ?>>
Next
</button>
<!-- Records per page selector -->
<div class="igny8-per-page-selector" style="margin-left: 20px; display: inline-flex; align-items: center; gap: 8px;">
<label for="<?php echo esc_attr($table_id); ?>_per_page" style="font-size: 12px; color: #666;">Show:</label>
<select id="<?php echo esc_attr($table_id); ?>_per_page" class="igny8-per-page-select" data-table="<?php echo esc_attr($table_id); ?>" style="padding: 4px 8px; font-size: 12px; border: 1px solid #ddd; border-radius: 4px;">
<option value="10" <?php selected($pagination['per_page'], 10); ?>>10</option>
<option value="20" <?php selected($pagination['per_page'], 20); ?>>20</option>
<option value="50" <?php selected($pagination['per_page'], 50); ?>>50</option>
<option value="100" <?php selected($pagination['per_page'], 100); ?>>100</option>
</select>
<span style="font-size: 12px; color: #666;">per page</span>
</div>
<span style="margin-left: 12px; font-size: 12px; color: #666;">
Showing <?php echo (($pagination['current_page'] - 1) * $pagination['per_page']) + 1; ?>-<?php echo min($pagination['current_page'] * $pagination['per_page'], $pagination['total_items']); ?> of <?php echo $pagination['total_items']; ?> items
</span>
</div>
<?php
return ob_get_clean();
}
// Set default values
$table_id = $table_id ?? 'data_table';
$pagination = $pagination ?? [
'current_page' => 1,
'total_pages' => 1,
'per_page' => 10,
'total_items' => 0
];
$module = $module ?? '';
$tab = $tab ?? '';
// Debug state: Pagination HTML rendered
if (function_exists('igny8_debug_state')) {
igny8_debug_state('PAGINATION_HTML_RENDERED', true, 'Pagination HTML rendered for ' . $table_id);
}
?>