From a3cff3b0db663ccf06270bc518a8d2ad7d03b341 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Wed, 3 Dec 2014 23:31:48 +0300 Subject: [PATCH 01/45] field type number --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 24acd5f..cec9c18 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -261,6 +261,8 @@ $.ddMM.mm_ddMultipleFields = { }else if(_this.instances[id].coloumns[key] == 'richtext'){ _this.makeRichtext(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); //По дефолту делаем текстовое поле + }else if(_this.instances[id].coloumns[key] == 'number'){ + _this.makeNumber(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); }else{ _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); } @@ -341,6 +343,9 @@ $.ddMM.mm_ddMultipleFields = { return $field.val(value).appendTo($fieldCol); }, + makeNumber: function(value, title, width, $fieldCol){ + return $('').appendTo($fieldCol); + }, //Make date field makeDate: function(value, title, $fieldCol){ //name нужен для DatePicker`а From 24da0da90ccc90ad075a32ea9730534e366a5e6f Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 4 Dec 2015 02:32:55 +0300 Subject: [PATCH 02/45] The default value in columnsData. If JSON (for select), the flag may be set to the third element, otherwise the first element is used --- .../jquery.ddMM.mm_ddMultipleFields.js | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index cec9c18..8383d4d 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -162,12 +162,12 @@ $.ddMM.mm_ddMultipleFields = { _this.instances[id].$addButton = _this.makeAddButton(id); for (var i = 0, len = arr.length; i < len; i++){ - //В случае, если размер массива был увеличен по minRow, значением будет undefined, посему зафигачим пустую строку - _this.makeFieldRow(id, arr[i] || ''); + //В случае, если размер массива был увеличен по minRow, значением будет undefined, вот и замечательно - то что нужно + _this.makeFieldRow(id, arr[i]); } //Втыкаем кнопку + куда надо - _this.instances[id].$addButton.appendTo($('#' + id + 'ddMultipleField .ddFieldBlock:last .ddFieldCol:last')); + _this.moveAddButton(id); //Добавляем возможность перетаскивания $ddMultipleField.sortable({ @@ -207,13 +207,27 @@ $.ddMM.mm_ddMultipleFields = { var $fieldBlock = $('
').appendTo($('#' + id + 'ddMultipleField')); //Разбиваем переданное значение на колонки - val = val.split(_this.instances[id].splX); + val = val ? _this.maskQuoutes(val).split(_this.instances[id].splX):[]; var $field; //Перебираем колонки $.each(_this.instances[id].coloumns, function(key){ - if (!val[key]){val[key] = '';} + if (typeof val[key]=='undefined'){ + //Значение по умолчанию. для JSON, искать флаг в 3-м элементе, или первое значение + if (val[key] = _this.instances[id].coloumnsData[key] || '' ) + try { + var valDef = val[key] = $.parseJSON(val[key]); + while($.isArray(valDef)) valDef=valDef.shift(); + $.each(val[key], function(k,v){ + if (v[2]) { + valDef = v[0]; + return false; + } + }); + val[key] = valDef; + } catch (e) {} + } if (!_this.instances[id].coloumnsTitle[key]){_this.instances[id].coloumnsTitle[key] = '';} if (!_this.instances[id].colWidth[key] || _this.instances[id].colWidth[key] == ''){_this.instances[id].colWidth[key] = _this.instances[id].colWidth[key - 1];} @@ -294,12 +308,8 @@ $.ddMM.mm_ddMultipleFields = { $par = $this.parents('.ddFieldBlock:first')/*, $table = $this.parents('.ddMultipleField:first')*/; - //Отчистим значения полей - $par.find('.ddField').val(''); - - //Если больше одной строки, то можно удалить текущую строчку - if ($par.siblings('.ddFieldBlock').length > 0){ $par.fadeOut(300, function(){ + var $siblingsL = $par.siblings('.ddFieldBlock').length; //Если контейнер имеет кнопку добалвения, перенесём её if ($par.find('.ddAddButton').length > 0){ _this.moveAddButton(id, $par.prev('.ddFieldBlock')); @@ -311,9 +321,14 @@ $.ddMM.mm_ddMultipleFields = { //При любом удалении показываем кнопку добавления _this.instances[id].$addButton.removeAttr('disabled'); + //Если было меньше одной строки, созданем новую строчку + if (!$siblingsL){ + _this.instances[id].$addButton = _this.makeAddButton(id); + _this.makeFieldRow(id); + _this.moveAddButton(id); + } return; }); - } }); }, //Функция создания кнопки +, вызывается при инициализации @@ -322,7 +337,7 @@ $.ddMM.mm_ddMultipleFields = { return $('').on('click', function(){ //Вешаем на кнопку создание новой строки - $(this).appendTo(_this.makeFieldRow(id, '').find('.ddFieldCol:last')); + $(this).appendTo(_this.makeFieldRow(id).find('.ddFieldCol:last')); }); }, //Перемещение кнопки + From 4562f2dc8233b8f2c81182aed041c739c0820f7c Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 3 Mar 2015 13:06:06 +0300 Subject: [PATCH 03/45] common control block with clear button --- ddmultiplefields/ddmultiplefields.php | 4 ++-- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 1d20c13..ae01780 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -48,8 +48,8 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = $output .= includeJsCss($widgetDir.'ddmultiplefields.css', 'html'); $output .= includeJsCss($widgetDir.'jquery.ddMM.mm_ddMultipleFields.js', 'html', 'jquery.ddMM.mm_ddMultipleFields', '1.1.1'); - $output .= includeJsCss('$j.ddMM.lang.edit = "'.$_lang['edit'].'";', 'html', 'mm_ddMultipleFields_plain', '1', true, 'js'); - + $output .= includeJsCss('$j.ddMM.lang.edit = "'.$_lang['edit'].'";$j.ddMM.lang.confirm_delete_record = "'.$_lang["confirm_delete_record"].'";', 'html', 'mm_ddMultipleFields_plain', '1', true, 'js'); + $e->output($output); }else if ($e->name == 'OnDocFormRender'){ global $mm_current_page; diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 8383d4d..0944ebb 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -120,9 +120,17 @@ $.ddMM.mm_ddMultipleFields = { //Принимает id оригинального поля, его значения и родителя поля init: function(id, val, target){ var _this = this, + //Блок для общих управляющих элементов + $ddMultipleFieldControl = $('
').appendTo(target), //Делаем таблицу мульти-полей, вешаем на таблицу функцию обновления оригинального поля $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; - + + //Кнопка очистки + $('').appendTo($ddMultipleFieldControl).on("click",function(e){ + e.preventDefault(); + $(".ddDeleteButton",$ddMultipleField).click(); + }); + //Если есть хоть один заголовок if (_this.instances[id].coloumnsTitle.length > 0){ var text = ''; From d2d9f01056113b3865d52a6cdf57dcd71c94b6a6 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Thu, 5 Mar 2015 00:15:45 +0300 Subject: [PATCH 04/45] [+] batch filling --- .../jquery.ddMM.mm_ddMultipleFields.js | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 0944ebb..76e70c7 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -158,7 +158,7 @@ $.ddMM.mm_ddMultipleFields = { //Делаем новые мульти-поля var arr = val.split(_this.instances[id].splY); - + //Проверяем на максимальное и минимальное количество строк if (_this.instances[id].maxRow && arr.length > _this.instances[id].maxRow){ arr.length = _this.instances[id].maxRow; @@ -192,6 +192,47 @@ $.ddMM.mm_ddMultipleFields = { _this.moveAddButton(id); } }); + // Возможность пакетного заполнения + var batchFields = ["image","file"]; + for (var k=0;k < _this.instances[id].coloumns.length; k++) + if ($.inArray(_this.instances[id].coloumns[k],batchFields)!=-1) { + _this.instances[id].batch={"type":this.instances[id].coloumns[k],"col":k}; + //Пока только для первого найденного + break; + } + if (_this.instances[id].batch) { + var BrowseServerMultiple = function (ctrl,type) { + type = (type!=('image'||'file')?"image":type)+"s"; + lastImageCtrl = ctrl; + var w = screen.width * 0.5; + var h = screen.height * 0.5; + OpenServerBrowser('media/browser/mcpuk/browse.php?opener=ddMultipleField&type='+type, w, h); + }; + $("").appendTo($ddMultipleFieldControl).click(function(e){ + e.preventDefault(); + window.KCFinder = { + callBackMultiple: function (files) { + window.KCFinder = null; + for (var i = 0; i < files.length; i++) { + var arr = []; + arr.length = _this.instances[id].coloumns.length; + arr[_this.instances[id].batch.col] = files[i]; + _this.makeFieldRow(id, arr.join(_this.instances[id].splX)); + } + _this.moveAddButton(id); + var checkEmpty = ""; + $(".ddFieldBlock:first input.ddField", $ddMultipleField).each(function () { + checkEmpty += $(this).val() + }); + if (!checkEmpty) $(".ddFieldBlock:first .ddDeleteButton", $ddMultipleField).click(); + }, + callBack: function (url) { + window.KCFinder.callBackMultiple([url]) + } + }; + BrowseServerMultiple(id,_this.instances[id].batch.type); + }); + } }, //Функция создания строки //Принимает id и данные строки @@ -215,7 +256,7 @@ $.ddMM.mm_ddMultipleFields = { var $fieldBlock = $('
').appendTo($('#' + id + 'ddMultipleField')); //Разбиваем переданное значение на колонки - val = val ? _this.maskQuoutes(val).split(_this.instances[id].splX):[]; + val = val ? val.split(_this.instances[id].splX):[]; var $field; From 41c788cdb7257732e6f0521a27adb405c7b8c1c9 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 8 Mar 2015 20:11:12 +0300 Subject: [PATCH 05/45] Refactor 1. Switch.. case. --- .../jquery.ddMM.mm_ddMultipleFields.js | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 76e70c7..6b830d2 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -283,7 +283,8 @@ $.ddMM.mm_ddMultipleFields = { var $col = _this.makeFieldCol($fieldBlock); //Если текущая колонка является изображением - if(_this.instances[id].coloumns[key] == 'image'){ + switch(_this.instances[id].coloumns[key]) { + case 'image' : $field = _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); _this.makeImage(id, $col); @@ -293,8 +294,9 @@ $.ddMM.mm_ddMultipleFields = { _this.instances[id].currentField = $(this).siblings('.ddField'); BrowseServer(id); }); + break; //Если текущая колонка является файлом - }else if(_this.instances[id].coloumns[key] == 'file'){ + case 'file': $field = _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); //Create Attach browse button @@ -302,8 +304,9 @@ $.ddMM.mm_ddMultipleFields = { _this.instances[id].currentField = $(this).siblings('.ddField'); BrowseFileServer(id); }); + break; //Если id - }else if (_this.instances[id].coloumns[key] == 'id'){ + case 'id': $field = _this.makeText(val[key], '', 0, $col); if (!($field.val())){ @@ -311,22 +314,28 @@ $.ddMM.mm_ddMultipleFields = { } $col.hide(); + break; //Если селект - }else if(_this.instances[id].coloumns[key] == 'select'){ + case 'select': _this.makeSelect(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].coloumnsData[key], _this.instances[id].colWidth[key], $col); + break; //Если дата - }else if(_this.instances[id].coloumns[key] == 'date'){ + case 'date': _this.makeDate(val[key], _this.instances[id].coloumnsTitle[key], $col); + break; //Если textarea - }else if(_this.instances[id].coloumns[key] == 'textarea'){ + case 'textarea': _this.makeTextarea(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); //Если richtext - }else if(_this.instances[id].coloumns[key] == 'richtext'){ + break; + case 'richtext': _this.makeRichtext(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); - //По дефолту делаем текстовое поле - }else if(_this.instances[id].coloumns[key] == 'number'){ + break; + case 'number': _this.makeNumber(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); - }else{ + break; + //По дефолту делаем текстовое поле + default: _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); } }); From 859bba891b2b434c5c5394e50109cf7c44d3abb9 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Wed, 11 Mar 2015 08:51:58 +0300 Subject: [PATCH 06/45] Refactor 2. optimize vars (smaller file size) --- .../jquery.ddMM.mm_ddMultipleFields.js | 122 +++++++++--------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 6b830d2..58072c5 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -43,19 +43,18 @@ $.ddMM.mm_ddMultipleFields = { richtextWindow: null, //Обновляет мульти-поле, берёт значение из оригинального поля updateField: function(id){ - var _this = this; - + var _inst = this.instances[id]; //Если есть текущее поле - if (_this.instances[id].currentField){ + if (_inst.currentField){ //Задаём значение текущему полю (берём у оригинального поля), запускаем событие изменения - _this.instances[id].currentField.val($.trim($('#' + id).val())).trigger('change.ddEvents'); + _inst.currentField.val($.trim($('#' + id).val())).trigger('change.ddEvents'); //Забываем текущее поле (ибо уже обработали) - _this.instances[id].currentField = false; + _inst.currentField = false; } }, //Обновляет оригинальное поле TV, собирая данные по мульти-полям updateTv: function(id){ - var _this = this, + var _inst = this.instances[id], masRows = new Array(); //Перебираем все строки @@ -71,7 +70,7 @@ $.ddMM.mm_ddMultipleFields = { //Перебираем все колонки, закидываем значения в массив $this.find('.ddField').each(function(index){ //Если поле с типом id TODO: Какой смысл по всех этих манипуляциях? - if (_this.instances[id].coloumns[index] == 'id'){ + if (_inst.coloumns[index] == 'id'){ id_field.index = index; id_field.$field = $(this); @@ -85,7 +84,7 @@ $.ddMM.mm_ddMultipleFields = { } //Если колонка типа richtext - if (_this.instances[id].coloumns[index] == 'richtext'){ + if (_inst.coloumns[index] == 'richtext'){ //Собираем значения строки в массив masCol.push($.trim($(this).html())); }else{ @@ -95,10 +94,10 @@ $.ddMM.mm_ddMultipleFields = { }); //Склеиваем значения колонок через разделитель - var col = masCol.join(_this.instances[id].splX); + var col = masCol.join(_inst.splX); //Если значение было хоть в одной колонке из всех в этой строке - if (col.length != ((masCol.length - 1) * _this.instances[id].splX.length)){ + if (col.length != ((masCol.length - 1) * _inst.splX.length)){ //Проверяем было ли поле с id if (id_field.index !== false){ //Записываем значение в поле @@ -106,7 +105,7 @@ $.ddMM.mm_ddMultipleFields = { //Обновляем значение в массиве masCol[id_field.index] = id_field.val; //Пересобираем строку - col = masCol.join(_this.instances[id].splX); + col = masCol.join(_inst.splX); } masRows.push(col); @@ -114,12 +113,13 @@ $.ddMM.mm_ddMultipleFields = { }); //Записываем значение в оригинальное поле - $('#' + id).val(masRows.join(_this.instances[id].splY)); + $('#' + id).val(masRows.join(_inst.splY)); }, //Инициализация //Принимает id оригинального поля, его значения и родителя поля init: function(id, val, target){ var _this = this, + _inst = _this.instances[id], //Блок для общих управляющих элементов $ddMultipleFieldControl = $('
').appendTo(target), //Делаем таблицу мульти-полей, вешаем на таблицу функцию обновления оригинального поля @@ -132,24 +132,24 @@ $.ddMM.mm_ddMultipleFields = { }); //Если есть хоть один заголовок - if (_this.instances[id].coloumnsTitle.length > 0){ + if (_inst.coloumnsTitle.length > 0){ var text = ''; //Создадим шапку (перебираем именно колонки!) - $.each(_this.instances[id].coloumns, function(key, val){ + $.each(_inst.coloumns, function(key, val){ //Если это колонка с id if (val == 'id'){ //Вставим пустое значение в массив с заголовками - _this.instances[id].coloumnsTitle.splice(key, 0, ''); + _inst.coloumnsTitle.splice(key, 0, ''); text += ''; }else{ //Если такого значения нет — сделаем - if (!_this.instances[id].coloumnsTitle[key]){ - _this.instances[id].coloumnsTitle[key] = ''; + if (!_inst.coloumnsTitle[key]){ + _inst.coloumnsTitle[key] = ''; } - text += '' + (_this.instances[id].coloumnsTitle[key]) + ''; + text += '' + (_inst.coloumnsTitle[key]) + ''; } }); @@ -157,17 +157,17 @@ $.ddMM.mm_ddMultipleFields = { } //Делаем новые мульти-поля - var arr = val.split(_this.instances[id].splY); + var arr = val.split(_inst.splY); //Проверяем на максимальное и минимальное количество строк - if (_this.instances[id].maxRow && arr.length > _this.instances[id].maxRow){ - arr.length = _this.instances[id].maxRow; - }else if (_this.instances[id].minRow && arr.length < _this.instances[id].minRow){ - arr.length = _this.instances[id].minRow; + if (_inst.maxRow && arr.length > _inst.maxRow){ + arr.length = _inst.maxRow; + }else if (_inst.minRow && arr.length < _inst.minRow){ + arr.length = _inst.minRow; } //Создаём кнопку + - _this.instances[id].$addButton = _this.makeAddButton(id); + _inst.$addButton = _this.makeAddButton(id); for (var i = 0, len = arr.length; i < len; i++){ //В случае, если размер массива был увеличен по minRow, значением будет undefined, вот и замечательно - то что нужно @@ -185,7 +185,7 @@ $.ddMM.mm_ddMultipleFields = { axis: 'y', placeholder: 'ui-state-highlight', start: function(event, ui){ - ui.placeholder.html('
').find('div').css('height', ui.item.height()); + ui.placeholder.html('
').find('div').css('height', ui.item.height()); }, stop: function(event, ui){ //Находим родителя таблицы, вызываем функцию обновления поля @@ -194,13 +194,13 @@ $.ddMM.mm_ddMultipleFields = { }); // Возможность пакетного заполнения var batchFields = ["image","file"]; - for (var k=0;k < _this.instances[id].coloumns.length; k++) - if ($.inArray(_this.instances[id].coloumns[k],batchFields)!=-1) { - _this.instances[id].batch={"type":this.instances[id].coloumns[k],"col":k}; + for (var k=0;k < _inst.coloumns.length; k++) + if ($.inArray(_inst.coloumns[k],batchFields)!=-1) { + _inst.batch={"type":this.instances[id].coloumns[k],"col":k}; //Пока только для первого найденного break; } - if (_this.instances[id].batch) { + if (_inst.batch) { var BrowseServerMultiple = function (ctrl,type) { type = (type!=('image'||'file')?"image":type)+"s"; lastImageCtrl = ctrl; @@ -215,9 +215,9 @@ $.ddMM.mm_ddMultipleFields = { window.KCFinder = null; for (var i = 0; i < files.length; i++) { var arr = []; - arr.length = _this.instances[id].coloumns.length; - arr[_this.instances[id].batch.col] = files[i]; - _this.makeFieldRow(id, arr.join(_this.instances[id].splX)); + arr.length = _inst.coloumns.length; + arr[_inst.batch.col] = files[i]; + _this.makeFieldRow(id, arr.join(_inst.splX)); } _this.moveAddButton(id); var checkEmpty = ""; @@ -230,7 +230,7 @@ $.ddMM.mm_ddMultipleFields = { window.KCFinder.callBackMultiple([url]) } }; - BrowseServerMultiple(id,_this.instances[id].batch.type); + BrowseServerMultiple(id,_inst.batch.type); }); } }, @@ -238,33 +238,34 @@ $.ddMM.mm_ddMultipleFields = { //Принимает id и данные строки makeFieldRow: function(id, val){ var _this = this; + var _inst = _this.instances[id]; //Если задано максимальное количество строк - if (_this.instances[id].maxRow){ + if (_inst.maxRow){ //Общее количество строк на данный момент var fieldBlocksLen = $('#' + id + 'ddMultipleField .ddFieldBlock').length; //Проверяем превышает ли уже количество строк максимальное - if (_this.instances[id].maxRow && fieldBlocksLen >= _this.instances[id].maxRow){ + if (_inst.maxRow && fieldBlocksLen >= _inst.maxRow){ return; //Если будет равно максимуму при создании этого поля - }else if (_this.instances[id].maxRow && fieldBlocksLen + 1 == _this.instances[id].maxRow){ - _this.instances[id].$addButton.attr('disabled', true); + }else if (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow){ + _inst.$addButton.attr('disabled', true); } } var $fieldBlock = $('
').appendTo($('#' + id + 'ddMultipleField')); //Разбиваем переданное значение на колонки - val = val ? val.split(_this.instances[id].splX):[]; + val = val ? val.split(_inst.splX):[]; var $field; //Перебираем колонки - $.each(_this.instances[id].coloumns, function(key){ + $.each(_inst.coloumns, function(key){ if (typeof val[key]=='undefined'){ //Значение по умолчанию. для JSON, искать флаг в 3-м элементе, или первое значение - if (val[key] = _this.instances[id].coloumnsData[key] || '' ) + if (val[key] = _inst.coloumnsData[key] || '' ) try { var valDef = val[key] = $.parseJSON(val[key]); while($.isArray(valDef)) valDef=valDef.shift(); @@ -277,31 +278,31 @@ $.ddMM.mm_ddMultipleFields = { val[key] = valDef; } catch (e) {} } - if (!_this.instances[id].coloumnsTitle[key]){_this.instances[id].coloumnsTitle[key] = '';} - if (!_this.instances[id].colWidth[key] || _this.instances[id].colWidth[key] == ''){_this.instances[id].colWidth[key] = _this.instances[id].colWidth[key - 1];} + if (!_inst.coloumnsTitle[key]){_inst.coloumnsTitle[key] = '';} + if (!_inst.colWidth[key] || _inst.colWidth[key] == ''){_inst.colWidth[key] = _inst.colWidth[key - 1];} var $col = _this.makeFieldCol($fieldBlock); //Если текущая колонка является изображением - switch(_this.instances[id].coloumns[key]) { + switch(_inst.coloumns[key]) { case 'image' : - $field = _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + $field = _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); _this.makeImage(id, $col); //Create Attach browse button $('').insertAfter($field).on('click', function(){ - _this.instances[id].currentField = $(this).siblings('.ddField'); + _inst.currentField = $(this).siblings('.ddField'); BrowseServer(id); }); break; //Если текущая колонка является файлом case 'file': - $field = _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + $field = _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); //Create Attach browse button $('').insertAfter($field).on('click', function(){ - _this.instances[id].currentField = $(this).siblings('.ddField'); + _inst.currentField = $(this).siblings('.ddField'); BrowseFileServer(id); }); break; @@ -317,26 +318,26 @@ $.ddMM.mm_ddMultipleFields = { break; //Если селект case 'select': - _this.makeSelect(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].coloumnsData[key], _this.instances[id].colWidth[key], $col); + _this.makeSelect(val[key], _inst.coloumnsTitle[key], _inst.coloumnsData[key], _inst.colWidth[key], $col); break; //Если дата case 'date': - _this.makeDate(val[key], _this.instances[id].coloumnsTitle[key], $col); + _this.makeDate(val[key], _inst.coloumnsTitle[key], $col); break; //Если textarea case 'textarea': - _this.makeTextarea(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + _this.makeTextarea(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); //Если richtext break; case 'richtext': - _this.makeRichtext(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + _this.makeRichtext(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); break; case 'number': - _this.makeNumber(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + _this.makeNumber(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); break; //По дефолту делаем текстовое поле default: - _this.makeText(val[key], _this.instances[id].coloumnsTitle[key], _this.instances[id].colWidth[key], $col); + _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); } }); @@ -355,10 +356,11 @@ $.ddMM.mm_ddMultipleFields = { //Make delete button makeDeleteButton: function(id, $fieldCol){ var _this = this; + var _inst = _this.instances[id]; $('').appendTo($fieldCol).on('click', function(){ //Проверяем на минимальное количество строк - if (_this.instances[id].minRow && $('#' + id + 'ddMultipleField .ddFieldBlock').length <= _this.instances[id].minRow){ + if (_inst.minRow && $('#' + id + 'ddMultipleField .ddFieldBlock').length <= _inst.minRow){ return; } @@ -377,11 +379,11 @@ $.ddMM.mm_ddMultipleFields = { $par.remove(); //При любом удалении показываем кнопку добавления - _this.instances[id].$addButton.removeAttr('disabled'); + _inst.$addButton.removeAttr('disabled'); //Если было меньше одной строки, созданем новую строчку if (!$siblingsL){ - _this.instances[id].$addButton = _this.makeAddButton(id); + _inst.$addButton = _this.makeAddButton(id); _this.makeFieldRow(id); _this.moveAddButton(id); } @@ -400,7 +402,7 @@ $.ddMM.mm_ddMultipleFields = { }, //Перемещение кнопки + moveAddButton: function(id, $target){ - var _this = this; + var _inst = this.instances[id]; //Если не передали, куда вставлять, вставляем в самый конец if (!$target){ @@ -408,7 +410,7 @@ $.ddMM.mm_ddMultipleFields = { } //Находим кнопку добавления и переносим куда надо - _this.instances[id].$addButton.appendTo($target.find('.ddFieldCol:last')); + _inst.$addButton.appendTo($target.find('.ddFieldCol:last')); }, //Make text field makeText: function(value, title, width, $fieldCol){ @@ -466,9 +468,9 @@ $.ddMM.mm_ddMultipleFields = { //Make image field makeImage: function(id, $fieldCol){ var _this = this; - + var _inst = _this.instances[id]; // Create a new preview and Attach a browse event to the picture, so it can trigger too - $('
').appendTo($fieldCol).hide().find('img').on('click', function(){ + $('
').appendTo($fieldCol).hide().find('img').on('click', function(){ $fieldCol.find('.ddAttachButton').trigger('click'); }).on('load.ddEvents', function(){ //Удаление дерьма, блеать (превьюшка, оставленная от виджета showimagetvs) From c95f285a8ff13111162bf61a39196ca52effc4c5 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sat, 28 Mar 2015 03:10:36 +0300 Subject: [PATCH 07/45] allow use universal sizes of images --- ddmultiplefields/ddmultiplefields.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index ae01780..cabe0cf 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -68,7 +68,9 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = } //Стиль превью изображения - $stylePrewiew = "max-width:{$imgW}px; max-height:{$imgH}px; margin: 4px 0; cursor: pointer;"; + $imgW = $imgW.(is_numeric($imgW)?"px":""); + $imgH = $imgH.(is_numeric($imgH)?"px":""); + $stylePrewiew = "max-width:{$imgW}; max-height:{$imgH}; margin: 4px 0; cursor: pointer;"; $tvsMas = tplUseTvs($mm_current_page['template'], $tvs, 'image,file,text,email,textarea', 'id,type'); if ($tvsMas == false){return;} From 0699716eac98482e171e867bdf592213fe532a4e Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sat, 28 Mar 2015 01:17:41 +0300 Subject: [PATCH 08/45] allow use universal parameter size of inputs (80%,5em,auto,etc) --- .../jquery.ddMM.mm_ddMultipleFields.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 58072c5..4ea4171 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -412,14 +412,20 @@ $.ddMM.mm_ddMultipleFields = { //Находим кнопку добавления и переносим куда надо _inst.$addButton.appendTo($target.find('.ddFieldCol:last')); }, + //Checking size values. Make it universal + _united:function(v,out){ + if (!v) return v; + v = v+($.isNumeric(v)?"px":""); + return (/\%s/.test(out)?out.replace("%s",v):v); + }, //Make text field makeText: function(value, title, width, $fieldCol){ - var $field = $(''); + var $field = $(''); return $field.val(value).appendTo($fieldCol); }, makeNumber: function(value, title, width, $fieldCol){ - return $('').appendTo($fieldCol); + return $('').appendTo($fieldCol); }, //Make date field makeDate: function(value, title, $fieldCol){ @@ -435,12 +441,12 @@ $.ddMM.mm_ddMultipleFields = { }, //Make textarea field makeTextarea: function(value, title, width, $fieldCol){ - return $('').appendTo($fieldCol); + return $('').appendTo($fieldCol); }, //Make richtext field makeRichtext: function(value, title, width, $fieldCol){ var _this = this, - $field = $('
' + value + '
').appendTo($fieldCol); + $field = $('
' + value + '
').appendTo($fieldCol); $('').appendTo($fieldCol).find('a').on('click', function(event){ _this.richtextWindow = window.open($.ddMM.config.site_url + $.ddMM.urls.mm + 'widgets/ddmultiplefields/richtext/index.php', 'mm_ddMultipleFields_richtext', new Array( From c0c081ef43dd68f15ad2f441c79f410e759213a5 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sat, 28 Mar 2015 01:22:12 +0300 Subject: [PATCH 09/45] more adaptive css --- ddmultiplefields/ddmultiplefields.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 8d45bd8..ef192a9 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -98,4 +98,16 @@ background: #f0f0f0; width: 100%; height: 100%; +} +.tab-page table { + width: 100%; +} +form#mutate select.inputBox, +form#mutate input, +form#mutate textarea { + width: auto; +} + +form#mutate select { + width: auto; } \ No newline at end of file From 3f78e36d93da207ce68890778188204028ce87a6 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sat, 28 Mar 2015 02:15:29 +0300 Subject: [PATCH 10/45] Copy row button --- .../jquery.ddMM.mm_ddMultipleFields.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 4ea4171..259e15b 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -343,7 +343,10 @@ $.ddMM.mm_ddMultipleFields = { //Create DeleteButton _this.makeDeleteButton(id, _this.makeFieldCol($fieldBlock)); - + + //Создаём кнопку copy + _this.makeCopyButton(id).appendTo($('#' + id + 'ddMultipleField .ddFieldCol:last')); + //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); @@ -400,6 +403,15 @@ $.ddMM.mm_ddMultipleFields = { $(this).appendTo(_this.makeFieldRow(id).find('.ddFieldCol:last')); }); }, + //Функция создания кнопки +, вызывается при инициализации + makeCopyButton: function(id){ + return $('').attr({"class":"ddCloneButton","type":"button","value":"©","title":"Copy row"}).on('click', function () { + //Вешаем на кнопку создание дубликата текущей строки + var p = $(this).closest("tr"); + var n=p.clone(true,true).insertAfter(p); + $('#' + id + 'ddMultipleField .ddFieldBlock:last').siblings().find(".ddAddButton").remove(); + }); + }, //Перемещение кнопки + moveAddButton: function(id, $target){ var _inst = this.instances[id]; From 9236f891a278c248fcec26dca8c23ac01d997719 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 29 Mar 2015 17:54:14 +0300 Subject: [PATCH 11/45] Clone button. fix interaction with other elements --- .../jquery.ddMM.mm_ddMultipleFields.js | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 259e15b..3f0ff21 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -251,6 +251,7 @@ $.ddMM.mm_ddMultipleFields = { //Если будет равно максимуму при создании этого поля }else if (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow){ _inst.$addButton.attr('disabled', true); + $(".ddCloneButton",'#' + id + 'ddMultipleField').attr("disabled",true); } } @@ -383,6 +384,7 @@ $.ddMM.mm_ddMultipleFields = { //При любом удалении показываем кнопку добавления _inst.$addButton.removeAttr('disabled'); + $(".ddCloneButton",'#' + id + 'ddMultipleField').removeAttr("disabled"); //Если было меньше одной строки, созданем новую строчку if (!$siblingsL){ @@ -404,12 +406,26 @@ $.ddMM.mm_ddMultipleFields = { }); }, //Функция создания кнопки +, вызывается при инициализации - makeCopyButton: function(id){ - return $('').attr({"class":"ddCloneButton","type":"button","value":"©","title":"Copy row"}).on('click', function () { + makeCopyButton: function (id) { //Вешаем на кнопку создание дубликата текущей строки - var p = $(this).closest("tr"); - var n=p.clone(true,true).insertAfter(p); - $('#' + id + 'ddMultipleField .ddFieldBlock:last').siblings().find(".ddAddButton").remove(); + var _this = this; + var fieldBlocks = $('#' + id + 'ddMultipleField .ddFieldBlock'); + var fieldBlocksLen = fieldBlocks.size(); + var _inst = _this.instances[id]; + return $('').attr({ + "class": "ddCloneButton", + "type": "button", + "value": "©", + "title": "Copy row", + "disabled": (_inst.maxRow && fieldBlocksLen == _inst.maxRow) ? "disabled" : false + }).on('click', function () { + var _parent = $(this).closest("tr"); + if ($(this).attr("disabled")) return false; + _parent.clone(true, true).find(".ddAddButton").remove().end().insertAfter(_parent); + _this.moveAddButton(id); + if (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow) { + $(".ddCloneButton,.ddAddButton", '#' + id + 'ddMultipleField').attr("disabled", true) + } }); }, //Перемещение кнопки + From 3563b707ac1e25bfc356a771b082393df4f760f4 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 29 Mar 2015 18:05:31 +0300 Subject: [PATCH 12/45] more compact headers --- ddmultiplefields/ddmultiplefields.css | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index ef192a9..7dc508f 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -39,11 +39,15 @@ vertical-align: top; } -.ddMultipleField tr th, .ddMultipleField tr td.ddFieldCol:last-child { +.ddMultipleField tr td.ddFieldCol:last-child { white-space: nowrap; } -.ddMultipleField tr th {text-align: left;} +.ddMultipleField tr th { + line-height: 1; + text-align: left; + vertical-align: bottom; +} .ddMultipleField tr td.ddFieldCol, .ddMultipleField tr td.ddSortHandle { border: 2px solid #FFFFFF; From e8c65c053f881f1df3524adc4f46f9d895dc6bd5 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 29 Mar 2015 19:11:41 +0300 Subject: [PATCH 13/45] Reset button --- .../jquery.ddMM.mm_ddMultipleFields.js | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 3f0ff21..0d84495 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -115,6 +115,15 @@ $.ddMM.mm_ddMultipleFields = { //Записываем значение в оригинальное поле $('#' + id).val(masRows.join(_inst.splY)); }, + _reset: function(id) { + var _this = this; + var _parent; + $.each("ddMultipleFieldControl,ddMultipleField".split(","),function(i,v){ + if (!_parent) _parent=$('#'+id+v).parent(); + $('#'+id+v).remove(); + }); + if (_parent) return _this.init(id,$('#'+id,_parent).val(),_parent); + }, //Инициализация //Принимает id оригинального поля, его значения и родителя поля init: function(id, val, target){ @@ -126,9 +135,14 @@ $.ddMM.mm_ddMultipleFields = { $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; //Кнопка очистки - $('').appendTo($ddMultipleFieldControl).on("click",function(e){ - e.preventDefault(); - $(".ddDeleteButton",$ddMultipleField).click(); + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + e.preventDefault(); + $(".ddDeleteButton", $ddMultipleField).click(); + }); + //Кнопка Reset + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + e.preventDefault(); + _this._reset(id); }); //Если есть хоть один заголовок From e99b956b8be44f454e4b7c3b1a88fa36eff83fc1 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Mon, 30 Mar 2015 03:45:45 +0300 Subject: [PATCH 14/45] new parameter - options: sortable (true/false) - now can switch off sortable showIndex (true/false) - now can show row index --- ddmultiplefields/ddmultiplefields.css | 11 ++++++++-- ddmultiplefields/ddmultiplefields.php | 5 +++-- .../jquery.ddMM.mm_ddMultipleFields.js | 22 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 7dc508f..72ed0e2 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -74,8 +74,8 @@ .ddMultipleField tr td.ddSortHandle div { /* border-radius: 0 12px 12px 0; */ background: #007CC3; - width: 10px; - height: 23px; + min-width: 1em; + min-height: 2em; -webkit-transition: opacity 0.3s ease-out; -moz-transition: opacity 0.3s ease-out; -ms-transition: opacity 0.3s ease-out; @@ -83,6 +83,13 @@ transition: opacity 0.3s ease-out; opacity: .3; cursor: n-resize; + color: white; + display: inline-block; + padding: 0.2em 0.3em 0.2em 0.25em; + box-sizing: border-box; +} +.ddMultipleField.nosort tr td.ddSortHandle div { + cursor: default; } .ddMultipleField tr.ddFieldBlock:hover td.ddFieldCol, .ddMultipleField tr.ddFieldBlock:hover td.ddSortHandle {background: #B2E3FF;} diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index cabe0cf..3aaa536 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -30,7 +30,7 @@ * http://www.DivanDesign.biz */ -function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = 'field', $columnsTitle = '', $colWidth = '180', $splY = '||', $splX = '::', $imgW = 300, $imgH = 100, $minRow = 0, $maxRow = 0, $columnsData = ''){ +function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = 'field', $columnsTitle = '', $colWidth = '180', $splY = '||', $splX = '::', $imgW = 300, $imgH = 100, $minRow = 0, $maxRow = 0, $columnsData = '',$options = array()){ if (!useThisRule($roles, $templates)){return;} global $modx; @@ -102,7 +102,8 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = colWidth: "'.$colWidth.'", imageStyle: "'.$stylePrewiew.'", minRow: "'.$minRow.'", - maxRow: "'.$maxRow.'" + maxRow: "'.$maxRow.'", + options: '.json_encode($options).' }); '; } diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 0d84495..7e7ba5a 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -30,7 +30,12 @@ $.ddMM.mm_ddMultipleFields = { //Минимальное количество строк minRow: 0, //Максимальное количество строк - maxRow: 0 + maxRow: 0, + //Различные опции + options: { + sortable:true, + showIndex:true + } }, // Все экземпляры (TV). Структура: { // 'id': { @@ -192,6 +197,7 @@ $.ddMM.mm_ddMultipleFields = { _this.moveAddButton(id); //Добавляем возможность перетаскивания + if (!_inst.options || _inst.options.sortable!==false) $ddMultipleField.sortable({ items: 'tr:has(td)', handle: '.ddSortHandle', @@ -253,11 +259,11 @@ $.ddMM.mm_ddMultipleFields = { makeFieldRow: function(id, val){ var _this = this; var _inst = _this.instances[id]; - + var _ddField = $('#' + id + 'ddMultipleField'); //Если задано максимальное количество строк if (_inst.maxRow){ //Общее количество строк на данный момент - var fieldBlocksLen = $('#' + id + 'ddMultipleField .ddFieldBlock').length; + var fieldBlocksLen = $('.ddFieldBlock',_ddField).length; //Проверяем превышает ли уже количество строк максимальное if (_inst.maxRow && fieldBlocksLen >= _inst.maxRow){ @@ -265,12 +271,14 @@ $.ddMM.mm_ddMultipleFields = { //Если будет равно максимуму при создании этого поля }else if (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow){ _inst.$addButton.attr('disabled', true); - $(".ddCloneButton",'#' + id + 'ddMultipleField').attr("disabled",true); + $(".ddCloneButton",_ddField).attr("disabled",true); } } - var $fieldBlock = $('
').appendTo($('#' + id + 'ddMultipleField')); - + var $fieldBlock = $('
').appendTo(_ddField); + if (!_inst.options || _inst.options.showIndex!==false) $fieldBlock.find("td:first *:not(:has(*))").html($fieldBlock.index()); + if (_inst.options && _inst.options.sortable===false) _ddField.addClass("nosort"); + //Разбиваем переданное значение на колонки val = val ? val.split(_inst.splX):[]; @@ -360,7 +368,7 @@ $.ddMM.mm_ddMultipleFields = { _this.makeDeleteButton(id, _this.makeFieldCol($fieldBlock)); //Создаём кнопку copy - _this.makeCopyButton(id).appendTo($('#' + id + 'ddMultipleField .ddFieldCol:last')); + _this.makeCopyButton(id).appendTo($('.ddFieldCol:last',_ddField)); //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); From fdb43cfe4a7cad0f888dd609057fdcffd78830d9 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 31 Mar 2015 11:00:32 +0300 Subject: [PATCH 15/45] cancel css width (conflict in child editor) --- ddmultiplefields/ddmultiplefields.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 72ed0e2..13a1417 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -110,9 +110,6 @@ width: 100%; height: 100%; } -.tab-page table { - width: 100%; -} form#mutate select.inputBox, form#mutate input, form#mutate textarea { From 393052a65b1b5a38ab2e3c3eb78dc60a28ec5142 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 31 Mar 2015 11:20:31 +0300 Subject: [PATCH 16/45] fix comments --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 7e7ba5a..81c5c75 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -120,6 +120,7 @@ $.ddMM.mm_ddMultipleFields = { //Записываем значение в оригинальное поле $('#' + id).val(masRows.join(_inst.splY)); }, + // Сброс на сохраненные значения (аналог reset form) _reset: function(id) { var _this = this; var _parent; @@ -427,7 +428,7 @@ $.ddMM.mm_ddMultipleFields = { $(this).appendTo(_this.makeFieldRow(id).find('.ddFieldCol:last')); }); }, - //Функция создания кнопки +, вызывается при инициализации + //Кнопка копирования строки makeCopyButton: function (id) { //Вешаем на кнопку создание дубликата текущей строки var _this = this; From fce21bdc3ba52d05e3ca6024656cc76c49e1bc90 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Wed, 1 Apr 2015 16:57:09 +0300 Subject: [PATCH 17/45] revert "more adaptive css" (689d5011f14f0028f9c0eb003dd9964af1cd2578) no need after "allow use universal parameter size of inputs (80%,5em,auto,etc)" (e96df12936e319f4113df7e4d36128faf1a4981) --- ddmultiplefields/ddmultiplefields.css | 9 --------- 1 file changed, 9 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 13a1417..9437d68 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -109,13 +109,4 @@ background: #f0f0f0; width: 100%; height: 100%; -} -form#mutate select.inputBox, -form#mutate input, -form#mutate textarea { - width: auto; -} - -form#mutate select { - width: auto; } \ No newline at end of file From 770234934aa257c5ff2a5774d148af0b2f0e7d9c Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 10 Apr 2015 03:25:21 +0300 Subject: [PATCH 18/45] Refactor --- .../jquery.ddMM.mm_ddMultipleFields.js | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 81c5c75..69df90c 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -158,6 +158,7 @@ $.ddMM.mm_ddMultipleFields = { //Создадим шапку (перебираем именно колонки!) $.each(_inst.coloumns, function(key, val){ //Если это колонка с id + var _cTitle = _inst.coloumnsTitle[key]; if (val == 'id'){ //Вставим пустое значение в массив с заголовками _inst.coloumnsTitle.splice(key, 0, ''); @@ -165,11 +166,11 @@ $.ddMM.mm_ddMultipleFields = { text += ''; }else{ //Если такого значения нет — сделаем - if (!_inst.coloumnsTitle[key]){ - _inst.coloumnsTitle[key] = ''; + if (!_cTitle){ + _cTitle = ''; } - text += '' + (_inst.coloumnsTitle[key]) + ''; + text += '' + (_cTitle) + ''; } }); @@ -287,6 +288,7 @@ $.ddMM.mm_ddMultipleFields = { //Перебираем колонки $.each(_inst.coloumns, function(key){ + var _cTitle = _inst.coloumnsTitle[key]; if (typeof val[key]=='undefined'){ //Значение по умолчанию. для JSON, искать флаг в 3-м элементе, или первое значение if (val[key] = _inst.coloumnsData[key] || '' ) @@ -302,7 +304,7 @@ $.ddMM.mm_ddMultipleFields = { val[key] = valDef; } catch (e) {} } - if (!_inst.coloumnsTitle[key]){_inst.coloumnsTitle[key] = '';} + if (!_cTitle){_cTitle = '';} if (!_inst.colWidth[key] || _inst.colWidth[key] == ''){_inst.colWidth[key] = _inst.colWidth[key - 1];} var $col = _this.makeFieldCol($fieldBlock); @@ -310,7 +312,7 @@ $.ddMM.mm_ddMultipleFields = { //Если текущая колонка является изображением switch(_inst.coloumns[key]) { case 'image' : - $field = _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + $field = _this.makeText(val[key], _cTitle, _inst.colWidth[key], $col); _this.makeImage(id, $col); @@ -322,7 +324,7 @@ $.ddMM.mm_ddMultipleFields = { break; //Если текущая колонка является файлом case 'file': - $field = _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + $field = _this.makeText(val[key], _cTitle, _inst.colWidth[key], $col); //Create Attach browse button $('').insertAfter($field).on('click', function(){ @@ -342,26 +344,26 @@ $.ddMM.mm_ddMultipleFields = { break; //Если селект case 'select': - _this.makeSelect(val[key], _inst.coloumnsTitle[key], _inst.coloumnsData[key], _inst.colWidth[key], $col); + _this.makeSelect(val[key], _cTitle, _inst.coloumnsData[key], _inst.colWidth[key], $col); break; //Если дата case 'date': - _this.makeDate(val[key], _inst.coloumnsTitle[key], $col); + _this.makeDate(val[key], _cTitle, $col); break; //Если textarea case 'textarea': - _this.makeTextarea(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + _this.makeTextarea(val[key], _cTitle, _inst.colWidth[key], $col); //Если richtext break; case 'richtext': - _this.makeRichtext(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + _this.makeRichtext(val[key], _cTitle, _inst.colWidth[key], $col); break; case 'number': - _this.makeNumber(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + _this.makeNumber(val[key], _cTitle, _inst.colWidth[key], $col); break; //По дефолту делаем текстовое поле default: - _this.makeText(val[key], _inst.coloumnsTitle[key], _inst.colWidth[key], $col); + _this.makeText(val[key], _cTitle, _inst.colWidth[key], $col); } }); From a5be4a79ac607bafe3f34039f7cd9b9f1b3d85ba Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 10 Apr 2015 04:08:17 +0300 Subject: [PATCH 19/45] Refactor and fix --- .../jquery.ddMM.mm_ddMultipleFields.js | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 69df90c..0ebcf67 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -153,28 +153,26 @@ $.ddMM.mm_ddMultipleFields = { //Если есть хоть один заголовок if (_inst.coloumnsTitle.length > 0){ - var text = ''; + var _thead = [$("")]; //Создадим шапку (перебираем именно колонки!) $.each(_inst.coloumns, function(key, val){ //Если это колонка с id - var _cTitle = _inst.coloumnsTitle[key]; if (val == 'id'){ //Вставим пустое значение в массив с заголовками _inst.coloumnsTitle.splice(key, 0, ''); - - text += ''; + _thead.push(''); }else{ + var _cTitle; //Если такого значения нет — сделаем - if (!_cTitle){ - _cTitle = ''; - } - - text += '' + (_cTitle) + ''; + if (!(_cTitle=_inst.coloumnsTitle[key])){ + _cTitle = _inst.coloumnsTitle[key] = ''; + } + _thead.push('' + (_cTitle) + ''); } }); - - $('' + text + '').appendTo($ddMultipleField); + _thead.push(''); + $("").append(_thead).appendTo($ddMultipleField); } //Делаем новые мульти-поля From e03f0e31111e5c3d4259734b55afb2cdd18e6190 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 10 Apr 2015 04:09:06 +0300 Subject: [PATCH 20/45] Tip for title --- ddmultiplefields/ddmultiplefields.css | 12 ++++++++++++ ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 9437d68..6b5619a 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -109,4 +109,16 @@ background: #f0f0f0; width: 100%; height: 100%; +} +.tip { + cursor: default; +} +.tip:after { + color: #999; + content: "?"; + display: inline-block; + font-size: 80%; + padding: 0.05em 0.15em; + text-align: center; + vertical-align: super; } \ No newline at end of file diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 0ebcf67..41e9864 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -168,6 +168,12 @@ $.ddMM.mm_ddMultipleFields = { if (!(_cTitle=_inst.coloumnsTitle[key])){ _cTitle = _inst.coloumnsTitle[key] = ''; } + // Подсказка для заголовка - расширенный текст после разделителя + var _titles = _cTitle.split(_inst.splX); + if (_titles.length>1) { + _cTitle = _inst.coloumnsTitle[key] = _titles[0]; + _thead.push('' + (_cTitle) + ''); + } else _thead.push('' + (_cTitle) + ''); } }); From 4aa987d4832860cdd9294525d9bdafec31021183 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 12 May 2015 11:26:01 +0300 Subject: [PATCH 21/45] =?UTF-8?q?=D0=94=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD=D0=BA=D0=B8=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=83=D0=BC=D0=BE=D0=BB=D1=87=D0=B0=D0=BD=D0=B8=D1=8E=20-=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D1=8B=D0=B4=D1=83=D1=89=D0=B8=D0=B9,?= =?UTF-8?q?=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BD=D0=B5=D1=82=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D0=BE=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BB=D0=BE=D0=BD=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 41e9864..88d0321 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -292,6 +292,7 @@ $.ddMM.mm_ddMultipleFields = { //Перебираем колонки $.each(_inst.coloumns, function(key){ + _inst.coloumnsData[key] && (_inst.coloumnsDataDefault = _inst.coloumnsData[key]) || (_inst.coloumnsDataDefault && ( _inst.coloumnsData[key]=_inst.coloumnsDataDefault )); var _cTitle = _inst.coloumnsTitle[key]; if (typeof val[key]=='undefined'){ //Значение по умолчанию. для JSON, искать флаг в 3-м элементе, или первое значение From 0153f859bcad7713b892426ff577641b4339a58c Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 12 May 2015 11:27:04 +0300 Subject: [PATCH 22/45] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20=D0=B4=D0=BB=D1=8F=20coloumnsData?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddmultiplefields/ddmultiplefields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 3aaa536..f3935ac 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -19,7 +19,7 @@ * @param $imgH {integer} - Maximum value of image preview height. Default: 100. * @param $minRow {integer} - Minimum number of strings. Default: 0. * @param $maxRow {integer} - Maximum number of strings. Default: 0 (без лимита). - * @param $columnsData {separated string} - List of valid values in json format (with “||”). Default: ''. + * @param $columnsData {separated string} - List of valid values in json format (with “||”). Default: ''. Example: '[['','No selected'],['0','No'],['1','Yes',1]]' * * @event OnDocFormPrerender * @event OnDocFormRender From 952a4d0b904c9f3580c907be773b3d8bb1f10b39 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 15 May 2015 08:07:51 +0300 Subject: [PATCH 23/45] =?UTF-8?q?=D1=88=D0=B8=D1=80=D0=B8=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=81=D0=B5=D0=BB=D0=B5=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 88d0321..12a6e75 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -559,7 +559,7 @@ $.ddMM.mm_ddMultipleFields = { }, //Функция создания списка makeSelect: function(value, title, data, width, $fieldCol){ - var $select = $(''); if (data){ var dataMas = $.parseJSON(data), From 2b004a81601b610a380a2df36372c0b661bef0c2 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 24 May 2015 16:36:47 +0300 Subject: [PATCH 24/45] fix numbering, refactoring --- .../jquery.ddMM.mm_ddMultipleFields.js | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 12a6e75..97299f1 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -138,7 +138,7 @@ $.ddMM.mm_ddMultipleFields = { //Блок для общих управляющих элементов $ddMultipleFieldControl = $('
').appendTo(target), //Делаем таблицу мульти-полей, вешаем на таблицу функцию обновления оригинального поля - $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; + $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; //Кнопка очистки $('').appendTo($ddMultipleFieldControl).on("click", function (e) { @@ -178,7 +178,7 @@ $.ddMM.mm_ddMultipleFields = { } }); _thead.push(''); - $("").append(_thead).appendTo($ddMultipleField); + $("").append($("").append(_thead)).prependTo($ddMultipleField); } //Делаем новые мульти-поля @@ -282,7 +282,6 @@ $.ddMM.mm_ddMultipleFields = { } var $fieldBlock = $('
').appendTo(_ddField); - if (!_inst.options || _inst.options.showIndex!==false) $fieldBlock.find("td:first *:not(:has(*))").html($fieldBlock.index()); if (_inst.options && _inst.options.sortable===false) _ddField.addClass("nosort"); //Разбиваем переданное значение на колонки @@ -376,13 +375,24 @@ $.ddMM.mm_ddMultipleFields = { _this.makeDeleteButton(id, _this.makeFieldCol($fieldBlock)); //Создаём кнопку copy - _this.makeCopyButton(id).appendTo($('.ddFieldCol:last',_ddField)); + _this.makeCopyButton(id).appendTo($('.ddFieldCol:last',$fieldBlock)); //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); + _this.numberingRows(id); return $fieldBlock; }, + //Нумерация строк + numberingRows: function(id){ + var _inst = this.instances[id]; + if (_inst.options && _inst.options.showIndex===false) return; + var _ddField = $('#' + id + 'ddMultipleField'); + $("tbody tr",_ddField).each(function(){ + var t=$(this); + t.find("td:first *:not(:has(*))").html(t.index()+1); + }) + }, //Создание колонки поля makeFieldCol: function($fieldRow){ return $('').appendTo($fieldRow); From 7472201d245932eea1981b4e0729a56874d22466 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 24 May 2015 16:47:29 +0300 Subject: [PATCH 25/45] some refactor --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 97299f1..93c3a92 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -243,7 +243,7 @@ $.ddMM.mm_ddMultipleFields = { var arr = []; arr.length = _inst.coloumns.length; arr[_inst.batch.col] = files[i]; - _this.makeFieldRow(id, arr.join(_inst.splX)); + _this.makeFieldRow(id, arr); } _this.moveAddButton(id); var checkEmpty = ""; @@ -285,7 +285,8 @@ $.ddMM.mm_ddMultipleFields = { if (_inst.options && _inst.options.sortable===false) _ddField.addClass("nosort"); //Разбиваем переданное значение на колонки - val = val ? val.split(_inst.splX):[]; + val = val ? val :[]; + if (typeof val=="string") val=val.split(_inst.splX); var $field; From 6625be2648ec9c76d78edba003f49cf5f4c32abb Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 24 May 2015 17:23:28 +0300 Subject: [PATCH 26/45] fix clone row --- .../jquery.ddMM.mm_ddMultipleFields.js | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 93c3a92..7d550e7 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -57,46 +57,50 @@ $.ddMM.mm_ddMultipleFields = { _inst.currentField = false; } }, + _getRowFields: function(id,ddFieldBlock,id_field) { + var _inst = this.instances[id], + masCol = []; + + //Перебираем все колонки, закидываем значения в массив + $(ddFieldBlock).find('.ddField').each(function(index){ + //Если поле с типом id + if (typeof id_field !=="undefined" && _inst.coloumns[index] == 'id'){ + id_field.index = index; + id_field.$field = $(this); + + //Сохраняем значение поля + id_field.val = id_field.$field.val(); + //Если значение пустое, то генерим + if (id_field.val == ''){id_field.val = (new Date).getTime();} + + //Обнуляем значение + id_field.$field.val(''); + } + //Если колонка типа richtext + if (_inst.coloumns[index] == 'richtext'){ + //Собираем значения строки в массив + masCol.push($.trim($(this).html())); + }else{ + //Собираем значения строки в массив + masCol.push($.trim($(this).val())); + } + }); + return masCol; + }, //Обновляет оригинальное поле TV, собирая данные по мульти-полям updateTv: function(id){ - var _inst = this.instances[id], - masRows = new Array(); + var _this = this, + _inst = _this.instances[id], + masRows = []; //Перебираем все строки $('#' + id + 'ddMultipleField .ddFieldBlock').each(function(){ - var $this = $(this), - masCol = new Array(), - id_field = { + var id_field = { index: false, val: false, $field: false }; - - //Перебираем все колонки, закидываем значения в массив - $this.find('.ddField').each(function(index){ - //Если поле с типом id TODO: Какой смысл по всех этих манипуляциях? - if (_inst.coloumns[index] == 'id'){ - id_field.index = index; - id_field.$field = $(this); - - //Сохраняем значение поля - id_field.val = id_field.$field.val(); - //Если значение пустое, то генерим - if (id_field.val == ''){id_field.val = (new Date).getTime();} - - //Обнуляем значение - id_field.$field.val(''); - } - - //Если колонка типа richtext - if (_inst.coloumns[index] == 'richtext'){ - //Собираем значения строки в массив - masCol.push($.trim($(this).html())); - }else{ - //Собираем значения строки в массив - masCol.push($.trim($(this).val())); - } - }); + var masCol = _this._getRowFields(id,this,id_field); //Склеиваем значения колонок через разделитель var col = masCol.join(_inst.splX); @@ -262,7 +266,7 @@ $.ddMM.mm_ddMultipleFields = { }, //Функция создания строки //Принимает id и данные строки - makeFieldRow: function(id, val){ + makeFieldRow: function(id, val,returnOnly){ var _this = this; var _inst = _this.instances[id]; var _ddField = $('#' + id + 'ddMultipleField'); @@ -281,7 +285,7 @@ $.ddMM.mm_ddMultipleFields = { } } - var $fieldBlock = $('
').appendTo(_ddField); + var $fieldBlock = $('
'); if (_inst.options && _inst.options.sortable===false) _ddField.addClass("nosort"); //Разбиваем переданное значение на колонки @@ -381,6 +385,7 @@ $.ddMM.mm_ddMultipleFields = { //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); + if (!returnOnly) $fieldBlock.appendTo($("tbody",_ddField)); _this.numberingRows(id); return $fieldBlock; }, @@ -460,9 +465,10 @@ $.ddMM.mm_ddMultipleFields = { "title": "Copy row", "disabled": (_inst.maxRow && fieldBlocksLen == _inst.maxRow) ? "disabled" : false }).on('click', function () { - var _parent = $(this).closest("tr"); if ($(this).attr("disabled")) return false; - _parent.clone(true, true).find(".ddAddButton").remove().end().insertAfter(_parent); + var ddFieldBlock = $(this).closest("tr"); + var rowData = _this._getRowFields(id,ddFieldBlock); + ddFieldBlock.after(_this.makeFieldRow(id,rowData,false)); _this.moveAddButton(id); if (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow) { $(".ddCloneButton,.ddAddButton", '#' + id + 'ddMultipleField').attr("disabled", true) From e9e7bf2274e217df8e78f8b8c9974fa2976af664 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 2 Jun 2015 02:12:31 +0300 Subject: [PATCH 27/45] Changes: [+] not buttons col if only one required row (max = min = 1) [+] no add and copy button if max is one row [*] fix titles tips while reset [*] fix attr disabled for buttons --- .../jquery.ddMM.mm_ddMultipleFields.js | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 7d550e7..391e0b0 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -144,11 +144,13 @@ $.ddMM.mm_ddMultipleFields = { //Делаем таблицу мульти-полей, вешаем на таблицу функцию обновления оригинального поля $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; + if (!(_inst.maxRow == 1 && _inst.minRow == 1)) { //Кнопка очистки - $('').appendTo($ddMultipleFieldControl).on("click", function (e) { - e.preventDefault(); - $(".ddDeleteButton", $ddMultipleField).click(); - }); + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + e.preventDefault(); + $(".ddDeleteButton"+(_inst.minRow?":gt("+(_inst.minRow-1)+")":""), $ddMultipleField).click(); + }); + } //Кнопка Reset $('').appendTo($ddMultipleFieldControl).on("click", function (e) { e.preventDefault(); @@ -175,13 +177,13 @@ $.ddMM.mm_ddMultipleFields = { // Подсказка для заголовка - расширенный текст после разделителя var _titles = _cTitle.split(_inst.splX); if (_titles.length>1) { - _cTitle = _inst.coloumnsTitle[key] = _titles[0]; + _cTitle = _titles[0]; _thead.push('' + (_cTitle) + ''); } else _thead.push('' + (_cTitle) + ''); } }); - _thead.push(''); + if (!(_inst.maxRow == 1 && _inst.minRow == 1)) _thead.push(''); $("").append($("").append(_thead)).prependTo($ddMultipleField); } @@ -203,6 +205,11 @@ $.ddMM.mm_ddMultipleFields = { _this.makeFieldRow(id, arr[i]); } + // Если только одна строка, то закончили + if (_inst.maxRow == 1) { + return; + } + //Втыкаем кнопку + куда надо _this.moveAddButton(id); @@ -297,7 +304,7 @@ $.ddMM.mm_ddMultipleFields = { //Перебираем колонки $.each(_inst.coloumns, function(key){ _inst.coloumnsData[key] && (_inst.coloumnsDataDefault = _inst.coloumnsData[key]) || (_inst.coloumnsDataDefault && ( _inst.coloumnsData[key]=_inst.coloumnsDataDefault )); - var _cTitle = _inst.coloumnsTitle[key]; + var _cTitle = _inst.coloumnsTitle[key]?_inst.coloumnsTitle[key].split(_inst.splX)[0]:''; if (typeof val[key]=='undefined'){ //Значение по умолчанию. для JSON, искать флаг в 3-м элементе, или первое значение if (val[key] = _inst.coloumnsData[key] || '' ) @@ -306,14 +313,13 @@ $.ddMM.mm_ddMultipleFields = { while($.isArray(valDef)) valDef=valDef.shift(); $.each(val[key], function(k,v){ if (v[2]) { - valDef = v[0]; + valDef = v[0]; return false; } }); val[key] = valDef; } catch (e) {} } - if (!_cTitle){_cTitle = '';} if (!_inst.colWidth[key] || _inst.colWidth[key] == ''){_inst.colWidth[key] = _inst.colWidth[key - 1];} var $col = _this.makeFieldCol($fieldBlock); @@ -375,12 +381,15 @@ $.ddMM.mm_ddMultipleFields = { _this.makeText(val[key], _cTitle, _inst.colWidth[key], $col); } }); - - //Create DeleteButton - _this.makeDeleteButton(id, _this.makeFieldCol($fieldBlock)); - //Создаём кнопку copy - _this.makeCopyButton(id).appendTo($('.ddFieldCol:last',$fieldBlock)); + // Если не одна обязательная строка + if (!(_inst.maxRow == 1 && _inst.minRow == 1)) { + //Create DeleteButton + _this.makeDeleteButton(id, _this.makeFieldCol($fieldBlock)); + + //Создаём кнопку copy + _inst.maxRow!=1 && _this.makeCopyButton(id).appendTo($('.ddFieldCol:last', $fieldBlock)); + } //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); @@ -407,17 +416,17 @@ $.ddMM.mm_ddMultipleFields = { makeDeleteButton: function(id, $fieldCol){ var _this = this; var _inst = _this.instances[id]; - + var _MField = $('#' + id + 'ddMultipleField'); + var _MFieldControl = $('#' + id + 'ddMultipleFieldControl'); $('').appendTo($fieldCol).on('click', function(){ //Проверяем на минимальное количество строк - if (_inst.minRow && $('#' + id + 'ddMultipleField .ddFieldBlock').length <= _inst.minRow){ + if (_inst.minRow && $('.ddFieldBlock',_MField).length <= _inst.minRow){ return; } var $this = $(this), $par = $this.parents('.ddFieldBlock:first')/*, $table = $this.parents('.ddMultipleField:first')*/; - $par.fadeOut(300, function(){ var $siblingsL = $par.siblings('.ddFieldBlock').length; //Если контейнер имеет кнопку добалвения, перенесём её @@ -430,17 +439,22 @@ $.ddMM.mm_ddMultipleFields = { //При любом удалении показываем кнопку добавления _inst.$addButton.removeAttr('disabled'); - $(".ddCloneButton",'#' + id + 'ddMultipleField').removeAttr("disabled"); + $(".ddCloneButton",_MField).removeAttr("disabled"); //Если было меньше одной строки, созданем новую строчку if (!$siblingsL){ - _inst.$addButton = _this.makeAddButton(id); + if (_inst.maxRow > 1 ) _inst.$addButton = _this.makeAddButton(id); _this.makeFieldRow(id); - _this.moveAddButton(id); + if (_inst.maxRow > 1 ) _this.moveAddButton(id); + } else if (_inst.minRow && $siblingsL <= _inst.minRow) { + $([_MFieldControl,_MField]).each(function(){$('.ddDeleteButton',this).attr("disabled","disabled");}); } - return; }); }); + // Для всех созданных кнопок проверяем состояние + $([_MFieldControl,_MField,$fieldCol]).each(function(){ + $(".ddDeleteButton",this).attr("disabled",(_inst.minRow && $('.ddFieldBlock',_MField).length < _inst.minRow) ? "disabled" : false); + }); }, //Функция создания кнопки +, вызывается при инициализации makeAddButton: function(id){ @@ -463,7 +477,7 @@ $.ddMM.mm_ddMultipleFields = { "type": "button", "value": "©", "title": "Copy row", - "disabled": (_inst.maxRow && fieldBlocksLen == _inst.maxRow) ? "disabled" : false + "disabled": (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow) ? "disabled" : false }).on('click', function () { if ($(this).attr("disabled")) return false; var ddFieldBlock = $(this).closest("tr"); From 9f5388a04a0d231a0d200caa69e4b58b661d2190 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Thu, 25 Feb 2016 17:34:13 +0300 Subject: [PATCH 28/45] [+] allow options directly in JSON --- ddmultiplefields/ddmultiplefields.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index f3935ac..62a0f54 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -32,7 +32,9 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = 'field', $columnsTitle = '', $colWidth = '180', $splY = '||', $splX = '::', $imgW = 300, $imgH = 100, $minRow = 0, $maxRow = 0, $columnsData = '',$options = array()){ if (!useThisRule($roles, $templates)){return;} - + if (is_array($options)) { + $options = json_encode($options); + } global $modx; $e = &$modx->Event; @@ -103,7 +105,7 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = imageStyle: "'.$stylePrewiew.'", minRow: "'.$minRow.'", maxRow: "'.$maxRow.'", - options: '.json_encode($options).' + options: '.$options.' }); '; } From 5a8dc22e71904dfb9cfd03177bbcd0b7339616d2 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Thu, 25 Feb 2016 17:51:56 +0300 Subject: [PATCH 29/45] [+] Option: Show button "Raw". Show/Hide the original field. Available standard copying and pasting. After pasting, press the reset button. --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 391e0b0..5b14b9d 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -34,7 +34,8 @@ $.ddMM.mm_ddMultipleFields = { //Различные опции options: { sortable:true, - showIndex:true + showIndex:true, + btnToggleRaw:false } }, // Все экземпляры (TV). Структура: { @@ -156,7 +157,13 @@ $.ddMM.mm_ddMultipleFields = { e.preventDefault(); _this._reset(id); }); - + // Кнопка "Показать/скрыть исходное значение". Простая возможность скопировать и вставить значение всего поля. + if (_inst.options.btnToggleRaw) { + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + e.preventDefault(); + $('#' + id).toggle(); + }); + } //Если есть хоть один заголовок if (_inst.coloumnsTitle.length > 0){ var _thead = [$("")]; From a33d0dc8b139500395ef357fa49dd07c870bb749 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Sun, 28 Feb 2016 18:34:38 +0300 Subject: [PATCH 30/45] options documentation --- ddmultiplefields/ddmultiplefields.php | 1 + 1 file changed, 1 insertion(+) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 62a0f54..5d76aec 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -20,6 +20,7 @@ * @param $minRow {integer} - Minimum number of strings. Default: 0. * @param $maxRow {integer} - Maximum number of strings. Default: 0 (без лимита). * @param $columnsData {separated string} - List of valid values in json format (with “||”). Default: ''. Example: '[['','No selected'],['0','No'],['1','Yes',1]]' + * @param $options {array or JSON} - Extend options: sortable - allow sorting (default), showIndex - display line numbers (default), btnToggleRaw - show button "Raw" (not defailt) * * @event OnDocFormPrerender * @event OnDocFormRender From eaf9a206914a0ae81bab4e0dcb942f1f95741f6e Mon Sep 17 00:00:00 2001 From: MrSwed Date: Wed, 9 Mar 2016 15:11:53 +0300 Subject: [PATCH 31/45] [+] multiselect [*] fix example description --- ddmultiplefields/ddmultiplefields.php | 4 ++-- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 5d76aec..52b1bb2 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -10,7 +10,7 @@ * @param $tvs {comma separated string} - Names of TV for which the widget is applying. @required * @param $roles {comma separated string} - The roles that the widget is applied to (when this parameter is empty then widget is applied to the all roles). Default: ''. * @param $templates {comma separated string} - Templates IDs for which the widget is applying (empty value means the widget is applying to all templates). Default: ''. - * @param $columns {comma separated string} - Column types: field — field type column; text — text type column; textarea — multiple lines column; richtext — column with rich text editor; date — date column; id — hidden column containing unique id; select — list with options (parameter “columnsData”). Default: 'field'. + * @param $columns {comma separated string} - Column types: field — field type column; text — text type column; textarea — multiple lines column; richtext — column with rich text editor; date — date column; id — hidden column containing unique id; select, multiselect — list with options (parameter “columnsData”). Default: 'field'. * @param $columnsTitle {comma separated string} - Columns titles. Default: ''. * @param $colWidth {comma separated string} - Columns width (one value can be set). Default: 180; * @param $splY {string} - Strings separator. Default: '||'. @@ -19,7 +19,7 @@ * @param $imgH {integer} - Maximum value of image preview height. Default: 100. * @param $minRow {integer} - Minimum number of strings. Default: 0. * @param $maxRow {integer} - Maximum number of strings. Default: 0 (без лимита). - * @param $columnsData {separated string} - List of valid values in json format (with “||”). Default: ''. Example: '[['','No selected'],['0','No'],['1','Yes',1]]' + * @param $columnsData {separated string} - List of valid values in json format (with “||”). Default: ''. Example: `[['','No selected'],['0','No'],['1','Yes',1]]` * @param $options {array or JSON} - Extend options: sortable - allow sorting (default), showIndex - display line numbers (default), btnToggleRaw - show button "Raw" (not defailt) * * @event OnDocFormPrerender diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 5b14b9d..40df50f 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -368,6 +368,10 @@ $.ddMM.mm_ddMultipleFields = { case 'select': _this.makeSelect(val[key], _cTitle, _inst.coloumnsData[key], _inst.colWidth[key], $col); break; + //Если мультиселект + case 'multiselect': + _this.makeSelect(val[key], _cTitle, _inst.coloumnsData[key], _inst.colWidth[key], $col,true); + break; //Если дата case 'date': _this.makeDate(val[key], _cTitle, $col); @@ -596,8 +600,8 @@ $.ddMM.mm_ddMultipleFields = { }); }, //Функция создания списка - makeSelect: function(value, title, data, width, $fieldCol){ - var $select = $(''); if (data){ var dataMas = $.parseJSON(data), @@ -610,7 +614,7 @@ $.ddMM.mm_ddMultipleFields = { $select.append(options); } - if (value){$select.val(value);} + if (value) {$select.val($multiple?value.split(","):value);} return $select.appendTo($fieldCol); }, From db04cc83893df894b7be2cb6ce6a2caefb61a654 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Thu, 12 May 2016 14:24:06 +0300 Subject: [PATCH 32/45] correct richedit window size for full toolbar --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 40df50f..56dcfd6 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -550,10 +550,10 @@ $.ddMM.mm_ddMultipleFields = { $('').appendTo($fieldCol).find('a').on('click', function(event){ _this.richtextWindow = window.open($.ddMM.config.site_url + $.ddMM.urls.mm + 'widgets/ddmultiplefields/richtext/index.php', 'mm_ddMultipleFields_richtext', new Array( - 'width=600', - 'height=550', - 'left=' + (($.ddTools.windowWidth - 600) / 2), - 'top=' + (($.ddTools.windowHeight - 550) / 2), + 'width=900', + 'height=560', + 'left=' + (($.ddTools.windowWidth - 900) / 2), + 'top=' + (($.ddTools.windowHeight - 560) / 2), 'menubar=no', 'toolbar=no', 'location=no', From 1156b3f812511d0518fe3c3e8af755fffa5dab5b Mon Sep 17 00:00:00 2001 From: MrSwed Date: Thu, 26 May 2016 21:19:23 +0300 Subject: [PATCH 33/45] fix using tables in richtext --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 56dcfd6..b853ea2 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -405,7 +405,7 @@ $.ddMM.mm_ddMultipleFields = { //Специально для полей, содержащих изображения необходимо инициализировать $('.ddFieldCol:has(.ddField_image) .ddField', $fieldBlock).trigger('change.ddEvents'); - if (!returnOnly) $fieldBlock.appendTo($("tbody",_ddField)); + if (!returnOnly) $fieldBlock.appendTo($(">tbody",_ddField)); _this.numberingRows(id); return $fieldBlock; }, @@ -414,7 +414,7 @@ $.ddMM.mm_ddMultipleFields = { var _inst = this.instances[id]; if (_inst.options && _inst.options.showIndex===false) return; var _ddField = $('#' + id + 'ddMultipleField'); - $("tbody tr",_ddField).each(function(){ + $(">tbody tr",_ddField).each(function(){ var t=$(this); t.find("td:first *:not(:has(*))").html(t.index()+1); }) From 3636e7b580bff2e6416d7b7a9e840b200023d381 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Mon, 27 Jun 2016 10:55:49 +0300 Subject: [PATCH 34/45] possible to hide common control panel options hideCommonControl : true --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index b853ea2..c49d577 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -33,9 +33,10 @@ $.ddMM.mm_ddMultipleFields = { maxRow: 0, //Различные опции options: { - sortable:true, - showIndex:true, - btnToggleRaw:false + sortable: true, + showIndex: true, + btnToggleRaw: false, + hideCommonControl: false } }, // Все экземпляры (TV). Структура: { @@ -144,7 +145,7 @@ $.ddMM.mm_ddMultipleFields = { $ddMultipleFieldControl = $('
').appendTo(target), //Делаем таблицу мульти-полей, вешаем на таблицу функцию обновления оригинального поля $ddMultipleField = $('
').appendTo(target)/*.on('change.ddEvents', function(){_this.updateTv(id);})*/; - + if (_inst.options.hideCommonControl) $ddMultipleFieldControl.hide(); if (!(_inst.maxRow == 1 && _inst.minRow == 1)) { //Кнопка очистки $('').appendTo($ddMultipleFieldControl).on("click", function (e) { From bf6709892c70d9dbbda7b904b5a64672147f614e Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 28 Jun 2016 10:47:13 +0300 Subject: [PATCH 35/45] Confirm clear all https://github.com/DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields/issues/3 --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index c49d577..1d2a478 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -148,9 +148,9 @@ $.ddMM.mm_ddMultipleFields = { if (_inst.options.hideCommonControl) $ddMultipleFieldControl.hide(); if (!(_inst.maxRow == 1 && _inst.minRow == 1)) { //Кнопка очистки - $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { e.preventDefault(); - $(".ddDeleteButton"+(_inst.minRow?":gt("+(_inst.minRow-1)+")":""), $ddMultipleField).click(); + if(confirm($.ddMM.lang.confirm_delete_record))$(".ddDeleteButton"+(_inst.minRow?":gt("+(_inst.minRow-1)+")":""), $ddMultipleField).click(); }); } //Кнопка Reset From a926016d626f407aa4ea7dc6b16ee0e5b191da00 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Fri, 12 Aug 2016 17:04:56 +0300 Subject: [PATCH 36/45] refactor deprecated --- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 1d2a478..4c14106 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -482,7 +482,7 @@ $.ddMM.mm_ddMultipleFields = { //Вешаем на кнопку создание дубликата текущей строки var _this = this; var fieldBlocks = $('#' + id + 'ddMultipleField .ddFieldBlock'); - var fieldBlocksLen = fieldBlocks.size(); + var fieldBlocksLen = fieldBlocks.length; var _inst = _this.instances[id]; return $('').attr({ "class": "ddCloneButton", From ee6ac697711dae3343b72791fc845ef1b2ef9aa7 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 31 Jan 2017 14:20:53 +0300 Subject: [PATCH 37/45] [+] add languages https://github.com/DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields/issues/9 --- ddmultiplefields/ddmultiplefields.css | 4 ++-- ddmultiplefields/ddmultiplefields.php | 13 +++++++++---- .../jquery.ddMM.mm_ddMultipleFields.js | 2 +- ddmultiplefields/lang/english.inc.php | 18 ++++++++++++++++++ ddmultiplefields/lang/russian-UTF8.inc.php | 18 ++++++++++++++++++ ddmultiplefields/lang/russian.php | 9 +++++++++ ddmultiplefields/richtext/template.html | 2 +- 7 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 ddmultiplefields/lang/english.inc.php create mode 100644 ddmultiplefields/lang/russian-UTF8.inc.php create mode 100644 ddmultiplefields/lang/russian.php diff --git a/ddmultiplefields/ddmultiplefields.css b/ddmultiplefields/ddmultiplefields.css index 6b5619a..05be613 100644 --- a/ddmultiplefields/ddmultiplefields.css +++ b/ddmultiplefields/ddmultiplefields.css @@ -17,7 +17,7 @@ font: 12px/1.2em Verdana,Helvetica,sans-serif !important; } -.ddMultipleField input {height: 1.2em;} +.ddMultipleField input {height: 2em;} .ddMultipleField input:focus {border-color: #E1A020 !important;} @@ -121,4 +121,4 @@ padding: 0.05em 0.15em; text-align: center; vertical-align: super; -} \ No newline at end of file +} diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 52b1bb2..bc71807 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -1,7 +1,7 @@ config['site_url']; - $widgetDir = $site.'assets/plugins/managermanager/widgets/ddmultiplefields/'; + $widgetPath = 'assets/plugins/managermanager/widgets/ddmultiplefields/'; + $widgetDir = $site.$widgetPath; if ($e->name == 'OnDocFormPrerender'){ global $_lang; - + ddTools::extendLanguage($widgetPath); + $usedLangKeys = array("edit","confirm_delete_record","batch_filling"); + $usedLangKeys = array_combine($usedLangKeys, $usedLangKeys); + $usedLang = array_intersect_key($_lang,$usedLangKeys); + $output .= includeJsCss($site.'assets/plugins/managermanager/js/jquery-ui-1.10.3.min.js', 'html', 'jquery-ui', '1.10.3'); $output .= includeJsCss($widgetDir.'ddmultiplefields.css', 'html'); $output .= includeJsCss($widgetDir.'jquery.ddMM.mm_ddMultipleFields.js', 'html', 'jquery.ddMM.mm_ddMultipleFields', '1.1.1'); - $output .= includeJsCss('$j.ddMM.lang.edit = "'.$_lang['edit'].'";$j.ddMM.lang.confirm_delete_record = "'.$_lang["confirm_delete_record"].'";', 'html', 'mm_ddMultipleFields_plain', '1', true, 'js'); + $output .= includeJsCss('$j.ddMM.lang = '.json_encode($usedLang).';', 'html', 'mm_ddMultipleFields_plain', '1', true, 'js'); $e->output($output); }else if ($e->name == 'OnDocFormRender'){ diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index 4c14106..dfaaa2d 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -253,7 +253,7 @@ $.ddMM.mm_ddMultipleFields = { var h = screen.height * 0.5; OpenServerBrowser('media/browser/mcpuk/browse.php?opener=ddMultipleField&type='+type, w, h); }; - $("").appendTo($ddMultipleFieldControl).click(function(e){ + $("").appendTo($ddMultipleFieldControl).click(function(e){ e.preventDefault(); window.KCFinder = { callBackMultiple: function (files) { diff --git a/ddmultiplefields/lang/english.inc.php b/ddmultiplefields/lang/english.inc.php new file mode 100644 index 0000000..c0c0f25 --- /dev/null +++ b/ddmultiplefields/lang/english.inc.php @@ -0,0 +1,18 @@ + "Batch Filling", + +)); +?> \ No newline at end of file diff --git a/ddmultiplefields/lang/russian-UTF8.inc.php b/ddmultiplefields/lang/russian-UTF8.inc.php new file mode 100644 index 0000000..83e13f7 --- /dev/null +++ b/ddmultiplefields/lang/russian-UTF8.inc.php @@ -0,0 +1,18 @@ + "Пакетное заполнение", + +)); +?> \ No newline at end of file diff --git a/ddmultiplefields/lang/russian.php b/ddmultiplefields/lang/russian.php new file mode 100644 index 0000000..8a3f3cf --- /dev/null +++ b/ddmultiplefields/lang/russian.php @@ -0,0 +1,9 @@ +' . $contents); + $modx_lang_attribute = 'ru'; // Manager HTML/XML Language Attribute see http://en.wikipedia.org/wiki/ISO_639-1 + $modx_manager_charset = 'windows-1251'; + setlocale (LC_ALL, 'ru_RU.CP1251'); +?> \ No newline at end of file diff --git a/ddmultiplefields/richtext/template.html b/ddmultiplefields/richtext/template.html index 42b5a53..e3671a5 100644 --- a/ddmultiplefields/richtext/template.html +++ b/ddmultiplefields/richtext/template.html @@ -6,7 +6,7 @@ Tiny MCE - + [+tinyMCE+] From 568a1c62629eb9385233df036cec11fcf31d60ea Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 31 Jan 2017 22:36:05 +0300 Subject: [PATCH 38/45] [localization] more localized --- ddmultiplefields/ddmultiplefields.php | 2 +- ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js | 12 ++++++------ ddmultiplefields/lang/english.inc.php | 2 ++ ddmultiplefields/lang/russian-UTF8.inc.php | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index bc71807..3cda5f6 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -48,7 +48,7 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = if ($e->name == 'OnDocFormPrerender'){ global $_lang; ddTools::extendLanguage($widgetPath); - $usedLangKeys = array("edit","confirm_delete_record","batch_filling"); + $usedLangKeys = array("insert","edit","clean","confirm_delete_record","batch_filling","clone_row","raw_btn_tip"); $usedLangKeys = array_combine($usedLangKeys, $usedLangKeys); $usedLang = array_intersect_key($_lang,$usedLangKeys); diff --git a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js index dfaaa2d..7cca6d3 100644 --- a/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js +++ b/ddmultiplefields/jquery.ddMM.mm_ddMultipleFields.js @@ -148,19 +148,19 @@ $.ddMM.mm_ddMultipleFields = { if (_inst.options.hideCommonControl) $ddMultipleFieldControl.hide(); if (!(_inst.maxRow == 1 && _inst.minRow == 1)) { //Кнопка очистки - $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { e.preventDefault(); if(confirm($.ddMM.lang.confirm_delete_record))$(".ddDeleteButton"+(_inst.minRow?":gt("+(_inst.minRow-1)+")":""), $ddMultipleField).click(); }); } //Кнопка Reset - $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { e.preventDefault(); _this._reset(id); }); // Кнопка "Показать/скрыть исходное значение". Простая возможность скопировать и вставить значение всего поля. if (_inst.options.btnToggleRaw) { - $('').appendTo($ddMultipleFieldControl).on("click", function (e) { + $('').appendTo($ddMultipleFieldControl).on("click", function (e) { e.preventDefault(); $('#' + id).toggle(); }); @@ -340,7 +340,7 @@ $.ddMM.mm_ddMultipleFields = { _this.makeImage(id, $col); //Create Attach browse button - $('').insertAfter($field).on('click', function(){ + $('').insertAfter($field).on('click', function(){ _inst.currentField = $(this).siblings('.ddField'); BrowseServer(id); }); @@ -350,7 +350,7 @@ $.ddMM.mm_ddMultipleFields = { $field = _this.makeText(val[key], _cTitle, _inst.colWidth[key], $col); //Create Attach browse button - $('').insertAfter($field).on('click', function(){ + $('').insertAfter($field).on('click', function(){ _inst.currentField = $(this).siblings('.ddField'); BrowseFileServer(id); }); @@ -488,7 +488,7 @@ $.ddMM.mm_ddMultipleFields = { "class": "ddCloneButton", "type": "button", "value": "©", - "title": "Copy row", + "title": $.ddMM.lang.clone_row, "disabled": (_inst.maxRow && fieldBlocksLen + 1 == _inst.maxRow) ? "disabled" : false }).on('click', function () { if ($(this).attr("disabled")) return false; diff --git a/ddmultiplefields/lang/english.inc.php b/ddmultiplefields/lang/english.inc.php index c0c0f25..2eb7122 100644 --- a/ddmultiplefields/lang/english.inc.php +++ b/ddmultiplefields/lang/english.inc.php @@ -13,6 +13,8 @@ $_lang = array_merge(@$_lang,array( "batch_filling" => "Batch Filling", + "clone_row" => "Clone row", + "raw_btn_tip"=>"Show/hide original field. Available copying and pasting. After insertion, press the reset button. Attention! Wrong original field format can result in unpredictable consequences!" )); ?> \ No newline at end of file diff --git a/ddmultiplefields/lang/russian-UTF8.inc.php b/ddmultiplefields/lang/russian-UTF8.inc.php index 83e13f7..ed71755 100644 --- a/ddmultiplefields/lang/russian-UTF8.inc.php +++ b/ddmultiplefields/lang/russian-UTF8.inc.php @@ -13,6 +13,7 @@ $_lang = array_merge(@$_lang,array( "batch_filling" => "Пакетное заполнение", - + "clone_row" => "Клонировать строку", + "raw_btn_tip"=>"Показать/Скрыть оригинальное поле. Доступны стандартные копирование и вставка. После вставки, нажмите кнопку сброса. Внимание! Неправильный формат исходного поля может привести к непредсказуемым последствиям!", )); ?> \ No newline at end of file From 88e4a65229744713132c282b7c34dc3060163831 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Wed, 1 Feb 2017 11:19:00 +0300 Subject: [PATCH 39/45] correct Readme.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3ada39c..ac65444 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # mm_ddMultipleFields +*This is NOT Original mm_ddMultipleFields* +To explore original mm_ddMultipleFields from DivanDesign go to +DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields + + Widget for plugin ManagerManager that allows you to add any number of fields values (TV) in one document (values is written as one with using separator symbols). For example: a few images. -___ -Visit the following [link](http://code.divandesign.biz/modx/mm_ddmultiplefields) to read the documentation, instructions & changelog. \ No newline at end of file + +See inside for more info. \ No newline at end of file From 036a5eb5334d44a930e5d38285aaaca63b3fae04 Mon Sep 17 00:00:00 2001 From: Sergey Davydov Date: Wed, 1 Feb 2017 11:26:32 +0300 Subject: [PATCH 40/45] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ac65444..37cd1c3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # mm_ddMultipleFields -*This is NOT Original mm_ddMultipleFields* -To explore original mm_ddMultipleFields from DivanDesign go to -DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields +**This is NOT Original mm_ddMultipleFields** + +To explore original mm_ddMultipleFields from DivanDesign go to original repo that forked +[DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields](https://github.com/DivanDesign/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields) Widget for plugin ManagerManager that allows you to add any number of fields values (TV) in one document (values is written as one with using separator symbols). For example: a few images. -See inside for more info. \ No newline at end of file +See more info inside [ddmultiplefields.php](https://github.com/MrSwed/MODXEvo.plugin.ManagerManager.mm_ddMultipleFields/blob/master/ddmultiplefields/ddmultiplefields.php#L1-L32) +and in [Modx.im blog](http://modx.im/blog/addons/4265.html) From cd7b2ee43a62706eff18f2e4f9587d6a51af7e81 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 5 Sep 2017 11:11:38 +0300 Subject: [PATCH 41/45] [*] source usage fix --- ddmultiplefields/ddmultiplefields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 3cda5f6..e6b7f2b 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -52,7 +52,7 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = $usedLangKeys = array_combine($usedLangKeys, $usedLangKeys); $usedLang = array_intersect_key($_lang,$usedLangKeys); - $output .= includeJsCss($site.'assets/plugins/managermanager/js/jquery-ui-1.10.3.min.js', 'html', 'jquery-ui', '1.10.3'); + $output .= includeJsCss($site.'assets/plugins/managermanager/js/jquery-ui.min.js', 'html', 'jquery-ui', '1.12.1'); $output .= includeJsCss($widgetDir.'ddmultiplefields.css', 'html'); $output .= includeJsCss($widgetDir.'jquery.ddMM.mm_ddMultipleFields.js', 'html', 'jquery.ddMM.mm_ddMultipleFields', '1.1.1'); From 5743d8cb6787fd15877b1feefa3c69866e348aac Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 5 Sep 2017 14:55:04 +0300 Subject: [PATCH 42/45] [fix] PHP7 FIX http://modx.im//blog/addons/4265.html#comment44232 --- ddmultiplefields/ddmultiplefields.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index e6b7f2b..b4a16f6 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -31,6 +31,10 @@ * http://www.DivanDesign.biz */ +function isJson($string) { + json_decode($string); + return (json_last_error() == JSON_ERROR_NONE); +} function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = 'field', $columnsTitle = '', $colWidth = '180', $splY = '||', $splX = '::', $imgW = 300, $imgH = 100, $minRow = 0, $maxRow = 0, $columnsData = '',$options = array()){ if (!useThisRule($roles, $templates)){return;} if (is_array($options)) { @@ -67,9 +71,8 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = $columnsData = array(); foreach ($columnsDataTemp as $value){ - //Евалим знение и записываем результат или исходное значени - $eval = @eval($value); - $columnsData[] = $eval ? addslashes(json_encode($eval)) : addslashes($value); + //Проверяем значение и записываем результат или исходное значени + $columnsData[] = addslashes(!isJson($value) ? json_encode($value) : $value); } //Сливаем в строку, что бы передать на клиент $columnsData = implode('||', $columnsData); From 0fe5feab258e820114e19ade4ebe1c80542279b9 Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 5 Sep 2017 17:05:45 +0300 Subject: [PATCH 43/45] [*] source usage fix --- ddmultiplefields/richtext/template.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddmultiplefields/richtext/template.html b/ddmultiplefields/richtext/template.html index e3671a5..72d334b 100644 --- a/ddmultiplefields/richtext/template.html +++ b/ddmultiplefields/richtext/template.html @@ -6,13 +6,13 @@ Tiny MCE - + [+tinyMCE+] - +
- \ No newline at end of file + From 902b95267107c3a28fc8dfea3413d57557b3dbee Mon Sep 17 00:00:00 2001 From: MrSwed Date: Tue, 5 Sep 2017 17:10:00 +0300 Subject: [PATCH 44/45] [fix] v.4.6.1-sd Use richtext editor from modx config richtext fields styles version update --- ddmultiplefields/ddmultiplefields.php | 3 ++- ddmultiplefields/richtext/index.php | 2 +- ddmultiplefields/richtext/script.js | 10 ++++++---- ddmultiplefields/richtext/style.css | 12 ++++++++++++ 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index b4a16f6..36c94e1 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -1,7 +1,7 @@ config['base_path'].$mmDir.'modx.ddtools.class.php'); $temp = $modx->invokeEvent('OnRichTextEditorInit', array( - 'editor' => 'TinyMCE', + 'editor' => $modx->config['which_editor'], 'elements' => array('ddMultipleFields_richtext') )); diff --git a/ddmultiplefields/richtext/script.js b/ddmultiplefields/richtext/script.js index b62cd09..f8d13fd 100644 --- a/ddmultiplefields/richtext/script.js +++ b/ddmultiplefields/richtext/script.js @@ -1,15 +1,17 @@ $(function(){ var $textarea = $('#ddMultipleFields_richtext'); - + $textarea.val(window.$ddField.html()).trigger('change'); - + $('.js-ok').on('click', function(){ - tinyMCE.triggerSave(); + if (typeof tinyMCE != 'undefined') { + tinyMCE.triggerSave(); + } window.$ddField.html($textarea.val()); $textarea.val(''); window.close(); }); - + $('.js-cancel').on('click', function(){ $textarea.val(''); window.close(); diff --git a/ddmultiplefields/richtext/style.css b/ddmultiplefields/richtext/style.css index 0a5094f..8aaa7df 100644 --- a/ddmultiplefields/richtext/style.css +++ b/ddmultiplefields/richtext/style.css @@ -1,4 +1,16 @@ +html, body { + height: 100%; +} +textarea { + width: 100%; + min-height: 250px; + box-sizing: border-box; + height: calc( 100% - 45px ); +} .buttons { padding-top: 10px; text-align: right; +} +body > .mce-container { + box-sizing: border-box; } \ No newline at end of file From 2a00c33d1311e092c71d1029f29ce0aff2036607 Mon Sep 17 00:00:00 2001 From: Sergey Davydov Date: Fri, 19 Jan 2018 14:34:34 +0300 Subject: [PATCH 45/45] [fix] localization --- ddmultiplefields/ddmultiplefields.php | 2 +- ddmultiplefields/lang/english.inc.php | 6 ++++-- ddmultiplefields/lang/russian-UTF8.inc.php | 2 ++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ddmultiplefields/ddmultiplefields.php b/ddmultiplefields/ddmultiplefields.php index 36c94e1..3af1f67 100644 --- a/ddmultiplefields/ddmultiplefields.php +++ b/ddmultiplefields/ddmultiplefields.php @@ -53,7 +53,7 @@ function mm_ddMultipleFields($tvs = '', $roles = '', $templates = '', $columns = if ($e->name == 'OnDocFormPrerender'){ global $_lang; ddTools::extendLanguage($widgetPath); - $usedLangKeys = array("insert","edit","clean","confirm_delete_record","batch_filling","clone_row","raw_btn_tip"); + $usedLangKeys = array("insert","edit","clean","confirm_delete_record","batch_filling","clone_row","raw_btn_tip","reset"); $usedLangKeys = array_combine($usedLangKeys, $usedLangKeys); $usedLang = array_intersect_key($_lang,$usedLangKeys); diff --git a/ddmultiplefields/lang/english.inc.php b/ddmultiplefields/lang/english.inc.php index 2eb7122..05e8691 100644 --- a/ddmultiplefields/lang/english.inc.php +++ b/ddmultiplefields/lang/english.inc.php @@ -14,7 +14,9 @@ $_lang = array_merge(@$_lang,array( "batch_filling" => "Batch Filling", "clone_row" => "Clone row", - "raw_btn_tip"=>"Show/hide original field. Available copying and pasting. After insertion, press the reset button. Attention! Wrong original field format can result in unpredictable consequences!" - + "raw_btn_tip" => "Show/hide original field. Available copying and pasting. After insertion, press the reset button. Attention! Wrong original field format can result in unpredictable consequences!", + "clean" => "Clean", + "reset" => "Reset" + )); ?> \ No newline at end of file diff --git a/ddmultiplefields/lang/russian-UTF8.inc.php b/ddmultiplefields/lang/russian-UTF8.inc.php index ed71755..db7427b 100644 --- a/ddmultiplefields/lang/russian-UTF8.inc.php +++ b/ddmultiplefields/lang/russian-UTF8.inc.php @@ -15,5 +15,7 @@ "batch_filling" => "Пакетное заполнение", "clone_row" => "Клонировать строку", "raw_btn_tip"=>"Показать/Скрыть оригинальное поле. Доступны стандартные копирование и вставка. После вставки, нажмите кнопку сброса. Внимание! Неправильный формат исходного поля может привести к непредсказуемым последствиям!", + "clean" => "Очистить", + "reset" => "Сбросить" )); ?> \ No newline at end of file