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:
54
modules/cms/controllers/themes/_theme_create_form.php
Normal file
54
modules/cms/controllers/themes/_theme_create_form.php
Normal file
@@ -0,0 +1,54 @@
|
||||
<?= Form::ajax('onCreate', [
|
||||
'id' => 'themeCreateForm',
|
||||
'data-popup-load-indicator' => true
|
||||
]) ?>
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('cms::lang.theme.create_title')) ?></h4>
|
||||
</div>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<?= $widget->render() ?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary">
|
||||
<?= e(trans('cms::lang.theme.create_button')) ?>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.close')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
setTimeout(
|
||||
function(){ $('#themeCreateForm input.form-control:first').focus() },
|
||||
310
|
||||
)
|
||||
</script>
|
||||
|
||||
<?= Form::close() ?>
|
||||
75
modules/cms/controllers/themes/_theme_duplicate_form.php
Normal file
75
modules/cms/controllers/themes/_theme_duplicate_form.php
Normal file
@@ -0,0 +1,75 @@
|
||||
<?= Form::ajax('onDuplicateTheme', [
|
||||
'id' => 'themeDuplicateForm',
|
||||
'data-popup-load-indicator' => true,
|
||||
]) ?>
|
||||
|
||||
<input type="hidden" name="theme" value="<?= $themeDir ?>" />
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('cms::lang.theme.duplicate_title')) ?>: <?= $themeDir ?></h4>
|
||||
</div>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
<div class="form-group text-field span-full">
|
||||
<label for="Form-ThemeDuplicate-newDirName">
|
||||
<?= e(trans('cms::lang.theme.new_directory_name_label')) ?>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
name="new_dir_name"
|
||||
id="Form-ThemeDuplicate-newDirName"
|
||||
value="<?= $themeDir ?>"
|
||||
placeholder=""
|
||||
class="form-control"
|
||||
autocomplete="off"
|
||||
maxlength="255" />
|
||||
|
||||
<p class="help-block">
|
||||
<?= e(trans('cms::lang.theme.new_directory_name_comment')) ?>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-success">
|
||||
<?= e(trans('cms::lang.theme.duplicate_button')) ?>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.close')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
setTimeout(
|
||||
function(){ $('#themeDuplicateForm input.form-control:first').focus() },
|
||||
310
|
||||
)
|
||||
</script>
|
||||
|
||||
<?= Form::close() ?>
|
||||
63
modules/cms/controllers/themes/_theme_export_form.php
Normal file
63
modules/cms/controllers/themes/_theme_export_form.php
Normal file
@@ -0,0 +1,63 @@
|
||||
<?= Form::ajax('onExport', [
|
||||
'id' => 'themeExportForm',
|
||||
'data-popup-load-indicator' => true,
|
||||
'data-request-success' => 'closeExportThemePopup()'
|
||||
]) ?>
|
||||
|
||||
<input type="hidden" name="theme" value="<?= $themeDir ?>" />
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('cms::lang.theme.export_title')) ?></h4>
|
||||
</div>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<?= $widget->render() ?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-success">
|
||||
<?= e(trans('cms::lang.theme.export_button')) ?>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.close')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
setTimeout(
|
||||
function(){ $('#themeExportForm input.form-control:first').focus() },
|
||||
310
|
||||
)
|
||||
|
||||
function closeExportThemePopup() {
|
||||
$('#themeExportForm')
|
||||
.closest('.control-popup')
|
||||
.popup('hideLoading')
|
||||
}
|
||||
</script>
|
||||
|
||||
<?= Form::close() ?>
|
||||
56
modules/cms/controllers/themes/_theme_fields_form.php
Normal file
56
modules/cms/controllers/themes/_theme_fields_form.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?= Form::ajax('onSaveFields', [
|
||||
'id' => 'themeFieldsForm',
|
||||
'data-popup-load-indicator' => true
|
||||
]) ?>
|
||||
|
||||
<input type="hidden" name="theme" value="<?= $themeDir ?>" />
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('cms::lang.theme.edit_properties_title')) ?>: <?= $themeDir ?></h4>
|
||||
</div>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<?= $widget->render() ?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary">
|
||||
<?= e(trans('cms::lang.theme.save_properties')) ?>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.close')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
setTimeout(
|
||||
function(){ $('#themeFieldsForm input.form-control:first').focus() },
|
||||
310
|
||||
)
|
||||
</script>
|
||||
|
||||
<?= Form::close() ?>
|
||||
57
modules/cms/controllers/themes/_theme_import_form.php
Normal file
57
modules/cms/controllers/themes/_theme_import_form.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?= Form::ajax('onImport', [
|
||||
'id' => 'themeImportForm',
|
||||
'data-popup-load-indicator' => true,
|
||||
]) ?>
|
||||
|
||||
<input type="hidden" name="theme" value="<?= $themeDir ?>" />
|
||||
<input type="hidden" name="mode" value="import" />
|
||||
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="popup">×</button>
|
||||
<h4 class="modal-title"><?= e(trans('cms::lang.theme.import_title')) ?></h4>
|
||||
</div>
|
||||
|
||||
<?php if (!$this->fatalError): ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<?= $widget->render() ?>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-success">
|
||||
<?= e(trans('cms::lang.theme.import_button')) ?>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.cancel')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php else: ?>
|
||||
|
||||
<div class="modal-body">
|
||||
<p class="flash-message static error"><?= e(trans($this->fatalError)) ?></p>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-default"
|
||||
data-dismiss="popup">
|
||||
<?= e(trans('backend::lang.form.close')) ?>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<?php endif ?>
|
||||
|
||||
<script>
|
||||
setTimeout(
|
||||
function(){ $('#themeImportForm input.form-control:first').focus() },
|
||||
310
|
||||
)
|
||||
</script>
|
||||
|
||||
<?= Form::close() ?>
|
||||
31
modules/cms/controllers/themes/_theme_list.php
Normal file
31
modules/cms/controllers/themes/_theme_list.php
Normal file
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
$themes = Cms\Classes\Theme::all();
|
||||
?>
|
||||
<?php foreach ($themes as $index => $theme): ?>
|
||||
|
||||
<div id="themeListItem-<?= $theme->getId() ?>" class="layout-row min-size <?= $theme->isActiveTheme() ? 'active' : null ?>">
|
||||
<?= $this->makePartial('theme_list_item', ['theme' => $theme]) ?>
|
||||
</div>
|
||||
|
||||
<?php endforeach ?>
|
||||
|
||||
<div class="layout-row links">
|
||||
<div class="layout-cell theme-thumbnail">
|
||||
<!-- Spacer -->
|
||||
</div>
|
||||
<div class="layout-cell theme-description">
|
||||
<a
|
||||
class="create-new-theme"
|
||||
data-control="popup"
|
||||
data-handler="onLoadCreateForm"
|
||||
data-size="huge"
|
||||
href="javascript:;">
|
||||
<?= e(trans('cms::lang.theme.create_new_blank_theme')) ?>
|
||||
</a>
|
||||
<a
|
||||
class="find-more-themes"
|
||||
href="<?= Backend::url('system/updates/install/themes') ?>">
|
||||
<?= e(trans('cms::lang.theme.find_more_themes')) ?>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
121
modules/cms/controllers/themes/_theme_list_item.php
Normal file
121
modules/cms/controllers/themes/_theme_list_item.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
$author = $theme->getConfigValue('author');
|
||||
?>
|
||||
|
||||
<div class="layout-cell min-height theme-thumbnail">
|
||||
<div class="thumbnail-container"><img src="<?= $theme->getPreviewImageUrl() ?>" alt="" /></div>
|
||||
</div>
|
||||
<div class="layout-cell min-height theme-description">
|
||||
<h3><?= e($theme->getConfigValue('name', $theme->getDirName())) ?></h3>
|
||||
<?php if (strlen($author)): ?>
|
||||
<p class="author"><?= trans('cms::lang.theme.by_author', ['name' => '<a href="'.e($theme->getConfigValue('homepage', '#')).'">'.e($author).'</a>']) ?></p>
|
||||
<?php endif ?>
|
||||
<p class="description">
|
||||
<?= e($theme->getConfigValue('description', 'The theme description is not provided.')) ?>
|
||||
</p>
|
||||
<div class="controls">
|
||||
|
||||
<?php if ($theme->isActiveTheme()): ?>
|
||||
<button
|
||||
type="submit"
|
||||
disabled
|
||||
class="btn btn-secondary btn-disabled">
|
||||
<i class="icon-star"></i>
|
||||
<?= e(trans('cms::lang.theme.active_button')) ?>
|
||||
</button>
|
||||
<?php else: ?>
|
||||
<button
|
||||
type="submit"
|
||||
data-request="onSetActiveTheme"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
data-stripe-load-indicator
|
||||
class="btn btn-primary">
|
||||
<i class="icon-check"></i>
|
||||
<?= e(trans('cms::lang.theme.activate_button')) ?>
|
||||
</button>
|
||||
<?php endif ?>
|
||||
<?php if ($theme->hasCustomData()): ?>
|
||||
<a
|
||||
href="<?= Backend::url('cms/themeoptions/update/'.$theme->getDirName()) ?>"
|
||||
class="btn btn-secondary<?= $theme->isActiveTheme() === false ? ' disabled' : '' ?>">
|
||||
<i class="icon-paint-brush"></i>
|
||||
<?= e(trans('cms::lang.theme.customize_button')) ?>
|
||||
</a>
|
||||
<?php endif ?>
|
||||
<div class="dropdown">
|
||||
<button
|
||||
data-toggle="dropdown"
|
||||
class="btn btn-secondary">
|
||||
<i class="icon-wrench"></i>
|
||||
<?= e(trans('cms::lang.theme.manage_button')) ?>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu" data-dropdown-title="<?= e(trans('cms::lang.theme.manage_title')) ?>">
|
||||
<li role="presentation">
|
||||
<a
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
data-control="popup"
|
||||
data-size="huge"
|
||||
data-handler="onLoadFieldsForm"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
href="javascript:;"
|
||||
class="wn-icon-pencil">
|
||||
<?= e(trans('cms::lang.theme.edit_properties_button')) ?>
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
data-control="popup"
|
||||
data-handler="onLoadDuplicateForm"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
href="javascript:;"
|
||||
class="wn-icon-copy">
|
||||
<?= e(trans('cms::lang.theme.duplicate_button')) ?>
|
||||
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
data-control="popup"
|
||||
data-handler="onLoadImportForm"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
href="javascript:;"
|
||||
class="wn-icon-upload">
|
||||
<?= e(trans('cms::lang.theme.import_button')) ?>
|
||||
</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
data-control="popup"
|
||||
data-handler="onLoadExportForm"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
href="javascript:;"
|
||||
class="wn-icon-download">
|
||||
<?= e(trans('cms::lang.theme.export_button')) ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php if (!$theme->isActiveTheme()): ?>
|
||||
<li role="presentation" class="divider"></li>
|
||||
<li role="presentation">
|
||||
<a
|
||||
role="menuitem"
|
||||
tabindex="-1"
|
||||
data-request="onDelete"
|
||||
data-request-confirm="<?= e(trans('cms::lang.theme.delete_confirm')) ?>"
|
||||
data-request-data="theme: '<?= e($theme->getDirName()) ?>'"
|
||||
href="javascript:;"
|
||||
class="wn-icon-trash">
|
||||
<?= e(trans('cms::lang.theme.delete_button')) ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif ?>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
13
modules/cms/controllers/themes/download.php
Normal file
13
modules/cms/controllers/themes/download.php
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php Block::put('breadcrumb') ?>
|
||||
<ul>
|
||||
<li><a href="<?= Backend::url('cms/themes') ?>"><?= e(trans('cms::lang.theme.theme_title')) ?></a></li>
|
||||
<li><?= e(trans($this->pageTitle)) ?></li>
|
||||
</ul>
|
||||
<?php Block::endPut() ?>
|
||||
|
||||
<?php if ($this->fatalError): ?>
|
||||
|
||||
<p class="flash-message static error"><?= e($this->fatalError) ?></p>
|
||||
<p><a href="<?= Backend::url('cms/themes') ?>" class="btn btn-default"><?= e(trans('cms::lang.theme.return')) ?></a></p>
|
||||
|
||||
<?php endif ?>
|
||||
11
modules/cms/controllers/themes/index.php
Normal file
11
modules/cms/controllers/themes/index.php
Normal file
@@ -0,0 +1,11 @@
|
||||
<?= Block::put('body') ?>
|
||||
<div class="layout">
|
||||
<div class="layout-row">
|
||||
<?= Form::open(['onsubmit'=>'return false']) ?>
|
||||
<div class="layout theme-selector-layout" id="theme-list">
|
||||
<?= $this->makePartial('theme_list') ?>
|
||||
</div>
|
||||
<?= Form::close() ?>
|
||||
</div>
|
||||
</div>
|
||||
<?= Block::endPut() ?>
|
||||
Reference in New Issue
Block a user