|
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