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:
14
modules/backend/controllers/users/_btn_impersonate.php
Normal file
14
modules/backend/controllers/users/_btn_impersonate.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php if ($this->user->hasAccess('backend.impersonate_users')): ?>
|
||||
<div class="loading-indicator-container">
|
||||
<button
|
||||
type="button"
|
||||
data-request="onImpersonateUser"
|
||||
data-load-indicator="<?= e(trans('backend::lang.account.impersonate_working')) ?>"
|
||||
data-request-confirm="<?= e(trans('backend::lang.account.impersonate_confirm')) ?>"
|
||||
class="btn btn-danger wn-icon-user-secret"
|
||||
style="width: 100%; text-align: center"
|
||||
>
|
||||
<?= e(trans('backend::lang.account.impersonate')) ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
12
modules/backend/controllers/users/_btn_password_reset.php
Normal file
12
modules/backend/controllers/users/_btn_password_reset.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<div class="loading-indicator-container">
|
||||
<button
|
||||
type="button"
|
||||
data-request="onManualPasswordReset"
|
||||
data-load-indicator="<?= e(trans('backend::lang.account.sending')) ?>"
|
||||
data-request-confirm="<?= e(trans('backend::lang.account.manual_password_reset_confirm')) ?>"
|
||||
class="btn btn-primary wn-icon-envelope"
|
||||
style="width: 100%; text-align: center"
|
||||
>
|
||||
<?= e(trans('backend::lang.account.password_reset_email')) ?>
|
||||
</button>
|
||||
</div>
|
||||
14
modules/backend/controllers/users/_btn_unsuspend.php
Normal file
14
modules/backend/controllers/users/_btn_unsuspend.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php if ($formModel->isSuspended()): ?>
|
||||
<div class="loading-indicator-container">
|
||||
<button
|
||||
type="button"
|
||||
data-request="onUnsuspendUser"
|
||||
data-load-indicator="<?= e(trans('backend::lang.account.unsuspend_working')) ?>"
|
||||
data-request-confirm="<?= e(trans('backend::lang.account.unsuspend_confirm')) ?>"
|
||||
class="btn btn-danger wn-icon-unlock-alt"
|
||||
style="width: 100%; text-align: center"
|
||||
>
|
||||
<?= e(trans('backend::lang.account.unsuspend')) ?>
|
||||
</button>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
9
modules/backend/controllers/users/_hint_trashed.php
Normal file
9
modules/backend/controllers/users/_hint_trashed.php
Normal file
@@ -0,0 +1,9 @@
|
||||
<div class="layout-row min-size">
|
||||
<div class="callout callout-danger">
|
||||
<div class="header">
|
||||
<i class="icon-trash"></i>
|
||||
<h3><?= e(trans('backend::lang.user.trashed_hint_title')) ?></h3>
|
||||
<p><?= e(trans('backend::lang.user.trashed_hint_desc')) ?></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
29
modules/backend/controllers/users/_list_toolbar.php
Normal file
29
modules/backend/controllers/users/_list_toolbar.php
Normal file
@@ -0,0 +1,29 @@
|
||||
<div data-control="toolbar">
|
||||
<a href="<?= Backend::url('backend/users/create') ?>" class="btn btn-primary wn-icon-plus">
|
||||
<?= e(trans('backend::lang.user.new')) ?>
|
||||
</a>
|
||||
<?php if ($this->user->isSuperUser()): ?>
|
||||
<a href="<?= Backend::url('backend/userroles') ?>" class="btn btn-default wn-icon-address-card">
|
||||
<?= e(trans('backend::lang.user.role.list_title')) ?>
|
||||
</a>
|
||||
<?php endif ?>
|
||||
<a href="<?= Backend::url('backend/usergroups') ?>" class="btn btn-default wn-icon-group">
|
||||
<?= e(trans('backend::lang.user.group.list_title')) ?>
|
||||
</a>
|
||||
<?php /* @todo
|
||||
<div class="btn-group">
|
||||
<button
|
||||
class="btn btn-default wn-icon-ban-circle"
|
||||
disabled="disabled"
|
||||
data-trigger-action="enable"
|
||||
data-trigger=".control-list input[type=checkbox]"
|
||||
data-trigger-condition="checked">Ban</button>
|
||||
<button
|
||||
class="btn btn-default wn-icon-trash-o"
|
||||
disabled="disabled"
|
||||
data-trigger-action="enable"
|
||||
data-trigger=".control-list input[type=checkbox]"
|
||||
data-trigger-condition="checked">Delete</button>
|
||||
</div>
|
||||
*/ ?>
|
||||
</div>
|
||||
30
modules/backend/controllers/users/config_filter.yaml
Normal file
30
modules/backend/controllers/users/config_filter.yaml
Normal file
@@ -0,0 +1,30 @@
|
||||
# ===================================
|
||||
# Filter Scope Definitions
|
||||
# ===================================
|
||||
|
||||
scopes:
|
||||
|
||||
is_superuser:
|
||||
label: backend::lang.user.superuser
|
||||
type: switch
|
||||
conditions:
|
||||
- is_superuser = 0
|
||||
- is_superuser = 1
|
||||
|
||||
login_date:
|
||||
label: backend::lang.user.last_login
|
||||
type: daterange
|
||||
conditions: last_login >= ':after' AND last_login <= ':before'
|
||||
|
||||
role_id:
|
||||
label: backend::lang.user.role.name
|
||||
modelClass: Backend\Models\UserRole
|
||||
conditions: role_id in (:filtered)
|
||||
nameFrom: name
|
||||
|
||||
show_deleted:
|
||||
label: backend::lang.user.show_deleted
|
||||
type: checkbox
|
||||
modelClass: Backend\Models\User
|
||||
scope: withTrashed
|
||||
default: 0
|
||||
16
modules/backend/controllers/users/config_form.yaml
Normal file
16
modules/backend/controllers/users/config_form.yaml
Normal file
@@ -0,0 +1,16 @@
|
||||
# ===================================
|
||||
# Form Behavior Config
|
||||
# ===================================
|
||||
|
||||
name: backend::lang.user.name
|
||||
form: ~/modules/backend/models/user/fields.yaml
|
||||
modelClass: Backend\Models\User
|
||||
defaultRedirect: backend/users
|
||||
|
||||
create:
|
||||
redirect: backend/users/update/:id
|
||||
redirectClose: backend/users
|
||||
|
||||
update:
|
||||
redirect: backend/users
|
||||
redirectClose: backend/users
|
||||
19
modules/backend/controllers/users/config_list.yaml
Normal file
19
modules/backend/controllers/users/config_list.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
# ===================================
|
||||
# List Behavior Config
|
||||
# ===================================
|
||||
|
||||
title: backend::lang.user.list_title
|
||||
list: ~/modules/backend/models/user/columns.yaml
|
||||
modelClass: Backend\Models\User
|
||||
recordUrl: backend/users/update/:id
|
||||
noRecordsMessage: backend::lang.list.no_records
|
||||
recordsPerPage: 20
|
||||
showSetup: true
|
||||
# showCheckboxes: true
|
||||
|
||||
toolbar:
|
||||
buttons: list_toolbar
|
||||
search:
|
||||
prompt: backend::lang.list.search_prompt
|
||||
|
||||
filter: config_filter.yaml
|
||||
31
modules/backend/controllers/users/config_relation.yaml
Normal file
31
modules/backend/controllers/users/config_relation.yaml
Normal file
@@ -0,0 +1,31 @@
|
||||
# ===================================
|
||||
# Relation Behavior Config
|
||||
# ===================================
|
||||
|
||||
throttle:
|
||||
label: backend::lang.user.throttle_tab_label
|
||||
view:
|
||||
list:
|
||||
columns:
|
||||
ip_address:
|
||||
label: backend::lang.user.throttle_ip_address
|
||||
searchable: true
|
||||
attempts:
|
||||
label: backend::lang.user.throttle_attempts
|
||||
width: 100px
|
||||
align: center
|
||||
last_attempt_at:
|
||||
label: backend::lang.user.throttle_last_attempt
|
||||
type: datetime
|
||||
searchable: true
|
||||
suspended_at:
|
||||
label: backend::lang.user.throttle_suspended_at
|
||||
type: datetime
|
||||
searchable: true
|
||||
toolbarButtons: delete|refresh
|
||||
showSearch: true
|
||||
showSorting: true
|
||||
recordsPerPage: 10
|
||||
defaultSort:
|
||||
column: last_attempt_at
|
||||
direction: desc
|
||||
68
modules/backend/controllers/users/myaccount.php
Normal file
68
modules/backend/controllers/users/myaccount.php
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php if ($this->user->hasAccess('backend.manage_users')): ?>
|
||||
<?php Block::put('breadcrumb') ?>
|
||||
<ul>
|
||||
<li><a href="<?= Backend::url('backend/users') ?>"><?= e(trans('backend::lang.user.menu_label')) ?></a></li>
|
||||
<li><?= e(trans($this->pageTitle)) ?></li>
|
||||
</ul>
|
||||
<?php Block::endPut() ?>
|
||||
<?php endif ?>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<?php Block::put('form-contents') ?>
|
||||
<div class="layout">
|
||||
|
||||
<div class="layout-row">
|
||||
<?= $this->formRenderOutsideFields() ?>
|
||||
<?= $this->formRenderPrimaryTabs() ?>
|
||||
</div>
|
||||
|
||||
<div class="form-buttons">
|
||||
<div class="loading-indicator-container">
|
||||
<button
|
||||
type="submit"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="redirect:0"
|
||||
data-hotkey="ctrl+s, cmd+s"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
class="btn btn-primary">
|
||||
<?= e(trans('backend::lang.form.save')) ?>
|
||||
</button>
|
||||
<?php if ($this->user->hasAccess('backend.manage_users')): ?>
|
||||
<button
|
||||
type="button"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="close:1"
|
||||
data-hotkey="ctrl+enter, cmd+enter"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
class="btn btn-default">
|
||||
<?= e(trans('backend::lang.form.save_and_close')) ?>
|
||||
</button>
|
||||
<?php endif ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php Block::put('form-sidebar') ?>
|
||||
<div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php Block::put('body') ?>
|
||||
<?= Form::open(['class'=>'layout stretch']) ?>
|
||||
<?= $this->makeLayout('form-with-sidebar') ?>
|
||||
<?= Form::close() ?>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php else: ?>
|
||||
<div class="control-breadcrumb">
|
||||
<?= Block::placeholder('breadcrumb') ?>
|
||||
</div>
|
||||
<div class="padded-container">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
<p><a href="<?= Backend::url('backend/users') ?>" class="btn btn-default"><?= e(trans('backend::lang.user.return')) ?></a></p>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
88
modules/backend/controllers/users/update.php
Normal file
88
modules/backend/controllers/users/update.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<?php Block::put('breadcrumb') ?>
|
||||
<ul>
|
||||
<li><a href="<?= Backend::url('backend/users') ?>"><?= e(trans('backend::lang.user.menu_label')) ?></a></li>
|
||||
<li><?= e(trans($this->pageTitle)) ?></li>
|
||||
</ul>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<?php Block::put('form-contents') ?>
|
||||
<?php if ($formModel->trashed()): ?>
|
||||
<?= $this->makePartial('hint_trashed') ?>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="layout">
|
||||
|
||||
<div class="layout-row">
|
||||
<?= $this->formRenderOutsideFields() ?>
|
||||
<?= $this->formRenderPrimaryTabs() ?>
|
||||
</div>
|
||||
|
||||
<div class="form-buttons">
|
||||
<div class="loading-indicator-container">
|
||||
<button
|
||||
type="submit"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="redirect:0"
|
||||
data-hotkey="ctrl+s, cmd+s"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
class="btn btn-primary">
|
||||
<?= e(trans('backend::lang.form.save')) ?>
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
data-request="onSave"
|
||||
data-browser-validate
|
||||
data-request-data="close:1"
|
||||
data-hotkey="ctrl+enter, cmd+enter"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.saving')) ?>"
|
||||
class="btn btn-default">
|
||||
<?= e(trans('backend::lang.form.save_and_close')) ?>
|
||||
</button>
|
||||
<span class="btn-text">
|
||||
<?= e(trans('backend::lang.form.or')) ?> <a href="<?= Backend::url('backend/users') ?>"><?= e(trans('backend::lang.form.cancel')) ?></a>
|
||||
</span>
|
||||
<?php if ($formModel->trashed()): ?>
|
||||
<button
|
||||
type="button"
|
||||
class="wn-icon-user-plus btn-icon info pull-right"
|
||||
data-request="onRestore"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.restoring')) ?>"
|
||||
data-request-confirm="<?= e(trans('backend::lang.form.confirm_restore')) ?>">
|
||||
</button>
|
||||
<?php else: ?>
|
||||
<button
|
||||
type="button"
|
||||
class="wn-icon-trash-o btn-icon danger pull-right"
|
||||
data-request="onDelete"
|
||||
data-load-indicator="<?= e(trans('backend::lang.form.deleting')) ?>"
|
||||
data-request-confirm="<?= e(trans('backend::lang.user.delete_confirm')) ?>">
|
||||
</button>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php Block::put('form-sidebar') ?>
|
||||
<div class="hide-tabs"><?= $this->formRenderSecondaryTabs() ?></div>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php Block::put('body') ?>
|
||||
<?= Form::open(['class'=>'layout stretch']) ?>
|
||||
<?= $this->makeLayout('form-with-sidebar') ?>
|
||||
<?= Form::close() ?>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php else: ?>
|
||||
<div class="control-breadcrumb">
|
||||
<?= Block::placeholder('breadcrumb') ?>
|
||||
</div>
|
||||
<div class="padded-container">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
<p><a href="<?= Backend::url('backend/users') ?>" class="btn btn-default"><?= e(trans('backend::lang.user.return')) ?></a></p>
|
||||
</div>
|
||||
<?php endif ?>
|
||||
Reference in New Issue
Block a user