Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Сборщик ЛГ формы
- * @tihoho, 07.07.2016
- */
- // Сбрасываем возможность перетаскивания панелей
- handleDraggablePanel = function(){};
- // Слайдеры
- var slider_w_w,
- slider_w_h,
- slider_b_br,
- slider_b_pad,
- slider_w_fs,
- slider_el_fs,
- slider_el_tah,
- slider_msg_fs,
- slider_msg_pad;
- // параметры конфига
- var w_w, w_h, b_br, b_pad,
- w_fs, el_fs, el_tah, msg_fs,
- msg_pad,msg_bg, msg_fg, b_dis,
- el_fg, wh_bg, wh_fg, el_bg,
- w_fg, w_bg, b_bg, b_fg;
- var LGFormBuilder = {
- /**
- * �нициализация
- */
- init: function() {
- this.config = {};
- this.config.elements = {};
- this.config.elements.arr = [];
- this.config.elements.string = '';
- this.config.styles = {};
- this.config.texts = {};
- this.elementsContainer = $('.elements-list');
- this.elementsPreviewContainer = $('#lgf_window #lgf_body');
- this.elementsMax = 5;
- this.wContainer = $('#lgf_window');
- this.wBtnSend = this.wContainer.find('#lgf_btn_send');
- this.wBtnSendTypes = ['', 'lgf-btn-send-default','lgf-btn-send-fullwidth','lgf-btn-send-winpart'];
- // Временные хранилища значений при ре-рендере формы
- this.__wc = false;
- this.__elc = false;
- this.__elbg = false;
- this.__wfs = false;
- this.__elfs = false;
- this.__msgfs = false;
- $('.lgfb-wrap input').trigger('onkeyup');
- },
- /**
- * �нициализация UI элементов билдера
- * (подставление текущих значений из конфига)
- */
- initUI: function(config) {
- console.log(config);
- this.config = config;
- // Перестраиваем DOM билдера
- for(elem in config.elements.arr) {
- var clone = $('.elements-item:eq(0)').clone();
- clone.find('[type=text]').val(config.elements.arr[elem].title);
- clone.find('[data-name="type"]').attr('data-value', config.elements.arr[elem].type);
- clone.find('[data-name="assoc"]').val(config.elements.arr[elem].assoc);
- clone.find('[type=checkbox]').attr('checked', config.elements.arr[elem].require);
- // меняем тип поля (input|textarea)
- if(config.elements.arr[elem].type == 'textarea') {
- clone.find('[data-name="type"]').find('a').toggleClass('active');
- }
- // добавляем клон в контейнер
- $('.elements-list').append(clone);
- }
- // Удаляем первый элемент, с которого делали копии
- $('.elements-item:eq(0)').remove();
- // Обновляем текста (приветствие, и кнопка)
- $('[name="msg_text"]').val(config.texts.msg);
- $('[name="b_send"]').val(config.texts.b_send);
- $('[name="b_send"]').trigger('keyup');
- // Обновляем тип кнопки отправки
- $('#btnSendDisplay').val(config.styles.b_dis);
- $('#btnSendDisplay').trigger('change');
- // Обновляем параметры конфига
- w_w = parseInt(config.styles.w_w.replace('px','')),
- w_h = parseInt(config.styles.w_h.replace('px','')),
- b_br = parseInt(config.styles.b_br.replace('px','')),
- b_pad = parseInt(config.styles.b_pad.replace('px','')),
- w_fs = parseInt(config.styles.w_fs.replace('px','')),
- el_fs = parseInt(config.styles.el_fs.replace('px','')),
- el_tah = parseInt(config.styles.el_tah.replace('px','')),
- msg_fs = parseInt(config.styles.msg_fs.replace('px','')),
- msg_pad = parseInt(config.styles.msg_pad.replace('px','')),
- msg_bg = config.styles.msg_bg,
- msg_fg = config.styles.msg_fg,
- b_dis = config.styles.b_dis,
- el_fg = config.styles.el_fg,
- wh_bg = config.styles.wh_bg,
- wh_fg = config.styles.wh_fg,
- el_bg = config.styles.el_bg,
- w_fg = config.styles.w_fg,
- w_bg = config.styles.w_bg,
- b_bg = config.styles.b_bg,
- b_fg = config.styles.b_fg;
- // Без таймаута слайдеры по нормальному инициализироваться не хотят
- setTimeout(function(){
- slider_w_w = new Powerange($('[name=window_w]')[0], { min: 200, max: 450, start: w_w });
- slider_w_h = new Powerange($('[name=window_h]')[0], { min: 300, max: 600, start: w_h });
- slider_b_br = new Powerange($('[name=btn_send_radius]')[0], { min: 0, max: 20, start: b_br, hideRange: true });
- slider_b_pad = new Powerange($('[name=btn_send_padding]')[0], { min: 0, max: 20, start: b_pad, hideRange: true });
- slider_w_fs = new Powerange($('[name=window_fontsize]')[0], { min: 11, max: 20, start: w_fs, hideRange: true, callback:function(){lgfb.__wfs = $('[name=window_fontsize]').val() + 'px'; lgfb.config.styles.w_fs = lgfb.__wfs; } });
- slider_el_fs = new Powerange($('[name=elements_fontsize]')[0], { min: 12, max: 20, start: el_fs, hideRange: true, callback:function(){lgfb.__elfs = $('[name=elements_fontsize]').val() + 'px'; lgfb.config.styles.el_fs = lgfb.__elfs; } });
- slider_el_tah = new Powerange($('[name=elements_textarea_h]')[0], { min: 40, max: 130, start: el_tah, hideRange: true, callback:function(){lgfb.__elth = $('[name=elements_textarea_h]').val() + 'px'; lgfb.config.styles.el_tah = lgfb.__elth; } });
- slider_msg_fs = new Powerange($('[name=msg_fontsize]')[0], { min: 12, max: 20, start: msg_fs, hideRange: true, callback:function(){lgfb.__msgfs = $('[name=msg_fontsize]').val() + 'px'; lgfb.config.styles.msg_fs = lgfb.__msgfs; } });
- slider_msg_pad = new Powerange($('[name=msg_padding]')[0], { min: 5, max: 20, start: msg_pad, hideRange: true });
- }, 100);
- // Красим триггеры колорпикеров
- $('#msgBackground').css('background', msg_bg);
- $('#msgColor').css('background', msg_fg);
- $('#btnSendBackground').css('background', b_bg);
- $('#btnSendColor').css('background', b_fg);
- $('#windowBackground').css('background', w_bg);
- $('#windowColor').css('background', w_fg);
- $('#elementsBackground').css('background', el_bg);
- $('#elementsColor').css('background', el_fg);
- $('#headerBackground').css('background', wh_bg);
- $('#headerColor').css('background', wh_fg);
- // Красим форму
- $('#lgf_btn_send').css('color', b_fg);
- $('#lgf_btn_send').css('background', b_bg);
- $('#lgf_window').css('background', w_bg);
- $('#lgf_window label').css('color', w_fg);
- $('#lgf_window input, #lgf_window textarea').css('background', el_bg);
- $('#lgf_window input, #lgf_window textarea').css('color', el_fg);
- $('#lgf_header').css('background', wh_bg);
- $('#lgf_title').css('color', wh_fg);
- $('#lgf_msg').css('color', msg_fg);
- //$('#lgf_msg').css('background', msg_bg);
- this.update();
- },
- /**
- * Возвращает готовый JSON конфиг формы
- */
- get: function() {
- this.update();
- return this.config;
- },
- /**
- * Обновляем всё
- */
- update: function() {
- this.elementsUpdate();
- },
- /**
- * Сохраняем настройки
- */
- save: function() {
- this.update();
- /**
- * Пробегаемся по всем стилям в конфиге
- * и если какой-то не определен - подставляем из конфига по умолчанию
- */
- for(param in this.config.styles) {
- var _current = this.config.styles[param];
- if(typeof(_current) == 'string' && _current == 'NaNpx') {
- this.config.styles[param] = lgfb_defaultConfig.styles[param];
- }
- }
- $.post('page|lgsettings_form.html', { lgsettingsform: JSON.stringify(this.config) })
- .done(function(response){
- notify('success', 'Успешно!', 'Настройки формы сохранены');
- console.log(response);
- })
- .fail(function(response){
- notify('error', 'Ошибка!', 'Сохранение настроек формы невозможно');
- console.log('XHR Error: ', response);
- });
- return this.get();
- },
- /**
- * Добавление элемента
- */
- addElement: function() {
- event.stopPropagation();
- if(this.config.elements.arr.length < this.elementsMax) {
- var elem = this.elementsContainer.find('.elements-item:last').clone();
- elem.find('input').val('');
- this.elementsContainer.append(elem);
- this.elementsUpdate();
- }
- },
- /**
- * Удаление элемента
- */
- removeElement: function(el) {
- if(this.config.elements.arr.length > 1) {
- $(el).parent().parent().parent().parent().remove();
- this.elementsUpdate();
- }
- },
- /**
- * Выбор типа элемента (input|textarea)
- */
- typeElement: function(el, type) {
- $(el).parent().attr('data-value', type);
- $(el).parent().find('a').removeClass('active');
- $(el).addClass('active');
- this.elementsUpdate();
- },
- /**
- * �лементы формы в массив объектов
- */
- elementsUpdate: function() {
- this.config.elements.arr = [];
- var _class = this;
- $('[data-element]').each(function(i,e){
- var title = $(e).find('[data-name=title]').val();
- var type = $(e).find('[data-name=type]').attr('data-value');
- var require = $(e).find('[data-name=require]').is(':checked') ? 1 : 0;
- var assoc = $(e).find('[data-name=assoc]').val();
- _class.config.elements.arr.push({
- title: title,
- type: type,
- require: require,
- assoc: assoc
- });
- });
- this.elementsToString();
- this.elementsPreview();
- // Временные хранилища значений при ре-рендере формы
- if(this.__wc) { $('#lgf_window label').css('color', this.__wc); }
- if(this.__elc) { $('#lgf_window input, #lgf_window textarea').css('color', this.__elc); }
- if(this.__elbg) { $('#lgf_window input, #lgf_window textarea').css('background', this.__elbg); }
- if(this.__wfs) { this.wContainer.find('label').css('font-size', this.__wfs); }
- if(this.__elfs) { this.wContainer.find('input, textarea').css('font-size', this.__elfs); }
- if(this.__elth) { this.wContainer.find('textarea').css('height', this.__elth); }
- // Обновляем цвета (т.к. они стираются при ре-рендере)
- $('#lgf_window input, #lgf_window textarea').css('background', this.config.styles.el_bg);
- $('#lgf_window input, #lgf_window textarea').css('color', this.config.styles.el_fg);
- $('#lgf_window label').css('color', this.config.styles.w_fg);
- },
- /**
- * Массив объектов элементов в строку
- * "type|title|require,..."
- */
- elementsToString: function() {
- var encoded = '';
- for(el in this.config.elements.arr) {
- var o = this.config.elements.arr[el];
- encoded += o.type + '|' + o.title + '|' + o.require + '|' + o.assoc + ',';
- }
- encoded = encoded.slice(0, -1);
- this.config.elements.string = encoded;
- return encoded;
- },
- /**
- * Превью элементов в окне
- */
- elementsPreview: function() {
- this.elementsPreviewContainer.empty();
- for(el in this.config.elements.arr) {
- var o = this.config.elements.arr[el];
- switch(o.type) {
- case 'input':
- $('<div class="form-group" style="margin-bottom:5px;"><label for="">' + o.title + '</label><input type="text" class="form-control" style="border:1px solid #b3b3b3;"></div>').appendTo(this.elementsPreviewContainer);
- break;
- case 'textarea':
- $('<div class="form-group" style="margin-bottom:5px;"><label for="">' + o.title + '</label><textarea class="form-control" style="border:1px solid #b3b3b3;"></textarea></div>').appendTo(this.elementsPreviewContainer);
- break;
- case 'checkbox':
- $('<div class="form-group" style="margin-bottom:5px;"><label for="">' + o.title + '</label> <input type="checkbox" checked="checked" /></div>').appendTo(this.elementsPreviewContainer);
- break;
- default:
- break;
- }
- }
- },
- /**
- * �зменение свойств окна
- */
- wChange: function(el, param) {
- switch(param) {
- // � азмер шрифта сообщения
- case 'msg_fontsize':
- this.wContainer.find('#lgf_msg').css('font-size', el.value + 'px');
- this.config.styles.msg_fs = el.value + 'px';
- break;
- // Padding сообщения
- case 'msg_padding':
- this.wContainer.find('#lgf_msg').css('padding', el.value + 'px');
- this.config.styles.msg_pad = el.value + 'px';
- break;
- // Padding сообщения
- case 'msg_text':
- this.wContainer.find('#lgf_msg').text(el.value);
- this.config.texts.msg = el.value;
- break;
- // � азмер шрифта окна
- case 'window_fontsize':
- this.wContainer.find('label').css('font-size', el.value + 'px');
- this.config.styles.w_fs = el.value + 'px';
- break;
- // � азмер шрифта полей
- case 'elements_fontsize':
- this.wContainer.find('input, textarea').css('font-size', el.value + 'px');
- this.config.styles.el_fs = el.value + 'px';
- break;
- // Высота textarea
- case 'elements_textarea_h':
- this.wContainer.find('textarea').css('height', el.value + 'px');
- this.config.styles.el_tah = el.value + 'px';
- break;
- // Ширина окна
- case 'window_w':
- this.wContainer.css('width', el.value + 'px');
- this.config.styles.w_w = el.value + 'px';
- break;
- // Высота окна
- case 'window_h':
- this.wContainer.css('height', el.value + 'px');
- this.config.styles.w_h = el.value + 'px';
- break;
- // Текст кнопки отправки
- case 'btn_send_text':
- this.wBtnSend.text(el.value);
- this.config.texts.b_send = el.value;
- break;
- // � адиус кнопки отправки
- case 'btn_send_radius':
- this.wBtnSend.css('border-radius', el.value + 'px');
- this.config.styles.b_br = el.value + 'px';
- break;
- // Padding кнопки отправки
- case 'btn_send_padding':
- this.wBtnSend.css('padding', el.value + 'px');
- this.config.styles.b_pad = el.value + 'px';
- break;
- // Тип отображения кнопки отправки
- case 'btn_send_display':
- this.wBtnSend.removeClass().addClass(this.wBtnSendTypes[parseInt(el.value)]);
- this.config.styles.b_dis = parseInt(el.value);
- break;
- default:
- break;
- }
- }
- };
- var lgfb = LGFormBuilder;
- $(function(){
- lgfb.init();
- // Если есть пользовательский конфиг
- if(lgfb_isCurrentConfig) {
- // инициализируем из него
- lgfb.initUI(lgfb_currentConfig);
- } else {
- // иначе из конфига по умолчанию
- lgfb.initUI(lgfb_defaultConfig);
- }
- //lgfb.update();
- $('[name=msg_text]').trigger('keyup');
- // Перемещение окна
- $('#lgf_window').draggable({ containment: 'body'});
- // Сортировка элементов
- $('.elements-list').sortable({ handle: '.sortable-trigger', update: function(e, ui){ lgfb.update(); }});
- $('#btnSendColor').ColorPicker({
- color: b_fg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#btnSendColor').css('backgroundColor', '#' + hex);
- $('#lgf_btn_send').css('color', '#' + hex);
- lgfb.config.styles.b_fg = '#' + hex;
- }
- });
- $('#btnSendBackground').ColorPicker({
- color: b_bg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#btnSendBackground').css('backgroundColor', '#' + hex);
- $('#lgf_btn_send').css('background', '#' + hex);
- lgfb.config.styles.b_bg = '#' + hex;
- }
- });
- $('#windowBackground').ColorPicker({
- color: w_bg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#windowBackground').css('backgroundColor', '#' + hex);
- $('#lgf_window').css('background', '#' + hex);
- lgfb.config.styles.w_bg = '#' + hex;
- }
- });
- $('#windowColor').ColorPicker({
- color: w_fg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#windowColor').css('backgroundColor', '#' + hex);
- $('#lgf_window label').css('color', '#' + hex);
- lgfb.__wc = '#' + hex;
- lgfb.config.styles.w_fg = '#' + hex;
- }
- });
- $('#elementsBackground').ColorPicker({
- color: el_bg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#elementsBackground').css('backgroundColor', '#' + hex);
- $('#lgf_window input, #lgf_window textarea').css('background', '#' + hex);
- lgfb.__elbg = '#' + hex;
- lgfb.config.styles.el_bg = '#' + hex;
- }
- });
- $('#elementsColor').ColorPicker({
- color: el_fg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#elementsColor').css('backgroundColor', '#' + hex);
- $('#lgf_window input, #lgf_window textarea').css('color', '#' + hex);
- lgfb.__elc = '#' + hex;
- lgfb.config.styles.el_fg = '#' + hex;
- }
- });
- $('#headerBackground').ColorPicker({
- color: wh_bg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#headerBackground').css('backgroundColor', '#' + hex);
- $('#lgf_header').css('background', '#' + hex);
- lgfb.config.styles.wh_bg = '#' + hex;
- }
- });
- $('#headerColor').ColorPicker({
- color: wh_fg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#headerColor').css('backgroundColor', '#' + hex);
- $('#lgf_title').css('color', '#' + hex);
- lgfb.config.styles.wh_fg = '#' + hex;
- }
- });
- $('#msgColor').ColorPicker({
- color: msg_fg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#msgColor').css('backgroundColor', '#' + hex);
- $('#lgf_msg').css('color', '#' + hex);
- lgfb.config.styles.msg_fg = '#' + hex;
- }
- });
- $('#msgBackground').ColorPicker({
- color: msg_bg,
- onShow: function (colpkr) { $(colpkr).fadeIn(500); return false; },
- onHide: function (colpkr) { $(colpkr).fadeOut(500); return false; },
- onChange: function (hsb, hex, rgb) {
- $('#msgBackground').css('backgroundColor', '#' + hex);
- $('#lgf_msg').css('background', '#' + hex);
- lgfb.config.styles.msg_bg = '#' + hex;
- }
- });
- });
- function notify(type, title, message) {
- var title = title || 'Успешно!';
- var message = message || 'Действие выполнено';
- var type = type || 'success';
- $.gritter.add({title: title, text: message, image:'/assets/img/icon_'+type+'.png', sticky: false, time: 3000 });
- }
Add Comment
Please, Sign In to add comment