Advertisement
Guest User

Untitled

a guest
Oct 14th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <template>
  2.  
  3.     <div class="results-wrap">
  4.         <div class="results-input-wrap">
  5.             <span class="input-arrow"
  6.                   :class="{ 'opened': isOpen }"
  7.                   @click="isOpen = !isOpen">
  8.             </span>
  9.             <input type="text" placeholder="МРФ" class="results-input"
  10.                    @click="isOpen = !isOpen"
  11.                    @input="onChange"
  12.                    v-model="search"
  13.                    @keyup.down="onArrowDown"
  14.                    @keyup.up="onArrowUp"
  15.                    @keyup.enter="onEnter"
  16.                    :data-val="search"
  17.                    :disabled="disabled"
  18.             />
  19.             <span class="disabled-line"></span>
  20.         </div>
  21.         <ul v-show="isOpen" class="results-list">
  22.             <li class="loading" v-if="isLoading">
  23.                 Loading list...
  24.             </li>
  25.             <li v-else v-for="(result, i) in results" :key="i" @click="setResult(result)"
  26.                 class="item-result" :class="{ 'is-active': i === arrowCounter }">
  27.                 {{ result }}
  28.             </li>
  29.         </ul>
  30.     </div>
  31.  
  32.  
  33. </template>
  34.  
  35. <script>
  36.     export default {
  37.         name: 'autocomplete',
  38.         props: {
  39.             list: {
  40.                 required: true,
  41.                 default: []
  42.             },
  43.             disabled: {
  44.                 default: false,
  45.             }
  46.         },
  47.         data() {
  48.             console.log(this.list);
  49.             return {
  50.                 isOpen: false,
  51.                 results: this.list,
  52.                 search: '',
  53.                 isLoading: false,
  54.                 arrowCounter: 0,
  55.             };
  56.         },
  57.         methods: {
  58.             onChange() {
  59.  
  60.                 this.$emit('input', this.search);
  61.  
  62.  
  63.                 if (this.isAsync) {
  64.                     this.isLoading = true;
  65.                 } else {
  66.            
  67.                     this.filterResults();
  68.                     this.isOpen = true;
  69.                 }
  70.             },
  71.             filterResults() {
  72.  
  73.                 this.results = this.list;
  74.                 this.results = this.results.filter((item) => {
  75.                     return item.toLowerCase().indexOf(this.search.toLowerCase()) > -1;
  76.                     //toLowerCase к нижнему регистру
  77.                     //indexOf() возвращает индекс первого вхождения указанного значения в строковый объект String
  78.                 });
  79.             },
  80.             setResult(result) {
  81.                 this.$emit('setItem', result);
  82.                 this.search = result;
  83.                 this.isOpen = false;
  84.             },
  85.             onArrowDown(evt) {
  86.                 console.log(this.results.length);
  87.                 console.log(this.arrowCounter);
  88.                 if (this.arrowCounter < this.results.length - 1) {
  89.                     this.arrowCounter = this.arrowCounter + 1;
  90.                 }
  91.             },
  92.             onArrowUp() {
  93.                 if (this.arrowCounter > 0) {
  94.                     this.arrowCounter = this.arrowCounter - 1;
  95.                 }
  96.             },
  97.             onEnter() {
  98.                 this.search = this.results[this.arrowCounter];
  99.                 this.isOpen = false;
  100.                 this.arrowCounter = -1;
  101.             },
  102.             handleClickOutside(evt) {
  103.                 if (!this.$el.contains(evt.target)) {
  104.                     this.isOpen = false;
  105.                     this.arrowCounter = -1;
  106.                 }
  107.             }
  108.         },
  109.         watch: {
  110.             items: function (val, oldValue) {
  111.                 // actually compare them
  112.                 if (val.length !== oldValue.length) {
  113.                     this.list = val;
  114.                     this.isLoading = false;
  115.                 }
  116.             },
  117.         },
  118.         // created() {
  119.         //     //ajax
  120.         //     this.results = ['Сибирь', 'Урал', 'Дальний восток', 'Центр', 'Волга', 'Дальний юг', 'Дальний юг-pfgfl','Сибирь', 'Урал', 'Дальний восток', 'Центр', 'Волга', 'Дальний юг', 'Дальний юг-pfgfl'];
  121.         //     this.list = ['Сибирь', 'Урал', 'Дальний восток', 'Центр', 'Волга', 'Дальний юг', 'Дальний юг-pfgfl','Сибирь', 'Урал', 'Дальний восток', 'Центр', 'Волга', 'Дальний юг', 'Дальний юг-pfgfl'];
  122.         //
  123.         // },
  124.         mounted() {
  125.             document.addEventListener('click', this.handleClickOutside)
  126.         },
  127.         destroyed() {
  128.             document.removeEventListener('click', this.handleClickOutside)
  129.         }
  130.     };
  131.  
  132. </script>
  133.  
  134. <style scoped>
  135.     input {
  136.         border: none;
  137.         outline: none;
  138.         font-size: 16px;
  139.         line-height: 19px;
  140.         color: #101828;
  141.         padding-bottom: 5px;
  142.     }
  143.  
  144.     .results-wrap {
  145.         position: relative;
  146.         width: 230px;
  147.     }
  148.  
  149.     .results-input-wrap {
  150.         position: relative;
  151.         width: 100%;
  152.         display: block;
  153.     }
  154.  
  155.     .results-input {
  156.         border-bottom: 2px solid #CDCDCD;
  157.         width: 100%;
  158.     }
  159.  
  160.     input::-webkit-input-placeholder {
  161.         font-size: 16px;
  162.         line-height: 19px;
  163.         color: #b7babf;
  164.         transition: 0.3s;
  165.     }
  166.  
  167.     input:focus::-webkit-input-placeholder {
  168.         color: #585d69;
  169.     }
  170.  
  171.  
  172.     .input-arrow {
  173.         position: absolute;
  174.         right: 0;
  175.         top: 6px;
  176.         background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAPBAMAAADjSHnWAAAAMFBMVEUAAAAQGCgQGCgQGCgQFSkQGCcQECAQFykQGCgQGCgQGCgQGSkQFycQGSkQFiYQGCh56ogeAAAAD3RSTlMAIN9/MM8Q75+/X++wcFAiKnElAAAAfElEQVQI103LywnCQBRG4SOGoLtBSAFWoB24DFiAW7O1iqQDm7AQS7AEa4gIPhbHxBnCnM3l8vETu5A1/96zb+cnI/WWkT5ILbTVbfrO9vsJT7qmTlge7QNF6wugGglW2sFs4zMQb8NSDxDxOgzeDfxxmFN3xKpxXpAqAz8iczPTR8TJTQAAAABJRU5ErkJggg==');
  177.         background-size: 11px 5px;
  178.         background-position: center;
  179.         background-repeat: no-repeat;
  180.         width: 11px;
  181.         height: 11px;
  182.         display: block;
  183.         transform: rotate(180deg);
  184.         opacity: 0.3;
  185.         transition: 0.3s;
  186.     }
  187.  
  188.     .input-arrow:hover {
  189.         cursor: pointer;
  190.     }
  191.  
  192.     .opened {
  193.         opacity: 1;
  194.         transform: rotate(0);
  195.     }
  196.  
  197.     .disabled-line {
  198.         position: absolute;
  199.         bottom: 0;
  200.         z-index: 4;
  201.         display: block;
  202.         width: 0;
  203.         height: 2px;
  204.         background: #7800FF;
  205.         transition: 0.3s;
  206.     }
  207.  
  208.     /*.active {*/
  209.     /*    width: 100%;*/
  210.     /*}*/
  211.  
  212.     .results-input:not([data-val='']) ~ .disabled-line,
  213.     .results-input:focus ~ .disabled-line {
  214.         width: 100%;
  215.     }
  216.  
  217.     .results-list {
  218.         padding: 0;
  219.         margin: 0;
  220.         max-height: 280px;
  221.         overflow: auto;
  222.         width: 100%;
  223.         box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
  224.         -webkit-overflow-scrolling: touch;
  225.     }
  226.  
  227.     .results-list::-webkit-scrollbar {
  228.         width: 4px;
  229.         cursor: pointer;
  230.         padding-right: 10px;
  231.  
  232.     }
  233.  
  234.     .results-list::-webkit-scrollbar-track {
  235.         height: 90%;
  236.         background: #E3E8EC;
  237.         border-radius: 2px;
  238.     }
  239.  
  240.     .results-list::-webkit-scrollbar-thumb {
  241.         background: #7800FF;
  242.         border-radius: 2px;
  243.     }
  244.  
  245.     .item-result {
  246.         results-style: none;
  247.         text-align: left;
  248.         padding: 10px 20px;
  249.         cursor: pointer;
  250.         font-size: 14px;
  251.         line-height: 20px;
  252.         letter-spacing: 0.161px;
  253.         color: rgba(16, 24, 40, 0.3);
  254.         transition: 0.3s;
  255.     }
  256.  
  257.     .item-result.is-active,
  258.     .item-result:hover {
  259.         background-color: #7800FF;
  260.         color: white;
  261.     }
  262.  
  263. </style>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement