111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div class="search columns is-gapless is-vcentered" v-show="showSearch" v-if="settings.search">
 | |
|     <div class="column">
 | |
|       <p class="control has-icons-left">
 | |
|         <input
 | |
|           class="input"
 | |
|           type="text"
 | |
|           placeholder="Find / RegEx"
 | |
|           ref="filter"
 | |
|           v-model="filter"
 | |
|           @keyup.esc="resetSearch()"
 | |
|         />
 | |
|         <span class="icon is-left">
 | |
|           <icon name="search"></icon>
 | |
|         </span>
 | |
|       </p>
 | |
|     </div>
 | |
|     <div class="column is-1 has-text-centered">
 | |
|       <button class="delete is-medium" @click="resetSearch()"></button>
 | |
|     </div>
 | |
|   </div>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| import { mapActions, mapState } from "vuex";
 | |
| import hotkeys from "hotkeys-js";
 | |
| import Icon from "./Icon";
 | |
| 
 | |
| export default {
 | |
|   props: [],
 | |
|   name: "Search",
 | |
|   components: {
 | |
|     Icon,
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       showSearch: false,
 | |
|     };
 | |
|   },
 | |
|   mounted() {
 | |
|     hotkeys("command+f, ctrl+f", (event, handler) => {
 | |
|       this.showSearch = true;
 | |
|       this.$nextTick(() => this.$refs.filter.focus() || this.$refs.filter.select());
 | |
|       event.preventDefault();
 | |
|     });
 | |
|     hotkeys("esc", (event, handler) => {
 | |
|       this.resetSearch();
 | |
|     });
 | |
|   },
 | |
|   methods: {
 | |
|     ...mapActions({
 | |
|       updateSearchFilter: "SET_SEARCH",
 | |
|     }),
 | |
|     resetSearch() {
 | |
|       this.showSearch = false;
 | |
|       this.filter = "";
 | |
|     },
 | |
|   },
 | |
|   computed: {
 | |
|     ...mapState(["searchFilter", "settings"]),
 | |
|     filter: {
 | |
|       get() {
 | |
|         return this.searchFilter;
 | |
|       },
 | |
|       set(value) {
 | |
|         this.updateSearchFilter(value);
 | |
|       },
 | |
|     },
 | |
|   },
 | |
| };
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .search {
 | |
|   width: 350px;
 | |
|   position: fixed;
 | |
|   padding: 10px;
 | |
|   background: var(--scheme-main-ter);
 | |
|   top: 0;
 | |
|   right: 0;
 | |
|   border-radius: 0 0 0 5px;
 | |
|   z-index: 10;
 | |
|   box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
 | |
| 
 | |
|   button.delete {
 | |
|     margin-left: 1em;
 | |
|     background-color: var(--scheme-main-ter);
 | |
|     opacity: 0.6;
 | |
|     &:after,
 | |
|     &:before {
 | |
|       background-color: var(--text-color);
 | |
|     }
 | |
| 
 | |
|     &:hover {
 | |
|       opacity: 1;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .icon {
 | |
|     padding: 10px 3px;
 | |
|   }
 | |
| 
 | |
|   .input {
 | |
|     color: var(--body-color);
 | |
|     &::placeholder {
 | |
|       color: var(--border-color);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 | 
