PageSourceSearch

https://akademia-excel.ru/nassets/d5b79c02/select_object.js?v=2

js akademia-excel.ru collected 2026-09-30 11:24:34 UTC 21,376 bytes, 562 lines download raw bytes

1function SelectObjectFieldWidget() {
2
3    this.selectedValueId = null;
4    this.values = [];
5    var self = this;
6    var selectedIds = [];
7    var preSelectedIds = [];
8    this.selectedTags = [];
9    var selectAllObjectsWithTags = false;
10    var allObjectWithTags = false;
11    this.previousModal = null;
12    var countLoader = 0;
13
14    this.initEl = function( $el, field, value ) {
15
16        this.field = field;
17        var $shortEl;
18        if (window.isPageRedesigned) {
19
20            var classes = this.field.isListSelectObject
21                ? 'select-object-widget rd-select-object-widget_not-table select-object-short'
22                : 'select-object-widget select-object-short';
23            $shortEl = this.shortEl = $(
24                "<div class='"+classes+"'></div>")
25        } else {
26            $shortEl = this.shortEl = $("<div class='select-object-widget select-object-short'></div>")
27        }
28
29        if ( field.inputName ) {
30            this.valueInput = $('<input type="hidden" name="'+  field.inputName+ '"/>')
31            this.valueInput.appendTo( $el );
32        }
33        $shortEl.appendTo( $el )
34
35        if (field.linkEdit && value.selected_id) {
36            $linkEdit = $('<a href="' + field.linkEdit + value.selected_id + '" target="_blank">  редактировать</a>');
37            $linkEdit.appendTo($el);
38        }
39
40        $shortEl.click( function() {
41            self.openSearchModal();
42        })
43
44        if (!!window.UnsavedChangesFix) {
45            this.setValue(value, true);
46        } else {
47            this.setValue(value);
48        }
49    };
50
51    this.searchModal = null;
52    this.openSearchModal = function() {
53        var self = this;
54        var field = this.field;
55        this.preSelectedIds = [];
56        for ( var key in  this.selectedIds ) {
57            this.preSelectedIds.push( this.selectedIds[key])
58        }
59        self.detectPreviousActiveModal();
60        if( ! this.searchModal ) {
61            var modal = this.searchModal = window.gcModalFactory.create({
62                show: false,
63                onShow: function() {
64                    if (self.previousModal) {
65                        self.previousModal.hide();
66                    }
67                },
68                onHide: function() {
69                    if (self.previousModal) {
70                        setTimeout(function() {
71                            self.previousModal.show();
72                        }, 10);
73                    }
74                }
75            });
76
77            modal.getContentEl().css('paddingRight', '20px');
78            self.modalBody = modal.getContentEl().parents('.modal-body');
79            if(window.isUserPageRedesignEnabled) {
80                modal.getHeaderEl().attr('id', 'rd-modal_offer-header');
81                self.modalBody.attr('id', 'rd-modal_offer-body');
82            }
83            var $searchContainer = $('<div class="rd-search-order-container"> </div>');
84            var $selectedOrderContainer = $('<div class="rd-selected-order-container"> </div>');
85            $tagsSelector = $('<input  type="text" class="tags-input">')
86
87            if (window.isUserPageRedesignEnabled) {
88                $tagsSelector.appendTo( $searchContainer )
89            } else {
90                $tagsSelector.appendTo( modal.getHeaderEl() )
91            }
92
93            if ( this.selectedTags ) {
94                $tagsSelector.val( this.selectedTags );
95            }
96
97            this.tagsCloud = $tagsSelector.tagsCloud( {
98                contextName: field.context,
99                objectTypeId: field.objectTypeId,
100                onChange: function() {
101                    self.doSearch();
102                }
103            } );
104
105            modal.setContent("")
106            if (window.isUserPageRedesignEnabled) {
107                var $searchBlock = $('<div class="input-group flex-8 rd-order-search-input">'
108                    + '<input placeholder="' + window.tt('common', 'search')
109                    + '" type="text" class="rd-input-text rd-input-small w-100 search-str form-control">'
110                    + '<span class="input-group-btn hidden">'
111                    + '<button class="btn btn-primary search-btn" type="submit">'
112                    + window.tt('common', 'Find')
113                    + '</button>'
114                    + '</span>'
115                    + '</div>'
116                );
117            } else {
118                var $searchBlock = $('<div class="input-group margin-bottom-10">'
119                    + '<input placeholder="' + window.tt('common', 'search') + '" type="text" class="search-str form-control">'
120                    + '<span class="input-group-btn">'
121                    + '<button class="btn btn-primary search-btn" type="submit">' + window.tt('common', 'Find') + '</button>'
122                    + '</span></div>'
123                );
124            }
125            this.searchStrEl = $searchBlock.find( '.search-str' );
126            this.searchButtonEl = $searchBlock.find( '.search-btn' );
127
128            if (window.isUserPageRedesignEnabled) {
129                $searchBlock.appendTo($searchContainer)
130            } else {
131                $searchBlock.appendTo( modal.getContentEl() );
132            }
133            modal.getHeaderEl().css('backgroundColor', '#F0F0F0')
134
135            self.tableContentEl = $('<div/>')
136            self.tableContentEl.appendTo( modal.getContentEl() )
137
138            this.searchStrEl.keyup( function( e ) {
139                self.doSearch();
140            });
141
142            this.searchButtonEl.click( function() {
143                self.doSearch();
144            })
145
146            if (window.isUserPageRedesignEnabled) {
147                self.selectedEl = $selectedEl = $('<div class="select-object-preselect select-object-short"></div>')
148                $selectedEl.appendTo( $selectedOrderContainer )
149            } else {
150                self.selectedEl = $selectedEl = $('<div style="margin-top: 10px;" class="select-object-preselect select-object-short"></div>')
151                $selectedEl.appendTo( modal.getHeaderEl() )
152            }
153
154            if ( ! this.field.multi ) {
155                $selectedEl.hide();
156            }
157
158
159            $buttonsEl = $('<div class="clearfix margin-top-5"/>')
160
161            if ( this.field.multi ) {
162                $buttonsEl.appendTo( $selectedEl )
163            }
164            else {
165                $buttonsEl.appendTo( modal.getFooterEl() )
166            }
167
168            var $saveBtn;
169
170            var $clearBtn;
171
172            if (window.isUserPageRedesignEnabled) {
173                $saveBtn = $('<button class="pull-left btn btn-success">' + Yii.t('common', 'Добавить') + '</button>')
174                $clearBtn = $('<button class="pull-left margin-left-5 rd-btn rd-btn-small rd-btn-secondary btn-link">'
175                    + window.tt('common', 'Отменить')
176                    + '</button>'
177                );
178                $saveBtn.prop('disabled', true);
179                var $saveBtnWrapper = $('<div class="rd-offer-btn-panel flex-8"></div>');
180                $saveBtn.appendTo($saveBtnWrapper);
181                $clearBtn.appendTo($saveBtnWrapper);
182                $saveBtnWrapper.appendTo(modal.getContentEl());
183
184                $searchContainer.appendTo(modal.getHeaderEl())
185                $selectedOrderContainer.appendTo(modal.getHeaderEl())
186            } else {
187                $saveBtn = $('<button class="pull-left btn btn-success">' + Yii.t('common', 'Выбрать') + '</button>')
188                $clearBtn = $('<button class="pull-left margin-left-5 btn btn-link">'
189                    + window.tt('common', 'Reset')
190                    + '</button>'
191                );
192                $saveBtn.appendTo( $buttonsEl );
193                $clearBtn.appendTo( $buttonsEl );
194            }
195            $saveBtn.click( function() {
196                if ( ! self.field.multi ) {
197                    self.doSelect();
198                }
199                self.saveValue()
200            })
201
202            $clearBtn.click( function() {
203                self.preSelectedIds = [];
204                self.selectedTags = [];
205                self.allObjectWithTags = false;
206                self.saveValue()
207            })
208
209        }
210        self.updateSelectedView();
211
212        this.doSearch( field, this.searchModal );
213        this.searchModal.show();
214    };
215
216    this.detectPreviousActiveModal = function() {
217        var active = window.gcModalActive();
218        if (active && !active.isActive()) {
219            active = null;
220        }
221
222        if (!active || !this.searchModal || active.getId() !== this.searchModal.getId()) {
223            this.previousModal = active;
224        }
225
226        return this.previousModal;
227    };
228
229    this.doSearch = function() {
230        var modal= this.searchModal;
231        var field = this.field;
232
233        this.selectedTags = this.tagsCloud.tagsCloud('getTags')
234        var archived = this.tagsCloud.tagsCloud('getArchived')
235        ++countLoader;
236        var url = window.isUserPageRedesignEnabled
237            ? '/pl/logic/context/select-object?isRedesign=1'
238            : '/pl/logic/context/select-object'
239        ajaxCall(
240            url, {
241                context: field.context,
242                searchStr: this.searchStrEl.val(),
243                tagNames: this.selectedTags.join(","),
244                archived: archived,
245                free: field.is_free,
246                excludeTypes: field.excludeTypes,
247                countLoader: countLoader
248            }, {},
249            function (response) {
250                if (response.data.countLoader >= countLoader) {
251                    self.tableContentEl.html(response.data.html)
252                    self.makeSelectableTable(self.tableContentEl)
253                    self.updateSelectedView();
254                }
255            }
256        );
257    }
258
259    this.makeSelectableTable = function( $contentEl ){
260        $table = $contentEl.find('table')
261        $table.addClass( "table-selectable" )
262        self.table = $table;
263
264        $contentEl.find('tr').click( function() {
265            $table.find('tr.selected').removeClass('selected')
266            $(this).addClass('selected');
267        })
268
269        $contentEl.find('tr').dblclick( function() {
270            self.doSelect()
271        })
272
273        $contentEl.find('a.choose-row-button').click(function() {
274            $(this).parents('tr:first').click();
275            self.doSelect();
276            if (window.isUserPageRedesignEnabled) {
277                $('#rd-modal_offer-body .btn.btn-success').removeAttr('disabled');
278            }
279        });
280    }
281
282    this.doSelect = function() {
283        if ( ! self.table ) {
284            alert("Нет выбранного элемента");
285            return;
286        }
287        var key = self.table.find('tr.selected').data('key')
288
289        if ( ! this.field.multi ) {
290            this.preSelectedIds = [ key ];
291            this.saveValue();
292        }
293        else {
294            this.preSelectedIds.push( key );
295            this.updateSelectedView();
296        }
297    }
298
299    this.updateSelectedView = function() {
300        var self = this;
301        if ( ! this.selectedEl || ! this.field.multi ) {
302            return;
303        }
304
305        self.selectedEl.find('.objects-list').detach();
306        var $objectsList = $('<div class="objects-list margin-bottom-5 clearfix"></div>')
307        $objectsList.prependTo(self.selectedEl);
308
309        $selectAllTagsNode = window.isUserPageRedesignEnabled
310            ? `<div><label class="rd-flex gap-4 m-bottom-12">${window.tt('common', 'Select all with selected tags')}</label></div>`
311            : `<div><label> ${window.tt('common', 'Select all with selected tags')}</label></div>`;
312
313        $allWithTags = $($selectAllTagsNode);
314
315        $selectAllObjectsWithTagsEl = window.isUserPageRedesignEnabled
316            ? $('<input class="rd-checkbox rd-checkbox-small" type="checkbox">')
317            : $('<input class="margin-right-5" type="checkbox">');
318        $selectAllObjectsWithTagsEl.prependTo( $allWithTags.find('label') )
319
320        $selectAllObjectsWithTagsEl.click( function() {
321            self.allObjectWithTags = $(this).prop('checked');
322            if ( self.allObjectWithTags ) {
323                if (window.isUserPageRedesignEnabled) {
324                    self.tableContentEl.hide();
325                    $('#rd-modal_offer-body .btn.btn-success').removeAttr('disabled');
326                } else {
327                    self.modalBody.hide()
328                }
329            }
330            else {
331                window.isUserPageRedesignEnabled ? self.tableContentEl.show() : self.modalBody.show();
332            }
333        })
334
335        if ( this.allObjectWithTags ) {
336            //$selectAllObjectsWithTagsEl.prop( 'checked', true )
337            $selectAllObjectsWithTagsEl.click();
338        }
339
340
341        if ( this.field.multi && this.selectedTags.length == 0 || this.preSelectedIds.length > 1 ) {
342            self.modalBody.show();
343        }
344
345
346        var somethingShown = false;
347
348        if( ! this.preSelectedIds.length || this.preSelectedIds.length == 0 ) {
349            //$objectsList.html( "ничего не выбрано" );
350            if ( this.selectedTags.length > 0 ) {
351                $allWithTags.appendTo( $objectsList )
352                somethingShown = true;
353            }
354        }
355        else {
356            if ( this.preSelectedIds.length > 0 ) {
357                somethingShown = true;
358            }
359            var url = window.isUserPageRedesignEnabled
360                ? '/pl/logic/context/object-titles?isRedesign=1'
361                : '/pl/logic/context/object-titles'
362            ajaxCall(url, { context: this.field.context, ids: this.preSelectedIds }, {}, function (response) {
363                let preSelectedIds = self.preSelectedIds;
364
365                if (!Array.isArray(preSelectedIds)) {
366                    preSelectedIds = [preSelectedIds];
367                }
368
369                for (const id of preSelectedIds) {
370                    const title = response.data.titles[id]
371                        ? response.data.titles[id]
372                        : Yii.t('common', 'Устаревшее значение');
373                    const url = response.data.urls[id];
374                    var extraClassItem = '';
375                    var extraClassLink = '';
376                    if (window.isUserPageRedesignEnabled) {
377                        extraClassItem = 'objects-list-item'
378                        extraClassLink = 'class="rd-link"'
379                    }
380
381                    let $el;
382
383                    if (url) {
384                        $el = $(
385                            "<div class='margin-bottom-5 " + extraClassItem + "'><span>" + title +
386                            " (<a " + extraClassLink + " href='" + url + "'>id:" + id + "</a>)</span></div>"
387                        );
388                    } else {
389                        $el = $(
390                            "<div class='margin-bottom-5 " + extraClassItem + "'><span>" + title +
391                            "</span></div>"
392                        );
393                    }
394
395                    $el.appendTo( $objectsList )
396
397                    var $btnDel = $("<button class='btn btn-link btn-xs margin-right-5'>x</button>")
398                    if (window.isUserPageRedesignEnabled) {
399                        $btnDel = $("<div class='rd-order-unselect'><i class='gc-icon gc-close'></i></div>")
400                    }
401                    $btnDel.data('object-id', id)
402                    $btnDel.click( function() {
403                        var newIds = []
404                        for( var i in self.preSelectedIds ) {
405                            if ( self.preSelectedIds[i] != $(this).data('object-id') ) newIds.push( self.preSelectedIds[i] );
406                        }
407                        self.preSelectedIds = newIds
408                        self.updateSelectedView();
409
410                        if (window.isUserPageRedesignEnabled) {
411                            if (!$('.objects-list-item').length) {
412                                $('button.pull-left.btn.btn-success').prop('disabled', true);
413                            }
414                        }
415                    })
416                    $btnDel.prependTo( $el )
417                }
418                if (window.isUserPageRedesignEnabled) {
419                    if ($('.objects-list-item').length) {
420                        $('button.pull-left.btn.btn-success').prop('disabled', false);
421                    }
422                }
423            });
424        }
425        if ( this.selectedTags && this.selectedTags.length > 0 ) {
426            somethingShown = true;
427        }
428
429        if ( ! somethingShown ) {
430            self.selectedEl.hide();
431        }
432        else {
433            self.selectedEl.show();
434        }
435
436        if (window.isUserPageRedesignEnabled) {
437            $('.tag-editor-delete').on('click', (e) => {
438                const parentUl = $(e.target).closest('ul');
439                const tagsLength = parentUl.children('li:not(.ui-sortable-handle)').length;
440                const tagsChecked = $selectAllObjectsWithTagsEl.prop('checked');
441                if (tagsLength < 2 && tagsChecked) {
442                    $selectAllObjectsWithTagsEl?.click();
443                }
444            })
445        }
446    };
447
448    this.saveValue = function() {
449        this.selectedIds = [];
450        for ( var key in  this.preSelectedIds ) {
451            this.selectedIds.push( this.preSelectedIds[key]);
452        }
453
454        if ( self.valueChanged ) {
455            self.valueChanged( this.field.multi ? self.selectedIds : self.selectedIds[0] , self.values );
456        }
457        self.changed();
458        self.loadData( this.shortEl );
459
460        if (this.valueInput && this.selectedIds) {
461            this.valueInput.val(this.selectedIds);
462            this.valueInput.trigger('selectObjectFieldWidget_selected');
463        }
464
465        this.searchModal.hide();
466    };
467
468    /*this.valueChanged = function( selectedId, models ) {
469    	self.doSearch();
470    };*/
471
472
473    this.getValue = function() {
474        return {
475            selected_id: this.field.multi ? this.selectedIds : this.selectedIds[0],
476            selected_tags: this.selectedTags,
477            all_object_with_tags: this.allObjectWithTags
478        };
479    };
480
481    this.setValue = function (value, init = false) {
482        if ( value && value.selected_id && typeof value.selected_id.length != "undefined" ) {
483            this.selectedIds = value.selected_id;
484        }
485        else if ( value && value.selected_id ) {
486            this.selectedIds = [value.selected_id];
487        }
488        else {
489            this.selectedIds = [];
490        }
491        if ( value ) {
492            if ( value.selected_tags ) {
493                this.selectedTags = value.selected_tags;
494            }
495            this.allObjectWithTags = value.all_object_with_tags ? value.all_object_with_tags : false
496        }
497
498        if (!!window.UnsavedChangesFix) {
499            this.loadData(this.shortEl, init);
500        } else {
501            this.loadData(this.shortEl);
502        }
503    };
504
505    this.loadData = function (element, init = false) {
506        var emptyText = this.field.emptyText ? this.field.emptyText : Yii.t("common", "не выбрано");
507        var widget = this;
508
509        if( ! this.selectedIds.length ) {
510            if ( this.selectedTags.length > 0 && this.allObjectWithTags ) {
511                element.html( "<span class='fa fa-hand-o-up'></span> Все с тегами: " + this.selectedTags.join(", ") );
512            }
513            else {
514                if (window.isUserPageRedesignEnabled) {
515                    element.html(`<div class="rd-btn rd-btn-secondary rd-btn-small">
516                        <i class="gc-icons gc-plus" style="font-size: 20px"></i>
517                        <span class="rd-empty-text rd-body-s">${emptyText}</span></div>`);
518                } else {
519                    element.html( "<span class='fa fa-hand-o-up'></span> " + emptyText );
520                }
521            }
522
523            element.trigger('change');
524        } else {
525            var url = window.isUserPageRedesignEnabled
526                ? '/pl/logic/context/object-titles?isRedesign=1'
527                : '/pl/logic/context/object-titles';
528            ajaxCall(url, { context: this.field.context, ids: this.selectedIds }, {}, function (response) {
529                let selectedIds = self.selectedIds;
530
531                if (!Array.isArray(selectedIds)) {
532                    selectedIds = [selectedIds];
533                }
534
535                element.empty();
536
537                for (const id of selectedIds) {
538                    const title = response.data.titles[id]
539                        ? response.data.titles[id]
540                        : Yii.t('common', 'Устаревшее значение');
541                    const $el = $("<div class='position-item'><span>" + title + "</span></div>");
542                    $el.appendTo(element);
543
544                    if (widget.valueInput && widget.selectedIds) {
545                        widget.valueInput.val(widget.selectedIds);
546                    }
547                }
548
549                if (!!window.UnsavedChangesFix) {
550                    $(element)[init ? 'addClass' : 'removeClass']('by-init');
551                }
552
553                element.trigger('change');
554            });
555        }
556    }
557}
558
559extend( SelectObjectFieldWidget, FieldWidget );
560SelectObjectFieldWidget.prototype = new FieldWidget();
561
562window.logicFieldWidgets["selectObject"] = SelectObjectFieldWidget;

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.