|
199 | 199 | addActiveFormAttribute($(this));
|
200 | 200 | });
|
201 | 201 |
|
202 |
| - $wrapper.data('multipleInput').currentIndex = getCurrentRowsCount($wrapper); |
| 202 | + $wrapper.data('multipleInput').currentIndex = findMaxRowIndex($wrapper); |
203 | 203 | isActiveFormEnabled = true;
|
204 | 204 |
|
205 | 205 | clearInterval(intervalID);
|
|
212 | 212 | // If after a second system could not detect ActiveForm it means
|
213 | 213 | // that widget is used without ActiveForm and we should just complete initialization of the widget
|
214 | 214 | if (form.length === 0 || i > 10) {
|
215 |
| - $wrapper.data('multipleInput').currentIndex = getCurrentRowsCount($wrapper); |
| 215 | + $wrapper.data('multipleInput').currentIndex = findMaxRowIndex($wrapper); |
216 | 216 | isActiveFormEnabled = false;
|
217 | 217 |
|
218 | 218 | clearInterval(intervalID);
|
|
272 | 272 |
|
273 | 273 | let id = getInputId($element);
|
274 | 274 | if (id) {
|
| 275 | + // todo still doesn't work for sinlge column |
275 | 276 | let columnName = id.replace(settings.inputId, '').replace(/-\d+-/, '');
|
276 |
| - |
277 | 277 | if ($element.is(':checkbox')) {
|
278 | 278 | if (!values.hasOwnProperty(columnName)) {
|
279 | 279 | values[columnName] = [];
|
|
299 | 299 | let settings = data.settings;
|
300 | 300 | let inputList = $wrapper.children('.multiple-input-list').first();
|
301 | 301 |
|
302 |
| - if (settings.max !== null && getCurrentRowsCount($wrapper) >= settings.max) { |
| 302 | + if (settings.max !== null && getRowsCount($wrapper) >= settings.max) { |
303 | 303 | return;
|
304 | 304 | }
|
305 | 305 |
|
306 |
| - let currentIndex = data.currentIndex; |
| 306 | + let newRowIndex = data.currentIndex + 1; |
307 | 307 |
|
308 |
| - let template = replaceAll('{' + settings.indexPlaceholder + '}', data.currentIndex, settings.template); |
| 308 | + let template = replaceAll('{' + settings.indexPlaceholder + '}', newRowIndex, settings.template); |
309 | 309 | let $newRow = $(template);
|
310 | 310 |
|
311 | 311 | var beforeAddEvent = $.Event(events.beforeAddRow);
|
312 | 312 |
|
313 |
| - $wrapper.trigger(beforeAddEvent, [$newRow, currentIndex]); |
| 313 | + $wrapper.trigger(beforeAddEvent, [$newRow, newRowIndex]); |
314 | 314 | if (beforeAddEvent.result === false) {
|
315 | 315 | return;
|
316 | 316 | }
|
|
320 | 320 |
|
321 | 321 | let id = getInputId($element);
|
322 | 322 | if (id) {
|
323 |
| - let columnName = id.replace(settings.inputId, '').replace(/-\d+-/, ''); |
| 323 | + let columnName = id.replace(settings.inputId, '').replace(/-\d+-?/, ''); |
324 | 324 |
|
325 | 325 | if (rowValues.hasOwnProperty(columnName)) {
|
326 | 326 | let tag = $element.get(0).tagName;
|
|
367 | 367 | }
|
368 | 368 | });
|
369 | 369 |
|
370 |
| - // display the new row |
371 | 370 | if (settings.prepend) {
|
372 | 371 | $newRow.hide().prependTo(inputList).fadeIn(300);
|
373 | 372 | } else {
|
374 | 373 | $newRow.hide().appendTo(inputList).fadeIn(300);
|
375 | 374 | }
|
376 | 375 |
|
377 |
| - // apply js templates |
378 | 376 | let jsTemplate = null;
|
379 | 377 | for (var i in settings.jsTemplates) {
|
380 | 378 | 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); |
383 | 381 |
|
384 | 382 | window.eval(jsTemplate);
|
385 | 383 | }
|
386 | 384 |
|
387 |
| - $wrapper.data('multipleInput').currentIndex++; |
| 385 | + $wrapper.data('multipleInput').currentIndex = newRowIndex; |
388 | 386 |
|
389 | 387 | var afterAddEvent = $.Event(events.afterAddRow);
|
390 |
| - $wrapper.trigger(afterAddEvent, [$newRow, currentIndex]); |
| 388 | + $wrapper.trigger(afterAddEvent, [$newRow, newRowIndex]); |
391 | 389 | };
|
392 | 390 |
|
393 | 391 | var removeInput = function ($btn) {
|
|
396 | 394 | data = $wrapper.data('multipleInput'),
|
397 | 395 | settings = data.settings;
|
398 | 396 |
|
399 |
| - var currentIndex = getCurrentRowsCount($wrapper); |
400 |
| - if (currentIndex > settings.min) { |
| 397 | + var rowsCount = getRowsCount($wrapper); |
| 398 | + if (rowsCount > settings.min) { |
401 | 399 | var event = $.Event(events.beforeDeleteRow);
|
402 |
| - $wrapper.trigger(event, [$toDelete, currentIndex]); |
| 400 | + $wrapper.trigger(event, [$toDelete, rowsCount]); |
403 | 401 |
|
404 | 402 | if (event.result === false) {
|
405 | 403 | return;
|
|
415 | 413 | $(this).remove();
|
416 | 414 |
|
417 | 415 | event = $.Event(events.afterDeleteRow);
|
418 |
| - $wrapper.trigger(event, [$toDelete, currentIndex]); |
| 416 | + $wrapper.trigger(event, [$toDelete, rowsCount]); |
419 | 417 | });
|
420 | 418 | }
|
421 | 419 | };
|
|
505 | 503 | return id;
|
506 | 504 | };
|
507 | 505 |
|
508 |
| - var getCurrentRowsCount = function($wrapper) { |
| 506 | + var getRowsCount = function($wrapper) { |
| 507 | + return findRows($wrapper).length; |
| 508 | + }; |
| 509 | + |
| 510 | + var findRows = function($wrapper) { |
509 | 511 | return $wrapper
|
510 | 512 | .find('.multiple-input-list .multiple-input-list__item')
|
511 | 513 | .filter(function(){
|
512 | 514 | 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; |
514 | 529 | };
|
515 | 530 |
|
516 | 531 | var replaceAll = function (search, replace, subject) {
|
|
0 commit comments