Skip to content

Commit becc3dd

Browse files
author
Eugene Tupikov
committed
fix calculation of current index
1 parent a62db09 commit becc3dd

File tree

6 files changed

+46
-25
lines changed

6 files changed

+46
-25
lines changed

src/assets/src/js/jquery.multipleInput.js

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@
199199
addActiveFormAttribute($(this));
200200
});
201201

202-
$wrapper.data('multipleInput').currentIndex = getCurrentRowsCount($wrapper);
202+
$wrapper.data('multipleInput').currentIndex = findMaxRowIndex($wrapper);
203203
isActiveFormEnabled = true;
204204

205205
clearInterval(intervalID);
@@ -212,7 +212,7 @@
212212
// If after a second system could not detect ActiveForm it means
213213
// that widget is used without ActiveForm and we should just complete initialization of the widget
214214
if (form.length === 0 || i > 10) {
215-
$wrapper.data('multipleInput').currentIndex = getCurrentRowsCount($wrapper);
215+
$wrapper.data('multipleInput').currentIndex = findMaxRowIndex($wrapper);
216216
isActiveFormEnabled = false;
217217

218218
clearInterval(intervalID);
@@ -272,8 +272,8 @@
272272

273273
let id = getInputId($element);
274274
if (id) {
275+
// todo still doesn't work for sinlge column
275276
let columnName = id.replace(settings.inputId, '').replace(/-\d+-/, '');
276-
277277
if ($element.is(':checkbox')) {
278278
if (!values.hasOwnProperty(columnName)) {
279279
values[columnName] = [];
@@ -299,18 +299,18 @@
299299
let settings = data.settings;
300300
let inputList = $wrapper.children('.multiple-input-list').first();
301301

302-
if (settings.max !== null && getCurrentRowsCount($wrapper) >= settings.max) {
302+
if (settings.max !== null && getRowsCount($wrapper) >= settings.max) {
303303
return;
304304
}
305305

306-
let currentIndex = data.currentIndex;
306+
let newRowIndex = data.currentIndex + 1;
307307

308-
let template = replaceAll('{' + settings.indexPlaceholder + '}', data.currentIndex, settings.template);
308+
let template = replaceAll('{' + settings.indexPlaceholder + '}', newRowIndex, settings.template);
309309
let $newRow = $(template);
310310

311311
var beforeAddEvent = $.Event(events.beforeAddRow);
312312

313-
$wrapper.trigger(beforeAddEvent, [$newRow, currentIndex]);
313+
$wrapper.trigger(beforeAddEvent, [$newRow, newRowIndex]);
314314
if (beforeAddEvent.result === false) {
315315
return;
316316
}
@@ -320,7 +320,7 @@
320320

321321
let id = getInputId($element);
322322
if (id) {
323-
let columnName = id.replace(settings.inputId, '').replace(/-\d+-/, '');
323+
let columnName = id.replace(settings.inputId, '').replace(/-\d+-?/, '');
324324

325325
if (rowValues.hasOwnProperty(columnName)) {
326326
let tag = $element.get(0).tagName;
@@ -367,27 +367,25 @@
367367
}
368368
});
369369

370-
// display the new row
371370
if (settings.prepend) {
372371
$newRow.hide().prependTo(inputList).fadeIn(300);
373372
} else {
374373
$newRow.hide().appendTo(inputList).fadeIn(300);
375374
}
376375

377-
// apply js templates
378376
let jsTemplate = null;
379377
for (var i in settings.jsTemplates) {
380378
jsTemplate = settings.jsTemplates[i];
381-
jsTemplate = replaceAll('{' + settings.indexPlaceholder + '}', currentIndex, jsTemplate);
382-
jsTemplate = replaceAll('%7B' + settings.indexPlaceholder + '%7D', currentIndex, jsTemplate);
379+
jsTemplate = replaceAll('{' + settings.indexPlaceholder + '}', newRowIndex, jsTemplate);
380+
jsTemplate = replaceAll('%7B' + settings.indexPlaceholder + '%7D', newRowIndex, jsTemplate);
383381

384382
window.eval(jsTemplate);
385383
}
386384

387-
$wrapper.data('multipleInput').currentIndex++;
385+
$wrapper.data('multipleInput').currentIndex = newRowIndex;
388386

389387
var afterAddEvent = $.Event(events.afterAddRow);
390-
$wrapper.trigger(afterAddEvent, [$newRow, currentIndex]);
388+
$wrapper.trigger(afterAddEvent, [$newRow, newRowIndex]);
391389
};
392390

393391
var removeInput = function ($btn) {
@@ -396,10 +394,10 @@
396394
data = $wrapper.data('multipleInput'),
397395
settings = data.settings;
398396

399-
var currentIndex = getCurrentRowsCount($wrapper);
400-
if (currentIndex > settings.min) {
397+
var rowsCount = getRowsCount($wrapper);
398+
if (rowsCount > settings.min) {
401399
var event = $.Event(events.beforeDeleteRow);
402-
$wrapper.trigger(event, [$toDelete, currentIndex]);
400+
$wrapper.trigger(event, [$toDelete, rowsCount]);
403401

404402
if (event.result === false) {
405403
return;
@@ -415,7 +413,7 @@
415413
$(this).remove();
416414

417415
event = $.Event(events.afterDeleteRow);
418-
$wrapper.trigger(event, [$toDelete, currentIndex]);
416+
$wrapper.trigger(event, [$toDelete, rowsCount]);
419417
});
420418
}
421419
};
@@ -505,12 +503,29 @@
505503
return id;
506504
};
507505

508-
var getCurrentRowsCount = function($wrapper) {
506+
var getRowsCount = function($wrapper) {
507+
return findRows($wrapper).length;
508+
};
509+
510+
var findRows = function($wrapper) {
509511
return $wrapper
510512
.find('.multiple-input-list .multiple-input-list__item')
511513
.filter(function(){
512514
return $(this).parents('.multiple-input').first().attr('id') === $wrapper.attr('id');
513-
}).length;
515+
});
516+
}
517+
518+
var findMaxRowIndex = function($wrapper) {
519+
let maxIndex = 0;
520+
521+
findRows($wrapper).each(function(key, element) {
522+
let index = $(element).data('index');
523+
if (index > maxIndex) {
524+
maxIndex = index;
525+
}
526+
});
527+
528+
return maxIndex;
514529
};
515530

516531
var replaceAll = function (search, replace, subject) {

src/assets/src/js/jquery.multipleInput.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/BaseColumn.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ protected function renderDropDownList($name, $value, $options)
364364
if ($this->renderer->isBootstrapTheme()) {
365365
Html::addCssClass($options, 'form-control');
366366
}
367-
367+
368368
return Html::dropDownList($name, $value, $this->prepareItems($this->items), $options);
369369
}
370370

@@ -396,7 +396,7 @@ protected function renderListBox($name, $value, $options)
396396
if ($this->renderer->isBootstrapTheme()) {
397397
Html::addCssClass($options, 'form-control');
398398
}
399-
399+
400400
return Html::listBox($name, $value, $this->prepareItems($this->items), $options);
401401
}
402402

@@ -605,7 +605,7 @@ protected function renderWidget($type, $name, $value, $options)
605605
} else {
606606
$tabindex = null;
607607
}
608-
608+
609609
$id = isset($options['id']) ? $options['id'] : $this->normalize($name);
610610
$model = $this->getModel();
611611
if ($model instanceof Model) {

src/renderers/DivRenderer.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
/**
1919
* Class DivRenderer is a list renderer which uses divs
20-
*
20+
*
2121
* @package unclead\multipleinput\renderers
2222
*/
2323
class DivRenderer extends BaseRenderer
@@ -161,6 +161,8 @@ protected function prepareRowOptions($index, $item)
161161
$options = $this->rowOptions;
162162
}
163163

164+
$options['data-index'] = '{' . $this->getIndexPlaceholder() . '}';
165+
164166
Html::addCssClass($options, 'multiple-input-list__item');
165167

166168
return $options;

src/renderers/ListRenderer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ protected function prepareRowOptions($index, $item)
178178
$options = $this->rowOptions;
179179
}
180180

181+
$options['data-index'] = '{' . $this->getIndexPlaceholder() . '}';
182+
181183
Html::addCssClass($options, 'multiple-input-list__item');
182184

183185
return $options;

src/renderers/TableRenderer.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ protected function prepareRowOptions($index, $item)
254254
$options = $this->rowOptions;
255255
}
256256

257+
$options['data-index'] = '{' . $this->getIndexPlaceholder() . '}';
258+
257259
Html::addCssClass($options, 'multiple-input-list__item');
258260

259261
return $options;

0 commit comments

Comments
 (0)