feature: add drag select component (#1249)
This commit is contained in:
		@@ -118,6 +118,7 @@ Understanding and learning this knowledge in advance will greatly help the use o
 | 
				
			|||||||
  - Avatar Upload
 | 
					  - Avatar Upload
 | 
				
			||||||
  - Back To Top
 | 
					  - Back To Top
 | 
				
			||||||
  - Drag Dialog
 | 
					  - Drag Dialog
 | 
				
			||||||
 | 
					  - Drag Select
 | 
				
			||||||
  - Drag Kanban
 | 
					  - Drag Kanban
 | 
				
			||||||
  - Drag List
 | 
					  - Drag List
 | 
				
			||||||
  - SplitPane
 | 
					  - SplitPane
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,6 +130,7 @@
 | 
				
			|||||||
  - 头像上传
 | 
					  - 头像上传
 | 
				
			||||||
  - 返回顶部
 | 
					  - 返回顶部
 | 
				
			||||||
  - 拖拽Dialog
 | 
					  - 拖拽Dialog
 | 
				
			||||||
 | 
					  - 拖拽Select
 | 
				
			||||||
  - 拖拽看板
 | 
					  - 拖拽看板
 | 
				
			||||||
  - 列表拖拽
 | 
					  - 列表拖拽
 | 
				
			||||||
  - SplitPane
 | 
					  - SplitPane
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										61
									
								
								src/components/DragSelect/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								src/components/DragSelect/index.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <el-select v-model="selectVal" v-bind="$attrs" class="drag-select" multiple>
 | 
				
			||||||
 | 
					    <slot/>
 | 
				
			||||||
 | 
					  </el-select>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import Sortable from 'sortablejs'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: 'DragSelect',
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    value: {
 | 
				
			||||||
 | 
					      type: Array,
 | 
				
			||||||
 | 
					      required: true
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    selectVal: {
 | 
				
			||||||
 | 
					      get() {
 | 
				
			||||||
 | 
					        return [...this.value]
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      set(val) {
 | 
				
			||||||
 | 
					        this.$emit('input', [...val])
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.setSort()
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    setSort() {
 | 
				
			||||||
 | 
					      const el = document.querySelectorAll('.el-select__tags > span')[0]
 | 
				
			||||||
 | 
					      this.sortable = Sortable.create(el, {
 | 
				
			||||||
 | 
					        ghostClass: 'sortable-ghost', // Class name for the drop placeholder,
 | 
				
			||||||
 | 
					        setData: function(dataTransfer) {
 | 
				
			||||||
 | 
					          dataTransfer.setData('Text', '')
 | 
				
			||||||
 | 
					          // to avoid Firefox bug
 | 
				
			||||||
 | 
					          // Detail see : https://github.com/RubaXa/Sortable/issues/1012
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onEnd: evt => {
 | 
				
			||||||
 | 
					          const targetRow = this.value.splice(evt.oldIndex, 1)[0]
 | 
				
			||||||
 | 
					          this.value.splice(evt.newIndex, 0, targetRow)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<style scoped>
 | 
				
			||||||
 | 
					.drag-select >>> .sortable-ghost{
 | 
				
			||||||
 | 
					  opacity: .8;
 | 
				
			||||||
 | 
					  color: #fff!important;
 | 
				
			||||||
 | 
					  background: #42b983!important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.drag-select >>> .el-tag{
 | 
				
			||||||
 | 
					  cursor: pointer;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</style>
 | 
				
			||||||
@@ -22,6 +22,7 @@ export default {
 | 
				
			|||||||
    componentMixin: 'Mixin',
 | 
					    componentMixin: 'Mixin',
 | 
				
			||||||
    backToTop: 'BackToTop',
 | 
					    backToTop: 'BackToTop',
 | 
				
			||||||
    dragDialog: 'Drag Dialog',
 | 
					    dragDialog: 'Drag Dialog',
 | 
				
			||||||
 | 
					    dragSelect: 'Drag Select',
 | 
				
			||||||
    dragKanban: 'Drag Kanban',
 | 
					    dragKanban: 'Drag Kanban',
 | 
				
			||||||
    charts: 'Charts',
 | 
					    charts: 'Charts',
 | 
				
			||||||
    keyboardChart: 'Keyboard Chart',
 | 
					    keyboardChart: 'Keyboard Chart',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@ export default {
 | 
				
			|||||||
    componentMixin: 'Mixin',
 | 
					    componentMixin: 'Mixin',
 | 
				
			||||||
    backToTop: 'Ir arriba',
 | 
					    backToTop: 'Ir arriba',
 | 
				
			||||||
    dragDialog: 'Drag Dialog',
 | 
					    dragDialog: 'Drag Dialog',
 | 
				
			||||||
 | 
					    dragSelect: 'Drag Select',
 | 
				
			||||||
    dragKanban: 'Drag Kanban',
 | 
					    dragKanban: 'Drag Kanban',
 | 
				
			||||||
    charts: 'Gráficos',
 | 
					    charts: 'Gráficos',
 | 
				
			||||||
    keyboardChart: 'Keyboard Chart',
 | 
					    keyboardChart: 'Keyboard Chart',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,7 @@ export default {
 | 
				
			|||||||
    componentMixin: '小组件',
 | 
					    componentMixin: '小组件',
 | 
				
			||||||
    backToTop: '返回顶部',
 | 
					    backToTop: '返回顶部',
 | 
				
			||||||
    dragDialog: '拖拽 Dialog',
 | 
					    dragDialog: '拖拽 Dialog',
 | 
				
			||||||
 | 
					    dragSelect: '拖拽 Select',
 | 
				
			||||||
    dragKanban: '可拖拽看板',
 | 
					    dragKanban: '可拖拽看板',
 | 
				
			||||||
    charts: '图表',
 | 
					    charts: '图表',
 | 
				
			||||||
    keyboardChart: '键盘图表',
 | 
					    keyboardChart: '键盘图表',
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -78,6 +78,12 @@ const componentsRouter = {
 | 
				
			|||||||
      name: 'DragDialogDemo',
 | 
					      name: 'DragDialogDemo',
 | 
				
			||||||
      meta: { title: 'dragDialog' }
 | 
					      meta: { title: 'dragDialog' }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      path: 'drag-select',
 | 
				
			||||||
 | 
					      component: () => import('@/views/components-demo/dragSelect'),
 | 
				
			||||||
 | 
					      name: 'DragSelectDemo',
 | 
				
			||||||
 | 
					      meta: { title: 'dragSelect' }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      path: 'dnd-list',
 | 
					      path: 'dnd-list',
 | 
				
			||||||
      component: () => import('@/views/components-demo/dndList'),
 | 
					      component: () => import('@/views/components-demo/dndList'),
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										43
									
								
								src/views/components-demo/dragSelect.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/views/components-demo/dragSelect.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
				
			|||||||
 | 
					<template>
 | 
				
			||||||
 | 
					  <div class="components-container">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <el-drag-select v-model="value" style="width:500px;" multiple placeholder="请选择">
 | 
				
			||||||
 | 
					      <el-option v-for="item in options" :label="item.label" :value="item.value" :key="item.value" />
 | 
				
			||||||
 | 
					    </el-drag-select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div style="margin-top:30px;">
 | 
				
			||||||
 | 
					      <el-tag v-for="item of value" :key="item" style="margin-right:15px;">{{ item }}</el-tag>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					</template>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					import ElDragSelect from '@/components/DragSelect' // base on element-ui
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default {
 | 
				
			||||||
 | 
					  name: 'DragSelectDemo',
 | 
				
			||||||
 | 
					  components: { ElDragSelect },
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      value: ['Apple', 'Banana', 'Orange'],
 | 
				
			||||||
 | 
					      options: [{
 | 
				
			||||||
 | 
					        value: 'Apple',
 | 
				
			||||||
 | 
					        label: 'Apple'
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        value: 'Banana',
 | 
				
			||||||
 | 
					        label: 'Banana'
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        value: 'Orange',
 | 
				
			||||||
 | 
					        label: 'Orange'
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        value: 'Pear',
 | 
				
			||||||
 | 
					        label: 'Pear'
 | 
				
			||||||
 | 
					      }, {
 | 
				
			||||||
 | 
					        value: 'Strawberry',
 | 
				
			||||||
 | 
					        label: 'Strawberry'
 | 
				
			||||||
 | 
					      }]
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user