1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  | <template> 
 |    <div ref="rightPanel" class="rightPanel-container"> 
 |      <div class="rightPanel-background" /> 
 |      <div class="rightPanel"> 
 |        <div class="rightPanel-items"> 
 |          <slot /> 
 |        </div> 
 |      </div> 
 |    </div> 
 |  </template> 
 |    
 |  <script> 
 |  export default { 
 |    name: 'RightPanel', 
 |    props: { 
 |      clickNotClose: { 
 |        default: false, 
 |        type: Boolean 
 |      } 
 |    }, 
 |    computed: { 
 |      show: { 
 |        get() { 
 |          return this.$store.state.settings.showSettings 
 |        }, 
 |        set(val) { 
 |          this.$store.dispatch('settings/changeSetting', { 
 |            key: 'showSettings', 
 |            value: val 
 |          }) 
 |        } 
 |      } 
 |    }, 
 |    watch: { 
 |      show(value) { 
 |        if (value && !this.clickNotClose) { 
 |          this.addEventClick() 
 |        } 
 |      } 
 |    }, 
 |    mounted() { 
 |      this.addEventClick() 
 |    }, 
 |    beforeDestroy() { 
 |      const elx = this.$refs.rightPanel 
 |      elx.remove() 
 |    }, 
 |    methods: { 
 |      addEventClick() { 
 |        window.addEventListener('click', this.closeSidebar) 
 |      }, 
 |      closeSidebar(evt) { 
 |        const parent = evt.target.closest('.el-drawer__body') 
 |        if (!parent) { 
 |          this.show = false 
 |          window.removeEventListener('click', this.closeSidebar) 
 |        } 
 |      } 
 |    } 
 |  } 
 |  </script> 
 |    
 |  <style lang="scss" scoped> 
 |  .rightPanel-background { 
 |    position: fixed; 
 |    top: 0; 
 |    left: 0; 
 |    opacity: 0; 
 |    transition: opacity .3s cubic-bezier(.7, .3, .1, 1); 
 |    background: rgba(0, 0, 0, .2); 
 |    z-index: -1; 
 |  } 
 |    
 |  .rightPanel { 
 |    width: 100%; 
 |    max-width: 260px; 
 |    height: 100vh; 
 |    position: fixed; 
 |    top: 0; 
 |    right: 0; 
 |    box-shadow: 0px 0px 15px 0px rgba(0, 0, 0, .05); 
 |    transition: all .25s cubic-bezier(.7, .3, .1, 1); 
 |    transform: translate(100%); 
 |    background: #fff; 
 |    z-index: 40000; 
 |  } 
 |    
 |  .handle-button { 
 |    width: 48px; 
 |    height: 48px; 
 |    position: absolute; 
 |    left: -48px; 
 |    text-align: center; 
 |    font-size: 24px; 
 |    border-radius: 6px 0 0 6px !important; 
 |    z-index: 0; 
 |    pointer-events: auto; 
 |    cursor: pointer; 
 |    color: #fff; 
 |    line-height: 48px; 
 |    i { 
 |      font-size: 24px; 
 |      line-height: 48px; 
 |    } 
 |  } 
 |  </style> 
 |  
  |