Skip to content

Commit ae0f7f9

Browse files
author
Eugene Tupikov
committed
#215 collect all js script that has to be evaluate when add new row (not only from " on ready" section)
1 parent bc7fe00 commit ae0f7f9

File tree

4 files changed

+42
-34
lines changed

4 files changed

+42
-34
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Yii2 multiple input change log
33

44
2.17.0 (in development)
55
=======================
6-
6+
- #215 collect all js script that has to be evaluate when add new row (not only from " on ready" section)
77

88
2.16.0
99
======

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,7 @@
117117
inputId = settings.inputId;
118118

119119
for (i in settings.jsInit) {
120-
var script = document.createElement("script");
121-
script.innerHTML = settings.jsInit[i];
122-
document.body.appendChild(script);
120+
window.eval(settings.jsInit[i]);
123121
}
124122

125123
$wrapper.data('multipleInput', {

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/renderers/BaseRenderer.php

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ public function render()
339339
$jsBefore= [];
340340
if (is_array($view->js)) {
341341
foreach ($view->js as $position => $scripts) {
342-
foreach ($scripts as $key => $js) {
342+
foreach ((array)$scripts as $key => $js) {
343343
if (!isset($jsBefore[$position])) {
344344
$jsBefore[$position] = [];
345345
}
@@ -354,7 +354,7 @@ public function render()
354354
$jsInit = [];
355355
if (is_array($view->js)) {
356356
foreach ($view->js as $position => $scripts) {
357-
foreach ($scripts as $key => $js) {
357+
foreach ((array)$scripts as $key => $js) {
358358
if (isset($jsBefore[$position][$key])) {
359359
continue;
360360
}
@@ -368,14 +368,15 @@ public function render()
368368
$template = $this->prepareTemplate();
369369

370370
$jsTemplates = [];
371-
if (is_array($view->js) && isset($view->js[View::POS_READY])) {
372-
foreach ($view->js[View::POS_READY] as $key => $js) {
373-
if (isset($jsBefore[View::POS_READY][$key])) {
374-
continue;
371+
if (is_array($view->js)) {
372+
foreach ($view->js as $position => $scripts) {
373+
foreach ((array)$scripts as $key => $js) {
374+
if (isset($jsBefore[$position][$key])) {
375+
continue;
376+
}
377+
$jsTemplates[$key] = $js;
378+
unset($view->js[$position][$key]);
375379
}
376-
377-
$jsTemplates[$key] = $js;
378-
unset($view->js[View::POS_READY][$key]);
379380
}
380381
}
381382

@@ -392,32 +393,41 @@ public function render()
392393
]);
393394

394395
$js = "jQuery('#{$this->id}').multipleInput($options);";
396+
$view->registerJs($js);
395397

396-
if($this->sortable) {
397-
MultipleInputSortableAsset::register($view);
398-
$js .= <<<JS
399-
$('#{$this->id} table').sorting({
400-
containerSelector: 'table',
401-
itemPath: '> tbody',
402-
itemSelector: 'tr',
403-
placeholder: '<tr class="placeholder">',
404-
handle:'.drag-handle',
405-
onDrop: function(item, container, _super, event) {
406-
_super(item, container, _super, event);
407-
408-
var wrapper = item.closest('.multiple-input').first();
409-
event = $.Event('afterDropRow');
410-
wrapper.trigger(event, [item]);
411-
}
412-
});
413-
JS;
398+
if ($this->sortable) {
399+
$this->registerJsSortable();
414400
}
415401

416-
$view->registerJs($js);
417-
418402
return $content;
419403
}
420404

405+
private function registerJsSortable()
406+
{
407+
$view = $this->context->getView();
408+
MultipleInputSortableAsset::register($view);
409+
410+
// todo override when ListRenderer will use div markup
411+
$options = Json::encode([
412+
'containerSelector' => 'table',
413+
'itemPath' => '> tbody',
414+
'itemSelector' => 'tr',
415+
'placeholder' => '<tr class="placeholder">',
416+
'handle' => '.drag-handle',
417+
'onDrop' => new \yii\web\JsExpression("
418+
function(item, container, _super, event) {
419+
_super(item, container, _super, event);
420+
421+
var wrapper = item.closest('.multiple-input').first();
422+
event = $.Event('afterDropRow');
423+
wrapper.trigger(event, [item]);
424+
}
425+
")
426+
]);
427+
$js = "$('#{$this->id} table').sorting($options);";
428+
$view->registerJs($js);
429+
}
430+
421431
/**
422432
* @return mixed
423433
* @throws NotSupportedException

0 commit comments

Comments
 (0)