// --------------------------------------------------------------------------------- // // Component: Autocomplete // // Input Props: // - id // - name // - required // - disabled // - placeholder // - sstyle // - value (to je v-model) // - model-text (ovo je samo trenutni text) // - search-results // // // Vue.component('autocomplete', { props: [ 'id', 'name', 'sstyle', 'required', 'disabled', 'placeholder', 'value', 'modelText', 'searchResults', 'maxlength', 'minlength' ], data: function () { return { query: '', cModelText: null } }, computed: { hasSearchResultsListener() { return this.$listeners && this.$listeners.searchresults ? true : false } }, mounted: function () { var self = this; this.cModelText = this.modelText != undefined ? this.modelText : ''; $(document).on('click',function(event) { //saznaj da li ima neko u grani iznad klasu: if($(event.target).parents('.autoc').length){}; if( $(event.target).parent().hasClass('autoc') ) { $('.autoc-results').not($(event.target).next()).hide(); $(this.$el).removeClass('opened'); } else { $('.autoc-results').hide(); $('.autoc-results').parent().removeClass('opened'); } }); }, methods: { Search: function(e) { var self = this; var searchResults = $(this.$el).find('.autoc-results'); var currSelected = $(searchResults).find('.selected'); var offset = $(currSelected).position(); // ovo je pozicija unutar kontejnera (ako je div 200px max offset.top je 200, a ne duzina kompletne liste) $(self.$el).find('.autoc-results').hide(); setTimeout(function() { //alert($(self.$el).find('.autoc-text').val()); $(self.$el).find('.autoc-text').blur(); $(searchResults).scrollTop(0); $(searchResults).removeClass('selected').children().first().addClass('selected'); self.$emit('input', null); self.$emit('change', self.cModelText); if(self.hasSearchResultsListener) { $(self.$el).addClass('spiner'); self.$emit('searchresults', self.cModelText); } $(self.$el).find('.autoc-text').focus(); },100); }, InputFocus: function() { if(this.searchResults.length > 0 && !$(this.$el).hasClass('spiner')) { $(this.$el).find('.autoc-results').slideDown(100); $(this.$el).addClass('opened'); } }, ResultClick: function(resultItem) { this.$emit('input', resultItem.id); this.$emit('change', resultItem.name); this.cModelText = resultItem.name; $(this.$el).find('.autoc-results').slideUp(100); $(this.$el).removeClass('opened'); }, }, watch:{ searchResults (val) { $(this.$el).removeClass('spiner'); if(val.length > 0) { $(this.$el).find('.autoc-results').slideDown(100); $(this.$el).addClass('opened'); } }, value (val) { this.value = val; }, modelText (val) { this.cModelText = val; } }, template: '
'+ ' '+ '
'+ '
{{result.name}}
'+ '
'+ '
' });