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:
186
modules/system/assets/ui/js/select.js
Normal file
186
modules/system/assets/ui/js/select.js
Normal file
@@ -0,0 +1,186 @@
|
||||
/*
|
||||
* Select control
|
||||
*
|
||||
* Require:
|
||||
* - modernizr/modernizr
|
||||
* - select2/select2.full
|
||||
*/
|
||||
|
||||
(function($){
|
||||
|
||||
/*
|
||||
* Custom drop downs
|
||||
*/
|
||||
$(document).render(function(){
|
||||
var formatSelectOption = function(state) {
|
||||
var text = $('<span>').text(state.text).html()
|
||||
|
||||
if (!state.id) {
|
||||
return text // optgroup
|
||||
}
|
||||
|
||||
var $option = $(state.element),
|
||||
iconClass = state.icon ? state.icon : $option.data('icon'),
|
||||
imageSrc = state.image ? state.image : $option.data('image')
|
||||
|
||||
if (iconClass) {
|
||||
return '<i class="select-icon '+iconClass+'"></i> ' + text
|
||||
}
|
||||
|
||||
if (imageSrc) {
|
||||
return '<img class="select-image" src="'+imageSrc+'" alt="" /> ' + text
|
||||
}
|
||||
|
||||
return text
|
||||
}
|
||||
|
||||
var selectOptions = {
|
||||
templateResult: formatSelectOption,
|
||||
templateSelection: formatSelectOption,
|
||||
escapeMarkup: function(m) { return m },
|
||||
width: 'style'
|
||||
}
|
||||
|
||||
/*
|
||||
* Bind custom select
|
||||
*/
|
||||
$('select.custom-select').each(function(){
|
||||
var $element = $(this),
|
||||
extraOptions = {
|
||||
dropdownCssClass: '',
|
||||
containerCssClass: ''
|
||||
}
|
||||
|
||||
// Prevent duplicate loading
|
||||
if ($element.data('select2') != null) {
|
||||
return true; // Continue
|
||||
}
|
||||
|
||||
$element.attr('data-disposable', 'data-disposable')
|
||||
$element.one('dispose-control', function(){
|
||||
if ($element.data('select2')) {
|
||||
$element.select2('destroy')
|
||||
}
|
||||
})
|
||||
|
||||
if ($element.hasClass('select-no-search')) {
|
||||
extraOptions.minimumResultsForSearch = Infinity
|
||||
}
|
||||
if ($element.hasClass('select-modifiable')) {
|
||||
extraOptions.tags = true;
|
||||
|
||||
extraOptions.createTag = function (params) {
|
||||
var term = $.trim(params.term);
|
||||
|
||||
if (term === '') {
|
||||
return null;
|
||||
}
|
||||
|
||||
return {
|
||||
id: term,
|
||||
text: term,
|
||||
newTag: true
|
||||
};
|
||||
}
|
||||
|
||||
extraOptions.templateResult = function (state) {
|
||||
if (!state.id) {
|
||||
return state.text;
|
||||
}
|
||||
var icon = state.newTag ? '<i class="icon-plus"></i> ' : '';
|
||||
|
||||
return $(
|
||||
'<span>' + icon + state.text + '</span>'
|
||||
);
|
||||
}
|
||||
}
|
||||
if ($element.hasClass('select-no-dropdown')) {
|
||||
extraOptions.dropdownCssClass += ' select-no-dropdown'
|
||||
extraOptions.containerCssClass += ' select-no-dropdown'
|
||||
}
|
||||
|
||||
if ($element.hasClass('select-hide-selected')) {
|
||||
extraOptions.dropdownCssClass += ' select-hide-selected'
|
||||
}
|
||||
|
||||
/*
|
||||
* Winter AJAX
|
||||
*/
|
||||
var source = $element.data('handler');
|
||||
if (source) {
|
||||
extraOptions.ajax = {
|
||||
transport: function(params, success, failure) {
|
||||
var $request = $element.request(source, {
|
||||
data: params.data
|
||||
})
|
||||
|
||||
$request.done(success)
|
||||
$request.fail(failure)
|
||||
|
||||
return $request
|
||||
},
|
||||
processResults: function (data, params) {
|
||||
var results = data.result || data.results,
|
||||
options = []
|
||||
|
||||
delete(data.result)
|
||||
if (results[0] && typeof(results[0]) === 'object') { // Pass through Select2 format
|
||||
options = results
|
||||
}
|
||||
else { // Key-value map
|
||||
for (var i in results) {
|
||||
if (results.hasOwnProperty(i)) {
|
||||
options.push({
|
||||
id: i,
|
||||
text: results[i],
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data.results = options
|
||||
return data
|
||||
},
|
||||
dataType: 'json'
|
||||
}
|
||||
}
|
||||
|
||||
var separators = $element.data('token-separators')
|
||||
if (separators) {
|
||||
extraOptions.tags = true
|
||||
extraOptions.tokenSeparators = separators.split('|')
|
||||
|
||||
/*
|
||||
* When the dropdown is hidden, force the first option to be selected always.
|
||||
*/
|
||||
if ($element.hasClass('select-no-dropdown')) {
|
||||
extraOptions.selectOnClose = true
|
||||
extraOptions.closeOnSelect = true
|
||||
extraOptions.minimumInputLength = 1
|
||||
|
||||
$element.on('select2:closing', function() {
|
||||
if ($('.select2-dropdown.select-no-dropdown:first .select2-results__option--highlighted').length > 0) {
|
||||
$('.select2-dropdown.select-no-dropdown:first .select2-results__option--highlighted').removeClass('select2-results__option--highlighted')
|
||||
$('.select2-dropdown.select-no-dropdown:first .select2-results__option:first').addClass('select2-results__option--highlighted')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
var placeholder = $element.data('placeholder')
|
||||
if (placeholder) {
|
||||
extraOptions.placeholder = placeholder
|
||||
extraOptions.allowClear = true
|
||||
}
|
||||
|
||||
$element.select2($.extend({}, selectOptions, extraOptions))
|
||||
})
|
||||
})
|
||||
|
||||
$(document).on('disable', 'select.custom-select', function(event, status) {
|
||||
if ($(this).data('select2') != null) {
|
||||
$(this).select2('enable', !status)
|
||||
}
|
||||
})
|
||||
|
||||
})(jQuery);
|
||||
Reference in New Issue
Block a user