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,7 @@
|
||||
.export-behavior .export-columns {
|
||||
max-height: 400px;
|
||||
background: #f0f0f0;
|
||||
padding: 20px;
|
||||
padding-bottom: 0;
|
||||
overflow: auto;
|
||||
}
|
||||
164
modules/backend/behaviors/importexportcontroller/assets/css/import.css
vendored
Normal file
164
modules/backend/behaviors/importexportcontroller/assets/css/import.css
vendored
Normal file
@@ -0,0 +1,164 @@
|
||||
.import-behavior ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.import-behavior ul li {
|
||||
font-size: 13px;
|
||||
}
|
||||
.import-behavior ul li.placeholder {
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
.import-behavior ul li.dragged {
|
||||
position: absolute;
|
||||
z-index: 2000;
|
||||
-webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075);
|
||||
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.075);
|
||||
}
|
||||
.import-behavior .import-file-columns,
|
||||
.import-behavior .import-db-columns {
|
||||
height: 400px;
|
||||
background: #f0f0f0;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
}
|
||||
.import-behavior .import-file-columns .upload-prompt {
|
||||
display: block;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin-top: -10px;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul > li,
|
||||
.import-behavior .import-db-columns > ul > li {
|
||||
cursor: pointer;
|
||||
}
|
||||
.import-behavior ul li.dragged,
|
||||
.import-behavior .import-file-columns > ul > li,
|
||||
.import-behavior .import-db-columns > ul > li {
|
||||
background: #ffffff;
|
||||
border: 1px solid #cccccc;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.import-behavior ul li.dragged div.import-column-name > span,
|
||||
.import-behavior .import-file-columns > ul > li div.import-column-name > span,
|
||||
.import-behavior .import-db-columns > ul > li div.import-column-name > span,
|
||||
.import-behavior ul li.dragged > span,
|
||||
.import-behavior .import-file-columns > ul > li > span,
|
||||
.import-behavior .import-db-columns > ul > li > span {
|
||||
display: block;
|
||||
padding: 8px;
|
||||
padding-left: 12px;
|
||||
}
|
||||
.import-behavior .import-db-columns > ul > li .column-icon {
|
||||
color: #ccc;
|
||||
position: relative;
|
||||
left: -3px;
|
||||
}
|
||||
.import-behavior .import-db-columns > ul > li:hover .column-icon {
|
||||
color: #4da7e8;
|
||||
}
|
||||
.import-behavior .import-db-columns > ul > li.is-required .column-icon {
|
||||
color: #ab2a1c;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li:before,
|
||||
.import-behavior .import-file-columns > ul > li:after {
|
||||
content: " ";
|
||||
display: table;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li:after {
|
||||
clear: both;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li.is-ignored {
|
||||
display: none;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li .column-success-icon {
|
||||
display: none;
|
||||
position: relative;
|
||||
left: -2px;
|
||||
width: 15px;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li.is-matched .column-success-icon {
|
||||
display: inline-block;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul > li.is-matched .column-ignore-button {
|
||||
display: none !important;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul div.import-column-name {
|
||||
float: left;
|
||||
width: 45%;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul div.import-column-name > span {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul div.import-column-name a.column-label {
|
||||
color: #333;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul div.import-column-name a.column-ignore-button {
|
||||
color: #fff;
|
||||
background: #ccc;
|
||||
font-size: 10px;
|
||||
border-radius: 15px;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
top: -1px;
|
||||
left: -3px;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul div.import-column-name a.column-ignore-button:hover {
|
||||
background: #ab2a1c;
|
||||
}
|
||||
.import-behavior .import-file-columns > ul .import-column-bindings > ul {
|
||||
float: right;
|
||||
width: 55%;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul {
|
||||
background: #dadedf;
|
||||
position: relative;
|
||||
min-height: 34px;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul:after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top: 17px solid transparent;
|
||||
border-bottom: 17px solid transparent;
|
||||
border-left: 18px solid #ffffff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul:before {
|
||||
position: absolute;
|
||||
padding: 8px;
|
||||
padding-left: 28px;
|
||||
content: attr(data-empty-text);
|
||||
color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul > li .column-icon {
|
||||
color: #595959;
|
||||
float: right;
|
||||
margin: 3px;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul > li:hover .column-icon {
|
||||
color: #333333;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul > li:not(.dragged) {
|
||||
background: #e8eaeb;
|
||||
position: relative;
|
||||
}
|
||||
.import-behavior .import-column-bindings > ul > li:not(.dragged) > span {
|
||||
display: block;
|
||||
padding: 8px;
|
||||
padding-left: 28px;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Scripts for the Export controller behavior.
|
||||
*/
|
||||
+function ($) { "use strict";
|
||||
|
||||
var ExportBehavior = function() {
|
||||
|
||||
this.processExport = function () {
|
||||
var $form = $('#exportColumns').closest('form')
|
||||
|
||||
$form.request('onExport', {
|
||||
success: function(data) {
|
||||
$('#exportContainer').html(data.result)
|
||||
$(document).trigger('render')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$.wn.exportBehavior = new ExportBehavior;
|
||||
}(window.jQuery);
|
||||
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
* Scripts for the Import controller behavior.
|
||||
*/
|
||||
+function ($) { "use strict";
|
||||
|
||||
var ImportBehavior = function() {
|
||||
|
||||
this.processImport = function () {
|
||||
var $form = $('#importFileColumns').closest('form')
|
||||
|
||||
$form.request('onImport', {
|
||||
success: function(data) {
|
||||
$('#importContainer').html(data.result)
|
||||
$(document).trigger('render')
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
this.loadFileColumnSample = function(el) {
|
||||
var $el = $(el),
|
||||
$column = $el.closest('[data-column-id]'),
|
||||
columnId = $column.data('column-id')
|
||||
|
||||
$el.popup({
|
||||
handler: 'onImportLoadColumnSampleForm',
|
||||
extraData: {
|
||||
file_column_id: columnId
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
this.bindColumnSorting = function() {
|
||||
/*
|
||||
* Unbind existing
|
||||
*/
|
||||
$('#importDbColumns > ul, .import-column-bindings > ul').each(function(){
|
||||
var $this = $(this)
|
||||
if ($this.data('oc.sortable')) {
|
||||
$this.sortable('destroyGroup')
|
||||
$this.sortable('destroy')
|
||||
}
|
||||
})
|
||||
|
||||
var sortableOptions = {
|
||||
group: 'import-fields',
|
||||
usePlaceholderClone: true,
|
||||
nested: false,
|
||||
onDrop: $.proxy(this.onDropColumn, this)
|
||||
}
|
||||
|
||||
$('#importDbColumns > ul, .import-column-bindings > ul').sortable(sortableOptions)
|
||||
}
|
||||
|
||||
this.onDropColumn = function ($dbItem, container, _super, event) {
|
||||
var
|
||||
$fileColumns = $('#importFileColumns'),
|
||||
$fileItem,
|
||||
isMatch = $.contains($fileColumns.get(0), $dbItem.get(0)),
|
||||
matchColumnId
|
||||
|
||||
/*
|
||||
* Has a previous match?
|
||||
*/
|
||||
matchColumnId = $dbItem.data('column-matched-id')
|
||||
if (matchColumnId !== null) {
|
||||
$fileItem = $('[data-column-id='+matchColumnId+']', $fileColumns)
|
||||
this.toggleMatchState($fileItem)
|
||||
}
|
||||
|
||||
/*
|
||||
* Is a new match?
|
||||
*/
|
||||
if (isMatch) {
|
||||
$fileItem = $dbItem.closest('[data-column-id]'),
|
||||
this.matchColumn($dbItem, $fileItem)
|
||||
}
|
||||
else {
|
||||
this.unmatchColumn($dbItem)
|
||||
}
|
||||
|
||||
if (_super) {
|
||||
_super($dbItem, container)
|
||||
}
|
||||
}
|
||||
|
||||
this.toggleMatchState = function ($container) {
|
||||
var hasItems = !!$('.import-column-bindings li', $container).length
|
||||
$container.toggleClass('is-matched', hasItems)
|
||||
}
|
||||
|
||||
this.ignoreFileColumn = function(el) {
|
||||
var $el = $(el),
|
||||
$column = $el.closest('[data-column-id]')
|
||||
|
||||
$column.addClass('is-ignored')
|
||||
$('#showIgnoredColumnsButton').removeClass('disabled')
|
||||
}
|
||||
|
||||
this.showIgnoredColumns = function() {
|
||||
$('#importFileColumns li.is-ignored').removeClass('is-ignored')
|
||||
$('#showIgnoredColumnsButton').addClass('disabled')
|
||||
}
|
||||
|
||||
this.autoMatchColumns = function() {
|
||||
var self = this,
|
||||
fileColumns = {},
|
||||
$this,
|
||||
name
|
||||
|
||||
$('#importFileColumns li').each(function() {
|
||||
$this = $(this)
|
||||
name = $.trim($('.column-label', $this).text())
|
||||
fileColumns[name] = $this
|
||||
})
|
||||
|
||||
$('#importDbColumns li').each(function() {
|
||||
$this = $(this)
|
||||
name = $.trim($('> span', $this).text())
|
||||
if (fileColumns[name]) {
|
||||
|
||||
$this.appendTo($('.import-column-bindings > ul', fileColumns[name]))
|
||||
self.matchColumn($this, fileColumns[name])
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
this.matchColumn = function($dbItem, $fileItem) {
|
||||
var matchColumnId = $fileItem.data('column-id'),
|
||||
dbColumnName = $dbItem.data('column-name'),
|
||||
$dbItemMatchInput = $('[data-column-match-input]', $dbItem)
|
||||
|
||||
this.toggleMatchState($fileItem)
|
||||
|
||||
$dbItem.data('column-matched-id', matchColumnId)
|
||||
$dbItemMatchInput.attr('name', 'column_match['+matchColumnId+'][]')
|
||||
$dbItemMatchInput.attr('value', dbColumnName)
|
||||
}
|
||||
|
||||
this.unmatchColumn = function($dbItem) {
|
||||
var $dbItemMatchInput = $('[data-column-match-input]', $dbItem)
|
||||
|
||||
$dbItem.removeData('column-matched-id')
|
||||
$dbItemMatchInput.attr('name', '');
|
||||
$dbItemMatchInput.attr('value', '');
|
||||
}
|
||||
}
|
||||
|
||||
$.wn.importBehavior = new ImportBehavior;
|
||||
}(window.jQuery);
|
||||
@@ -0,0 +1,13 @@
|
||||
@import "../../../../assets/less/core/boot.less";
|
||||
|
||||
.export-behavior {
|
||||
|
||||
.export-columns {
|
||||
max-height: 400px;
|
||||
background: #f0f0f0;
|
||||
padding: @padding-standard;
|
||||
padding-bottom: 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
}
|
||||
201
modules/backend/behaviors/importexportcontroller/assets/less/import.less
vendored
Normal file
201
modules/backend/behaviors/importexportcontroller/assets/less/import.less
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
@import "../../../../assets/less/core/boot.less";
|
||||
|
||||
@color-import-column-bg: #fff;
|
||||
@color-import-column-border: #ccc;
|
||||
@color-import-bound-bg: #e8eaeb;
|
||||
@import-column-padding: 8px;
|
||||
@import-column-font-size: 13px;
|
||||
|
||||
.import-behavior {
|
||||
|
||||
ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style: none;
|
||||
|
||||
li {
|
||||
font-size: @import-column-font-size;
|
||||
}
|
||||
|
||||
li.placeholder {
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li.dragged {
|
||||
position: absolute;
|
||||
z-index: 2000;
|
||||
.box-shadow(0 3px 6px rgba(0,0,0,.075));
|
||||
}
|
||||
}
|
||||
|
||||
.import-file-columns,
|
||||
.import-db-columns {
|
||||
height: 400px;
|
||||
background: #f0f0f0;
|
||||
padding: 5px;
|
||||
overflow: auto;
|
||||
}
|
||||
.import-file-columns {
|
||||
.upload-prompt {
|
||||
display: block;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin-top: -10px;
|
||||
}
|
||||
}
|
||||
|
||||
.import-column-bindings > ul > li,
|
||||
.import-db-columns > ul > li {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
ul li.dragged,
|
||||
.import-file-columns > ul > li,
|
||||
.import-db-columns > ul > li {
|
||||
background: @color-import-column-bg;
|
||||
border: 1px solid @color-import-column-border;
|
||||
border-radius: 3px;
|
||||
margin-bottom: 5px;
|
||||
|
||||
div.import-column-name > span,
|
||||
> span {
|
||||
display: block;
|
||||
padding: @import-column-padding;
|
||||
padding-left: (@import-column-padding * 1.5);
|
||||
}
|
||||
}
|
||||
|
||||
.import-db-columns > ul {
|
||||
> li {
|
||||
.column-icon {
|
||||
color: #ccc;
|
||||
position: relative;
|
||||
left: -3px;
|
||||
}
|
||||
&:hover .column-icon {
|
||||
color: #4da7e8;
|
||||
}
|
||||
|
||||
&.is-required {
|
||||
.column-icon {
|
||||
color: @brand-danger;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.import-file-columns > ul {
|
||||
> li {
|
||||
.clearfix;
|
||||
|
||||
&.is-ignored {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.column-success-icon {
|
||||
display: none;
|
||||
position: relative;
|
||||
left: -2px;
|
||||
width: 15px;
|
||||
}
|
||||
|
||||
&.is-matched {
|
||||
.column-success-icon {
|
||||
display: inline-block;
|
||||
}
|
||||
.column-ignore-button {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
div.import-column-name {
|
||||
float: left;
|
||||
width: 45%;
|
||||
|
||||
> span {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
a.column-label {
|
||||
color: #333;
|
||||
}
|
||||
|
||||
a.column-ignore-button {
|
||||
color: #fff;
|
||||
background: #ccc;
|
||||
font-size: 10px;
|
||||
border-radius: 15px;
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
top: -1px;
|
||||
left: -3px;
|
||||
&:hover {
|
||||
background: @brand-danger;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.import-column-bindings > ul {
|
||||
float: right;
|
||||
width: 55%;
|
||||
}
|
||||
}
|
||||
|
||||
.import-column-bindings > ul {
|
||||
background: darken(@color-import-bound-bg, 5%);
|
||||
position: relative;
|
||||
min-height: (@import-column-padding * 2) + 18px;
|
||||
|
||||
&:after {
|
||||
.triangle(right, 18px, (@import-column-padding * 2) + 18px, @color-import-column-bg);
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
&:before {
|
||||
position: absolute;
|
||||
padding: @import-column-padding;
|
||||
padding-left: 28px;
|
||||
content: attr(data-empty-text);
|
||||
color: rgba(0,0,0,.5);
|
||||
}
|
||||
|
||||
> li {
|
||||
.column-icon {
|
||||
color: #595959;
|
||||
float: right;
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.column-icon {
|
||||
color: #333333;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
> li:not(.dragged) {
|
||||
background: @color-import-bound-bg;
|
||||
position: relative;
|
||||
|
||||
> span {
|
||||
display: block;
|
||||
padding: @import-column-padding;
|
||||
padding-left: 28px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user