109 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <section>
 | |
|     <div class="AiSearchBar" :class="{bottomBorder}" :style="searchBarStyle">
 | |
|       <div ref="AiSearchBarZone" class="searchLeftZone">
 | |
|         <slot name="left"/>
 | |
|       </div>
 | |
|       <div class="searchRightZone" ref="searchRightZone">
 | |
|         <slot name="right"/>
 | |
|       </div>
 | |
|     </div>
 | |
|     <ai-pull-down v-if="!isSingleRow" @change="handlePullDown" :height="rightHeight"/>
 | |
|   </section>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| export default {
 | |
|   name: "AiSearchBar",
 | |
|   props: {
 | |
|     bottomBorder: Boolean,
 | |
|     size: {default: "small"}
 | |
|   },
 | |
|   computed: {
 | |
|     isSingleRow: v => v.height <= 45
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       height: 0,
 | |
|       rightHeight: 0,
 | |
|       searchBarStyle: {},
 | |
|       observer: null
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     handlePullDown(style) {
 | |
|       this.searchBarStyle = style
 | |
|       if (style.height == 'auto') {
 | |
|         this.searchBarStyle.marginBottom = '16px'
 | |
|       } else {
 | |
|         this.searchBarStyle.marginBottom = '0'
 | |
|       }
 | |
|     },
 | |
|     initSize() {
 | |
|       this.height = this.$refs?.AiSearchBarZone?.offsetHeight
 | |
|       this.rightHeight = this.$refs?.searchRightZone?.offsetHeight + 12
 | |
|     }
 | |
|   },
 | |
|   mounted() {
 | |
|     this.$nextTick(() => {
 | |
|       this.initSize()
 | |
|       this.observer = new ResizeObserver(this.initSize)
 | |
|       this.observer.observe(this.$refs?.AiSearchBarZone)
 | |
|     })
 | |
|   },
 | |
|   beforeDestroy() {
 | |
|     this.observer?.disconnect()
 | |
|   }
 | |
| }
 | |
| </script>
 | |
| 
 | |
| <style lang="scss" scoped>
 | |
| .AiSearchBar {
 | |
|   display: flex;
 | |
|   justify-content: space-between;
 | |
|   align-items: flex-start;
 | |
|   gap: 10px;
 | |
|   padding-bottom: 12px;
 | |
| 
 | |
|   &.bottomBorder {
 | |
|     border-bottom: 1px solid #eee;
 | |
|   }
 | |
| 
 | |
|   :deep(.searchLeftZone ) {
 | |
|     flex: 1;
 | |
|     min-width: 0;
 | |
|     display: flex;
 | |
|     flex-wrap: wrap;
 | |
|     align-items: center;
 | |
|     gap: 8px;
 | |
|   }
 | |
| 
 | |
|   :deep(.searchRightZone ) {
 | |
|     display: flex;
 | |
|     align-items: center;
 | |
|     flex-shrink: 0;
 | |
|     align-self: flex-start;
 | |
| 
 | |
|     .el-input {
 | |
|       width: 280px;
 | |
|     }
 | |
| 
 | |
|     * + button, * + div, * + section {
 | |
|       margin-left: 8px;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   .el-input {
 | |
|     width: auto;
 | |
|   }
 | |
| }
 | |
| 
 | |
| .AiPullDown {
 | |
|   margin-top: 8px;
 | |
| }
 | |
| 
 | |
| :deep( .searchLeftZone > .el-button), :deep( .searchRightZone > .el-button ) {
 | |
|   margin-left: 0;
 | |
| }
 | |
| </style>
 |