feat: VivesPOS landing on Winter CMS 1.2 — theme + plugin + Dockerfile
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run
Some checks are pending
Module sub-split / Sub-split (push) Waiting to run
- Base: wintercms/winter branch 1.2 (full framework) - Theme vivespos: Canvas 7 + Bootstrap 5 CDN, custom CSS - Layout: deferred GTM/GA4 tracking, JSON-LD SoftwareApplication - Partials: hero (offline-first), features, modes (offline/nube toggle), screenshots, pricing (3 planes), comparison, FAQ, CTA - Plugin VivesPOS.Site with ContactForm - Dockerfile: PHP 8.2 Apache, port 80, healthcheck - Added winter/wn-pages, blog, sitemap, seo plugins - Active theme set to vivespos
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Drag-and-drop reordering styles for the list widget.
|
||||
*/
|
||||
.control-list .list-sort-handle-column,
|
||||
.control-list .list-cell-sort-handle {
|
||||
width: 28px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* The whole handle cell is the drag target (SortableJS handle is the cell), so
|
||||
the grab affordance and hit area cover the entire cell, not just the icon.
|
||||
The second selector is specific enough to override rowlink's
|
||||
"tr.rowlink td.nolink { cursor: auto }" rule, which would otherwise reset the
|
||||
cursor on this (intentionally) non-link cell when the list rows are clickable. */
|
||||
.control-list .list-cell-sort-handle,
|
||||
.control-list tr.rowlink td.list-cell-sort-handle.nolink {
|
||||
cursor: move;
|
||||
cursor: grab;
|
||||
}
|
||||
|
||||
.control-list .list-cell-sort-handle:active,
|
||||
.control-list tr.rowlink td.list-cell-sort-handle.nolink:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.control-list .list-sort-handle {
|
||||
display: inline-block;
|
||||
color: #666;
|
||||
line-height: 1;
|
||||
text-decoration: none;
|
||||
cursor: inherit;
|
||||
}
|
||||
|
||||
.control-list tr:hover .list-sort-handle {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.control-list .list-sortable-ghost {
|
||||
opacity: 0.5;
|
||||
background: #f0f7fd;
|
||||
}
|
||||
|
||||
.control-list .list-sortable-chosen {
|
||||
background: #f7f9fa;
|
||||
}
|
||||
|
||||
.control-list[data-sortable="true"] tbody tr {
|
||||
/* Avoid text selection while dragging rows */
|
||||
user-select: none;
|
||||
}
|
||||
1
modules/backend/widgets/lists/assets/js/dist/winter.list.sortable.js
vendored
Normal file
1
modules/backend/widgets/lists/assets/js/dist/winter.list.sortable.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,99 @@
|
||||
import Sortable from 'sortablejs';
|
||||
|
||||
/*
|
||||
* List widget drag-and-drop reordering.
|
||||
*
|
||||
* Additive enhancement on top of the existing list widget. When a list is rendered with
|
||||
* `data-sortable="true"`, SortableJS is initialised on its <tbody> using the per-row drag
|
||||
* handle cell. On drop, the record ids in their new DOM order are posted to the list's reorder
|
||||
* handler, which assigns the sort order values server-side (by position) and re-renders.
|
||||
*/
|
||||
(function ($) {
|
||||
"use strict";
|
||||
|
||||
function collectIds(tbody) {
|
||||
return Array.prototype.map.call(
|
||||
tbody.querySelectorAll('tr[data-record-id]'),
|
||||
function (tr) {
|
||||
return tr.getAttribute('data-record-id');
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
function initList(listEl) {
|
||||
var tbody = listEl.querySelector('tbody');
|
||||
if (!tbody || tbody.wnListSortable) {
|
||||
return;
|
||||
}
|
||||
|
||||
var handler = listEl.getAttribute('data-reorder-handler');
|
||||
if (!handler) {
|
||||
return;
|
||||
}
|
||||
|
||||
var $list = $(listEl);
|
||||
|
||||
// SortableJS dispatches a native "change" event on the list root (the tbody) while
|
||||
// an item is being dragged. Stop it bubbling to the surrounding form's change monitor
|
||||
// so reordering — which persists immediately — does not flag the form as having
|
||||
// unsaved changes. Real form-field changes (target = input/select/textarea) are left
|
||||
// untouched.
|
||||
tbody.addEventListener('change', function (event) {
|
||||
if (event.target === tbody) {
|
||||
event.stopPropagation();
|
||||
}
|
||||
});
|
||||
|
||||
var reorderInFlight = false;
|
||||
|
||||
tbody.wnListSortable = Sortable.create(tbody, {
|
||||
handle: '.list-cell-sort-handle',
|
||||
draggable: 'tr',
|
||||
filter: '.no-data',
|
||||
animation: 150,
|
||||
ghostClass: 'list-sortable-ghost',
|
||||
chosenClass: 'list-sortable-chosen',
|
||||
onEnd: function (event) {
|
||||
// Nothing changed if the row was dropped back in its original position.
|
||||
if (event.oldIndex === event.newIndex) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Ignore further drops until the current reorder has been persisted and the
|
||||
// list re-rendered, so overlapping requests can't race and persist a stale order.
|
||||
if (reorderInFlight) {
|
||||
return;
|
||||
}
|
||||
reorderInFlight = true;
|
||||
|
||||
// The request is fired programmatically (not from a [data-request] element),
|
||||
// so show the stripe load indicator manually for feedback.
|
||||
var indicator = ($.wn && $.wn.stripeLoadIndicator) || ($.oc && $.oc.stripeLoadIndicator);
|
||||
if (indicator) {
|
||||
indicator.show();
|
||||
}
|
||||
|
||||
// Only the record ids (in their new order) are sent; the server assigns the
|
||||
// sort order values by position.
|
||||
$list.request(handler, {
|
||||
data: { record_ids: collectIds(tbody) }
|
||||
}).always(function () {
|
||||
reorderInFlight = false;
|
||||
if (indicator) {
|
||||
indicator.hide();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function initAll() {
|
||||
var lists = document.querySelectorAll('[data-control="listwidget"][data-sortable="true"]');
|
||||
Array.prototype.forEach.call(lists, initList);
|
||||
}
|
||||
|
||||
$(document).ready(initAll);
|
||||
|
||||
// Re-initialise after the list partial is replaced by an AJAX update (e.g. onRefresh).
|
||||
$(document).on('render', initAll);
|
||||
})(window.jQuery);
|
||||
166
modules/backend/widgets/lists/assets/js/winter.list.js
Normal file
166
modules/backend/widgets/lists/assets/js/winter.list.js
Normal file
@@ -0,0 +1,166 @@
|
||||
/*
|
||||
* List Widget
|
||||
*
|
||||
* Dependences:
|
||||
* - Row Link Plugin (system/assets/ui/js/list.rowlink.js)
|
||||
*/
|
||||
+function ($) { "use strict";
|
||||
|
||||
var ListWidget = function (element, options) {
|
||||
|
||||
var $el = this.$el = $(element);
|
||||
|
||||
this.options = options || {};
|
||||
|
||||
var scrollClassContainer = options.scrollClassContainer !== undefined
|
||||
? options.scrollClassContainer
|
||||
: $el.parent()
|
||||
|
||||
$el.dragScroll({
|
||||
scrollClassContainer: scrollClassContainer,
|
||||
scrollSelector: 'thead',
|
||||
dragSelector: 'thead'
|
||||
})
|
||||
|
||||
this.update()
|
||||
}
|
||||
|
||||
ListWidget.DEFAULTS = {
|
||||
}
|
||||
|
||||
ListWidget.prototype.update = function() {
|
||||
var
|
||||
list = this.$el,
|
||||
head = $('thead', list),
|
||||
body = $('tbody', list),
|
||||
foot = $('tfoot', list)
|
||||
|
||||
/*
|
||||
* Bind check boxes
|
||||
*/
|
||||
$('.list-checkbox input[type="checkbox"]', body).each(function(){
|
||||
var $el = $(this)
|
||||
if ($el.is(':checked'))
|
||||
$el.closest('tr').addClass('active')
|
||||
})
|
||||
|
||||
head.on('change', '.list-checkbox input[type="checkbox"]', function(){
|
||||
var $el = $(this),
|
||||
checked = $el.is(':checked')
|
||||
|
||||
$('.list-checkbox input[type="checkbox"]', body).prop('checked', checked)
|
||||
if (checked)
|
||||
$('tr', body).addClass('active')
|
||||
else
|
||||
$('tr', body).removeClass('active')
|
||||
})
|
||||
|
||||
body.on('change', '.list-checkbox input[type="checkbox"]', function(){
|
||||
var $el = $(this),
|
||||
checked = $el.is(':checked')
|
||||
|
||||
if (checked) {
|
||||
$el.closest('tr').addClass('active')
|
||||
}
|
||||
else {
|
||||
$('.list-checkbox input[type="checkbox"]', head).prop('checked', false)
|
||||
$el.closest('tr').removeClass('active')
|
||||
}
|
||||
})
|
||||
|
||||
this.lastChecked = null
|
||||
|
||||
body.on('click', '.list-checkbox input[type="checkbox"]', (e) => {
|
||||
const current = e.currentTarget
|
||||
|
||||
if (this.lastChecked && e.shiftKey) {
|
||||
const checkboxes = $('.list-checkbox input[type="checkbox"]', body)
|
||||
const start = checkboxes.index(current)
|
||||
const end = checkboxes.index(this.lastChecked)
|
||||
|
||||
checkboxes
|
||||
.slice(Math.min(start, end), Math.max(start, end) + 1)
|
||||
.each(function () {
|
||||
$(this).prop('checked', current.checked).trigger('change')
|
||||
})
|
||||
}
|
||||
|
||||
this.lastChecked = current
|
||||
})
|
||||
}
|
||||
|
||||
ListWidget.prototype.getChecked = function() {
|
||||
var
|
||||
list = this.$el,
|
||||
body = $('tbody', list)
|
||||
|
||||
return $('.list-checkbox input[type="checkbox"]', body).map(function(){
|
||||
var $el = $(this)
|
||||
if ($el.is(':checked'))
|
||||
return $el.val()
|
||||
}).get();
|
||||
}
|
||||
|
||||
ListWidget.prototype.toggleChecked = function(el) {
|
||||
var $checkbox = $('.list-checkbox input[type="checkbox"]', $(el).closest('tr'))
|
||||
$checkbox.prop('checked', !$checkbox.is(':checked')).trigger('change')
|
||||
}
|
||||
|
||||
// LIST WIDGET PLUGIN DEFINITION
|
||||
// ============================
|
||||
|
||||
var old = $.fn.listWidget
|
||||
|
||||
$.fn.listWidget = function (option) {
|
||||
var args = Array.prototype.slice.call(arguments, 1), result
|
||||
|
||||
this.each(function () {
|
||||
var $this = $(this)
|
||||
var data = $this.data('oc.listwidget')
|
||||
var options = $.extend({}, ListWidget.DEFAULTS, $this.data(), typeof option == 'object' && option)
|
||||
if (!data) $this.data('oc.listwidget', (data = new ListWidget(this, options)))
|
||||
if (typeof option == 'string') result = data[option].apply(data, args)
|
||||
if (typeof result != 'undefined') return false
|
||||
})
|
||||
|
||||
return result ? result : this
|
||||
}
|
||||
|
||||
$.fn.listWidget.Constructor = ListWidget
|
||||
|
||||
// LIST WIDGET NO CONFLICT
|
||||
// =================
|
||||
|
||||
$.fn.listWidget.noConflict = function () {
|
||||
$.fn.listWidget = old
|
||||
return this
|
||||
}
|
||||
|
||||
// LIST WIDGET HELPERS
|
||||
// =================
|
||||
|
||||
if ($.wn === undefined)
|
||||
$.wn = {}
|
||||
if ($.oc === undefined)
|
||||
$.oc = $.wn
|
||||
|
||||
$.wn.listToggleChecked = function(el) {
|
||||
$(el)
|
||||
.closest('[data-control="listwidget"]')
|
||||
.listWidget('toggleChecked', el)
|
||||
}
|
||||
|
||||
$.wn.listGetChecked = function(el) {
|
||||
return $(el)
|
||||
.closest('[data-control="listwidget"]')
|
||||
.listWidget('getChecked')
|
||||
}
|
||||
|
||||
// LIST WIDGET DATA-API
|
||||
// ==============
|
||||
|
||||
$(document).render(function(){
|
||||
$('[data-control="listwidget"]').listWidget();
|
||||
})
|
||||
|
||||
}(window.jQuery);
|
||||
@@ -0,0 +1,3 @@
|
||||
<div class="list-widget list-scrollable-container <?= $cssClasses ?>" id="<?= $this->getId() ?>">
|
||||
<?= $this->makePartial('list') ?>
|
||||
</div>
|
||||
42
modules/backend/widgets/lists/partials/_list.php
Normal file
42
modules/backend/widgets/lists/partials/_list.php
Normal file
@@ -0,0 +1,42 @@
|
||||
<div class="control-list list-scrollable" data-control="listwidget"
|
||||
<?php if ($sortable): ?>
|
||||
data-sortable="true"
|
||||
data-reorder-handler="<?= e($reorderHandler) ?>"
|
||||
<?php endif ?>
|
||||
>
|
||||
<table class="table data" data-control="rowlink">
|
||||
<thead>
|
||||
<?php if ($showTotals): ?>
|
||||
<?= $this->makePartial('list_totals') ?>
|
||||
<?php endif; ?>
|
||||
<?= $this->makePartial('list_head_row') ?>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php if (count($records)): ?>
|
||||
<?= $this->makePartial('list_body_rows') ?>
|
||||
<?php else: ?>
|
||||
<tr class="no-data">
|
||||
<td colspan="<?= $columnTotal ?>" class="nolink">
|
||||
<p class="no-data"><?= $noRecordsMessage ?></p>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif ?>
|
||||
</tbody>
|
||||
<?php if ($showTotals): ?>
|
||||
<tfoot>
|
||||
<?= $this->makePartial('list_totals') ?>
|
||||
</tfoot>
|
||||
<?php endif; ?>
|
||||
</table>
|
||||
<?php if ($showPagination): ?>
|
||||
<div class="list-footer">
|
||||
<div class="list-pagination">
|
||||
<?php if ($showPageNumbers): ?>
|
||||
<?= $this->makePartial('list_pagination') ?>
|
||||
<?php else: ?>
|
||||
<?= $this->makePartial('list_pagination_simple') ?>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
@@ -0,0 +1,11 @@
|
||||
<td class="list-checkbox nolink">
|
||||
<div class="checkbox custom-checkbox nolabel">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="checked[]"
|
||||
id="<?= $this->getId('checkbox-' . $record->getKey()) ?>"
|
||||
value="<?= $record->getKey() ?>"
|
||||
autocomplete="off"/>
|
||||
<label for="<?= $this->getId('checkbox-' . $record->getKey()) ?>"><?= e(trans('backend::lang.list.check')) ?></label>
|
||||
</div>
|
||||
</td>
|
||||
47
modules/backend/widgets/lists/partials/_list_body_row.php
Normal file
47
modules/backend/widgets/lists/partials/_list_body_row.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
$expanded = $showTree ? $this->isTreeNodeExpanded($record) : null;
|
||||
$childRecords = $showTree ? $record->getChildren() : null;
|
||||
$treeLevelClass = $showTree ? 'list-tree-level-'.$treeLevel : '';
|
||||
?>
|
||||
<tr class="<?= $treeLevelClass ?> <?= $this->getRowClass($record) ?>"
|
||||
data-record-id="<?= e($record->getKey()) ?>"
|
||||
>
|
||||
<?php if ($showCheckboxes): ?>
|
||||
<?= $this->makePartial('list_body_checkbox', ['record' => $record]) ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($showTree): ?>
|
||||
<?= $this->makePartial('list_body_tree', [
|
||||
'record' => $record,
|
||||
'expanded' => $expanded,
|
||||
'childCount' => $record->getChildCount()
|
||||
]) ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if (!empty($sortable)): ?>
|
||||
<td class="list-cell-sort-handle nolink">
|
||||
<span class="list-sort-handle" title="<?= e(trans('backend::lang.list.sort_drag_title')) ?>"><i class="icon-bars"></i></span>
|
||||
</td>
|
||||
<?php endif ?>
|
||||
|
||||
<?php $index = $url = 0; foreach ($columns as $key => $column): ?>
|
||||
<?php $index++; ?>
|
||||
<td class="list-cell-index-<?= $index ?> list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->clickable ? '' : 'nolink' ?> <?= $column->getAlignClass() ?> <?= $column->cssClass ?>">
|
||||
<?php if ($column->clickable && !$url && ($url = $this->getRecordUrl($record))): ?>
|
||||
<a <?= $this->getRecordOnClick($record) ?> href="<?= $url ?>">
|
||||
<?= $this->getColumnValue($record, $column) ?>
|
||||
</a>
|
||||
<?php else: ?>
|
||||
<?= $this->getColumnValue($record, $column) ?>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
<?php endforeach ?>
|
||||
|
||||
<?php if ($showSetup): ?>
|
||||
<td class="list-setup"> </td>
|
||||
<?php endif ?>
|
||||
</tr>
|
||||
|
||||
<?php if ($showTree && $expanded): ?>
|
||||
<?= $this->makePartial('list_body_rows', ['records' => $childRecords, 'treeLevel' => $treeLevel+1]) ?>
|
||||
<?php endif ?>
|
||||
@@ -0,0 +1,3 @@
|
||||
<?php foreach ($records as $record): ?>
|
||||
<?= $this->makePartial('list_body_row', ['record' => $record, 'treeLevel' => $treeLevel]) ?>
|
||||
<?php endforeach ?>
|
||||
16
modules/backend/widgets/lists/partials/_list_body_tree.php
Normal file
16
modules/backend/widgets/lists/partials/_list_body_tree.php
Normal file
@@ -0,0 +1,16 @@
|
||||
<td class="list-tree nolink">
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="list-expand-collapse"
|
||||
data-request="<?= $this->getEventHandler('onToggleTreeNode') ?>"
|
||||
data-stripe-load-indicator
|
||||
data-request-data="node_id: '<?= $record->getKey() ?>', status: <?= $expanded ? 1 : 0 ?>">
|
||||
<?php if (!$childCount): ?>
|
||||
<i class="icon-square-o"></i>
|
||||
<?php elseif ($expanded): ?>
|
||||
<i class="icon-minus-square-o"></i>
|
||||
<?php else: ?>
|
||||
<i class="icon-plus-square-o"></i>
|
||||
<?php endif ?>
|
||||
</a>
|
||||
</td>
|
||||
58
modules/backend/widgets/lists/partials/_list_head_row.php
Normal file
58
modules/backend/widgets/lists/partials/_list_head_row.php
Normal file
@@ -0,0 +1,58 @@
|
||||
<tr>
|
||||
<?php if ($showCheckboxes && count($records)): ?>
|
||||
<th class="list-checkbox">
|
||||
<div class="checkbox custom-checkbox nolabel">
|
||||
<input type="checkbox" id="<?= $this->getId('checkboxAll') ?>" />
|
||||
<label for="<?= $this->getId('checkboxAll') ?>"></label>
|
||||
</div>
|
||||
</th>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if ($showTree): ?>
|
||||
<th class="list-tree">
|
||||
<span></span>
|
||||
</th>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if (!empty($sortable)): ?>
|
||||
<th class="list-sort-handle-column"><span></span></th>
|
||||
<?php endif ?>
|
||||
|
||||
<?php foreach ($columns as $key => $column): ?>
|
||||
<?php if ($showSorting && $column->sortable): ?>
|
||||
<th
|
||||
<?php if ($column->width): ?>
|
||||
style="width: <?= $column->width ?>"
|
||||
<?php endif ?>
|
||||
class="sortable <?= $this->sortColumn==$column->columnName?'sort-'.$this->sortDirection.' active':'' ?> list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->getAlignClass() ?> <?= $column->headCssClass ?>"
|
||||
>
|
||||
<a
|
||||
href="javascript:;"
|
||||
data-request="<?= $this->getEventHandler('onSort') ?>"
|
||||
data-stripe-load-indicator
|
||||
data-request-data="sortColumn: '<?= $column->columnName ?>', page: <?= $pageCurrent ?>">
|
||||
<?= $this->getHeaderValue($column) ?>
|
||||
</a>
|
||||
</th>
|
||||
<?php else: ?>
|
||||
<th
|
||||
<?php if ($column->width): ?>
|
||||
style="width: <?= $column->width ?>"
|
||||
<?php endif ?>
|
||||
class="list-cell-name-<?= $column->getName() ?> list-cell-type-<?= $column->type ?> <?= $column->getAlignClass() ?> <?= $column->headCssClass ?>"
|
||||
>
|
||||
<span><?= $this->getHeaderValue($column) ?></span>
|
||||
</th>
|
||||
<?php endif ?>
|
||||
<?php endforeach ?>
|
||||
|
||||
<?php if ($showSetup): ?>
|
||||
<th class="list-setup">
|
||||
<a href="javascript:;"
|
||||
id="<?= $this->getId('setupButton') ?>"
|
||||
title="<?= e(trans('backend::lang.list.setup_title')) ?>"
|
||||
data-control="popup"
|
||||
data-handler="<?= $this->getEventHandler('onLoadSetup') ?>"></a>
|
||||
</th>
|
||||
<?php endif ?>
|
||||
</tr>
|
||||
74
modules/backend/widgets/lists/partials/_list_pagination.php
Normal file
74
modules/backend/widgets/lists/partials/_list_pagination.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<div class="loading-indicator-container size-small pull-right">
|
||||
<div class="control-pagination loading-indicator-container">
|
||||
<span class="page-iteration">
|
||||
<?= e(trans('backend::lang.list.pagination', ['from' => $pageFrom, 'to' => $pageTo, 'total' => $recordTotal])) ?>
|
||||
</span>
|
||||
<?php if ($pageLast > 1): ?>
|
||||
<?php if ($pageCurrent > 1): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-first"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-request-data="page: 1"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.first_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-first"
|
||||
title="<?= e(trans('backend::lang.list.first_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<?php if ($pageCurrent > 1): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-back"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-request-data="page: <?= $pageCurrent-1 ?>"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-back"
|
||||
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<input
|
||||
type="number"
|
||||
name="page"
|
||||
value="<?= $pageCurrent ?>"
|
||||
min="1"
|
||||
step="1"
|
||||
max="<?= $pageLast ?>"
|
||||
class="form-control input-sm"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-track-input
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
autocomplete="off"
|
||||
style="width: auto; padding-left: 5px; padding-right: 0; display: inline; text-align: center;" />
|
||||
<?php if ($pageLast > $pageCurrent): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-next"
|
||||
data-request-data="page: <?= $pageCurrent+1 ?>"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.next_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-next"
|
||||
title="<?= e(trans('backend::lang.list.next_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<?php if ($pageLast > $pageCurrent): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-last"
|
||||
data-request-data="page: <?= $pageLast ?>"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.last_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-last"
|
||||
title="<?= e(trans('backend::lang.list.last_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,50 @@
|
||||
<div class="loading-indicator-container size-small pull-right">
|
||||
<div class="control-pagination">
|
||||
<?php if ($pageCurrent > 1): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-first"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-request-data="page: 1"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.first_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-first"
|
||||
title="<?= e(trans('backend::lang.list.first_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<?php if ($pageCurrent > 1): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-back"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-request-data="page: <?= $pageCurrent-1 ?>"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-back"
|
||||
title="<?= e(trans('backend::lang.list.prev_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
<select
|
||||
disabled
|
||||
name="page"
|
||||
class="form-control input-sm custom-select select-no-search"
|
||||
autocomplete="off">
|
||||
<option value="<?= $pageCurrent ?>" selected><?= $pageCurrent ?></option>
|
||||
</select>
|
||||
<?php if ($hasMorePages): ?>
|
||||
<a
|
||||
href="javascript:;"
|
||||
class="page-next"
|
||||
data-request-data="page: <?= $pageCurrent+1 ?>"
|
||||
data-request="<?= $this->getEventHandler('onPaginate') ?>"
|
||||
data-load-indicator="<?= e(trans('backend::lang.list.loading')) ?>"
|
||||
title="<?= e(trans('backend::lang.list.next_page')) ?>"></a>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="page-next"
|
||||
title="<?= e(trans('backend::lang.list.next_page')) ?>"></span>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</div>
|
||||
26
modules/backend/widgets/lists/partials/_list_totals.php
Normal file
26
modules/backend/widgets/lists/partials/_list_totals.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<tr class="table-totals">
|
||||
<?php if ($showCheckboxes): ?>
|
||||
<td></td>
|
||||
<?php endif ?>
|
||||
<?php if ($showTree): ?>
|
||||
<td class="list-tree">
|
||||
<span></span>
|
||||
</td>
|
||||
<?php endif ?>
|
||||
<?php foreach ($columns as $column): ?>
|
||||
<td>
|
||||
<?php if ($column->type == 'number' && $column->summable): ?>
|
||||
<?php $item = $sums[$column->columnName]; ?>
|
||||
<span>
|
||||
<?= $item['format'] ? sprintf($item['format'], $item['sum']) : number_format($item['sum'], 0, '.', ',') ?>
|
||||
<?php if (!is_null($item['total'])): ?>
|
||||
(<?= $item['format'] ? sprintf($item['format'], $item['total']) : number_format($item['total'], 0, '.', ',') ?>)
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
<?php endif ?>
|
||||
</td>
|
||||
<?php endforeach ?>
|
||||
<?php if ($showSetup): ?>
|
||||
<td></td>
|
||||
<?php endif; ?>
|
||||
</tr>
|
||||
74
modules/backend/widgets/lists/partials/_setup_form.php
Normal file
74
modules/backend/widgets/lists/partials/_setup_form.php
Normal file
@@ -0,0 +1,74 @@
|
||||
<?= Form::open(['data-request-parent' => '#' . $this->getId('setupButton')]) ?>
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('backend::lang.list.setup_title')) ?></h4>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="help-block before-field"><?= e(trans('backend::lang.list.setup_help')) ?></p>
|
||||
|
||||
<div class="control-simplelist with-checkboxes is-sortable" data-control="simplelist">
|
||||
<ul>
|
||||
<?php foreach ($columns as $key => $column): ?>
|
||||
<li>
|
||||
<div class="checkbox custom-checkbox">
|
||||
<input
|
||||
type="hidden"
|
||||
name="column_order[]"
|
||||
value="<?= e($column->columnName) ?>" />
|
||||
<input
|
||||
id="<?= $this->getId('setupCheckbox-'.$column->columnName) ?>"
|
||||
name="visible_columns[]"
|
||||
value="<?= e($column->columnName) ?>"
|
||||
<?= $column->invisible ? '' : 'checked="checked"' ?>
|
||||
type="checkbox" />
|
||||
<label
|
||||
class="choice"
|
||||
for="<?= $this->getId('setupCheckbox-'.$column->columnName) ?>">
|
||||
<?= e(trans($column->label)) ?>
|
||||
</label>
|
||||
</div>
|
||||
</li>
|
||||
<?php endforeach ?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<?php if ($this->showPagination): ?>
|
||||
<div class="form-group">
|
||||
<label><?= e(trans('backend::lang.list.records_per_page')) ?></label>
|
||||
<p class="help-block before-field">
|
||||
<?= e(trans('backend::lang.list.records_per_page_help')) ?>
|
||||
</p>
|
||||
<select class="form-control custom-select select-no-search" name="records_per_page">
|
||||
<?php foreach ($perPageOptions as $optionValue): ?>
|
||||
<option value="<?= $optionValue ?>" <?= $optionValue == $recordsPerPage ? 'selected="selected"' : '' ?>><?= $optionValue ?></option>
|
||||
<?php endforeach ?>
|
||||
</select>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-link pull-left"
|
||||
data-request="<?= $this->getEventHandler('onResetSetup') ?>"
|
||||
data-dismiss="popup"
|
||||
data-stripe-load-indicator>
|
||||
<?= e(trans('backend::lang.form.reset_default')) ?>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-primary"
|
||||
data-request="<?= $this->getEventHandler('onApplySetup') ?>"
|
||||
data-dismiss="popup"
|
||||
data-stripe-load-indicator>
|
||||
<?= e(trans('backend::lang.form.apply')) ?>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
<?= Form::close() ?>
|
||||
Reference in New Issue
Block a user