|
82 | 82 |
|
83 | 83 | $wrapper.on('click.multipleInput', '.js-input-remove', function (e) {
|
84 | 84 | e.preventDefault();
|
85 |
| - methods.removeInput.apply(this); |
| 85 | + removeInput($(this)); |
86 | 86 | });
|
87 | 87 |
|
88 | 88 | $wrapper.on('click.multipleInput', '.js-input-plus', function (e) {
|
89 | 89 | e.preventDefault();
|
90 |
| - methods.addInput.apply(this); |
| 90 | + addInput($(this)); |
91 | 91 | });
|
92 | 92 |
|
93 | 93 | var intervalID = setInterval(function(){
|
|
109 | 109 | attributeDefaults[key] = value;
|
110 | 110 | }
|
111 | 111 | });
|
| 112 | + |
112 | 113 | $wrapper.data('multipleInput').attributeDefaults = attributeDefaults;
|
113 | 114 |
|
114 | 115 | $wrapper.find('.multiple-input-list').find('input, select, textarea').each(function () {
|
115 |
| - methods.addAttribute.apply(this); |
| 116 | + addAttribute($(this)); |
116 | 117 | });
|
117 | 118 | $wrapper.data('multipleInput').currentIndex = $wrapper.find('.multiple-input-list__item').length;
|
118 | 119 | clearInterval(intervalID);
|
|
121 | 122 | $wrapper.trigger(event);
|
122 | 123 | }
|
123 | 124 | }, 100);
|
124 |
| - }, |
| 125 | + } |
| 126 | + }; |
125 | 127 |
|
126 |
| - addInput: function () { |
127 |
| - var $wrapper = $(this).closest('.multiple-input').first(), |
128 |
| - data = $wrapper.data('multipleInput'), |
129 |
| - settings = data.settings, |
130 |
| - template = settings.template, |
131 |
| - inputList = $wrapper.find('.multiple-input-list').first(), |
132 |
| - count = $wrapper.find('.multiple-input-list__item').length; |
| 128 | + var addInput = function (btn) { |
| 129 | + var $wrapper = $(btn).closest('.multiple-input').first(), |
| 130 | + data = $wrapper.data('multipleInput'), |
| 131 | + settings = data.settings, |
| 132 | + template = settings.template, |
| 133 | + inputList = $wrapper.find('.multiple-input-list').first(), |
| 134 | + count = $wrapper.find('.multiple-input-list__item').length; |
133 | 135 |
|
134 |
| - if (settings.limit != null && count >= settings.limit) { |
135 |
| - return; |
136 |
| - } |
| 136 | + if (settings.limit != null && count >= settings.limit) { |
| 137 | + return; |
| 138 | + } |
137 | 139 |
|
138 |
| - template = template.replaceAll('{multiple_index}', data.currentIndex); |
| 140 | + template = template.replaceAll('{multiple_index}', data.currentIndex); |
139 | 141 |
|
140 |
| - $(template).hide().appendTo(inputList).fadeIn(300); |
| 142 | + $(template).hide().appendTo(inputList).fadeIn(300); |
141 | 143 |
|
142 |
| - $(template).find('input, select, textarea').each(function () { |
143 |
| - methods.addAttribute.apply(this); |
144 |
| - }); |
| 144 | + $(template).find('input, select, textarea').each(function () { |
| 145 | + addAttribute($(this)); |
| 146 | + }); |
145 | 147 |
|
146 |
| - var jsTemplate; |
147 |
| - for (i in settings.jsTemplates) { |
148 |
| - jsTemplate = settings.jsTemplates[i] |
149 |
| - .replaceAll('{multiple_index}', data.currentIndex) |
150 |
| - .replaceAll('%7Bmultiple_index%7D', data.currentIndex); |
151 |
| - window.eval(jsTemplate); |
| 148 | + var jsTemplate; |
| 149 | + for (i in settings.jsTemplates) { |
| 150 | + jsTemplate = settings.jsTemplates[i] |
| 151 | + .replaceAll('{multiple_index}', data.currentIndex) |
| 152 | + .replaceAll('%7Bmultiple_index%7D', data.currentIndex); |
| 153 | + window.eval(jsTemplate); |
| 154 | + } |
| 155 | + $wrapper.data('multipleInput').currentIndex++; |
| 156 | + |
| 157 | + var event = $.Event(events.afterAddRow); |
| 158 | + $wrapper.trigger(event); |
| 159 | + }; |
| 160 | + |
| 161 | + var removeInput = function ($btn) { |
| 162 | + var $wrapper = $btn.closest('.multiple-input').first(), |
| 163 | + $toDelete = $btn.closest('.multiple-input-list__item'), |
| 164 | + count = $('.multiple-input-list__item').length, |
| 165 | + data = $wrapper.data('multipleInput'), |
| 166 | + settings = data.settings; |
| 167 | + |
| 168 | + if (count > settings.min) { |
| 169 | + var event = $.Event(events.beforeDeleteRow); |
| 170 | + $wrapper.trigger(event, [$toDelete]); |
| 171 | + if (event.result === false) { |
| 172 | + return; |
152 | 173 | }
|
153 |
| - $wrapper.data('multipleInput').currentIndex++; |
154 | 174 |
|
155 |
| - var event = $.Event(events.afterAddRow); |
| 175 | + $toDelete.find('input, select, textarea').each(function () { |
| 176 | + removeAttribute($(this)); |
| 177 | + }); |
| 178 | + |
| 179 | + $toDelete.fadeOut(300, function () { |
| 180 | + $(this).remove(); |
| 181 | + }); |
| 182 | + |
| 183 | + event = $.Event(events.afterDeleteRow); |
156 | 184 | $wrapper.trigger(event);
|
157 |
| - }, |
158 |
| - |
159 |
| - removeInput: function () { |
160 |
| - var $wrapper = $(this).closest('.multiple-input').first(), |
161 |
| - $toDelete = $(this).closest('.multiple-input-list__item'), |
162 |
| - count = $('.multiple-input-list__item').length, |
163 |
| - data = $wrapper.data('multipleInput'), |
164 |
| - settings = data.settings; |
165 |
| - |
166 |
| - if (count > settings.min) { |
167 |
| - var event = $.Event(events.beforeDeleteRow); |
168 |
| - $wrapper.trigger(event, [$toDelete]); |
169 |
| - if (event.result === false) { |
170 |
| - return; |
171 |
| - } |
| 185 | + } |
| 186 | + }; |
172 | 187 |
|
173 |
| - $toDelete.find('input, select, textarea').each(function () { |
174 |
| - methods.removeAttribute.apply(this); |
175 |
| - }); |
176 |
| - $toDelete.fadeOut(300, function () { |
177 |
| - $(this).remove(); |
178 |
| - }); |
| 188 | + var addAttribute = function (input) { |
| 189 | + var id = getInputId(input); |
179 | 190 |
|
180 |
| - event = $.Event(events.afterDeleteRow); |
181 |
| - $wrapper.trigger(event); |
182 |
| - } |
183 |
| - }, |
| 191 | + // skip if we could not get an ID of input |
| 192 | + if (id === null) { |
| 193 | + return; |
| 194 | + } |
184 | 195 |
|
185 |
| - addAttribute: function () { |
186 |
| - var id = $(this).attr('id'), |
187 |
| - ele = $('#' + $(this).attr('id')), |
188 |
| - wrapper = ele.closest('.multiple-input').first(), |
189 |
| - form = ele.closest('form'); |
| 196 | + var ele = $('#' + id), |
| 197 | + wrapper = ele.closest('.multiple-input').first(), |
| 198 | + form = ele.closest('form'); |
190 | 199 |
|
191 |
| - // do not add attribute which are not the part of widget |
192 |
| - if (wrapper.length == 0) { |
193 |
| - return; |
194 |
| - } |
195 | 200 |
|
196 |
| - var data = wrapper.data('multipleInput'); |
197 |
| - form.yiiActiveForm('add', $.extend({}, data.attributeDefaults, { |
198 |
| - 'id': id, |
199 |
| - 'input': '#' + id, |
200 |
| - 'container': '.field-' + id |
201 |
| - })); |
202 |
| - }, |
| 201 | + // do not add attribute which are not the part of widget |
| 202 | + if (wrapper.length == 0) { |
| 203 | + return; |
| 204 | + } |
| 205 | + |
| 206 | + // check that input has been already added to the activeForm |
| 207 | + if (typeof form.yiiActiveForm('find', id) !== 'undefined') { |
| 208 | + return; |
| 209 | + } |
203 | 210 |
|
204 |
| - removeAttribute: function () { |
205 |
| - var id = $(this).attr('id'), |
206 |
| - form = $('#' + $(this).attr('id')).closest('form'); |
| 211 | + var data = wrapper.data('multipleInput'); |
| 212 | + form.yiiActiveForm('add', $.extend({}, data.attributeDefaults, { |
| 213 | + 'id': id, |
| 214 | + 'input': '#' + id, |
| 215 | + 'container': '.field-' + id |
| 216 | + })); |
| 217 | + }; |
207 | 218 |
|
208 |
| - if (form.length !== 0) { |
209 |
| - form.yiiActiveForm('remove', id); |
210 |
| - } |
| 219 | + var removeAttribute = function () { |
| 220 | + var id = getInputId($(this)); |
| 221 | + |
| 222 | + if (id === null) { |
| 223 | + return; |
| 224 | + } |
| 225 | + |
| 226 | + var form = $('#' + id).closest('form'); |
| 227 | + |
| 228 | + if (form.length !== 0) { |
| 229 | + form.yiiActiveForm('remove', id); |
| 230 | + } |
| 231 | + }; |
| 232 | + |
| 233 | + var getInputId = function($input) { |
| 234 | + var id = $input.attr('id'); |
| 235 | + |
| 236 | + if (typeof id === 'undefined') { |
| 237 | + id = $input.data('id'); |
| 238 | + } |
| 239 | + |
| 240 | + if (typeof id === 'undefined') { |
| 241 | + return null; |
211 | 242 | }
|
212 | 243 |
|
| 244 | + return id; |
213 | 245 | };
|
214 | 246 |
|
215 | 247 | String.prototype.replaceAll = function(search, replace){
|
|
0 commit comments