mirror of https://github.com/ElemeFE/element
				
				
				
			Select: allows user to choose if select focus triggers menu (#10042)
* Select: Preserves focus after options selected * Select: softFocus: Passing lint Write test * Select: Soft focus: Include input ref * Revert src/index.js * Update select.vue * Select: Default focus on select does not open menu. Added attribute for automatic-dropdown. Includes tests * Select: remove trailing space * Select: Removing incorrectly applied automatic-update props from input elements * Select: Fixed up references to correct focus tests * Select - Checking if automatic dropdown already revealed menu when toggling menu - Updating test: removing timeouts for related test * Update select.vuepull/10727/head
							parent
							
								
									43781c9c5b
								
							
						
					
					
						commit
						25fcfb34d7
					
				| 
						 | 
				
			
			@ -49,6 +49,7 @@
 | 
			
		|||
        :disabled="selectDisabled"
 | 
			
		||||
        :autocomplete="autoComplete"
 | 
			
		||||
        @focus="handleFocus"
 | 
			
		||||
        @blur="softFocus = false"
 | 
			
		||||
        @click.stop
 | 
			
		||||
        @keyup="managePlaceholder"
 | 
			
		||||
        @keydown="resetInputState"
 | 
			
		||||
| 
						 | 
				
			
			@ -252,6 +253,7 @@
 | 
			
		|||
        type: String,
 | 
			
		||||
        default: 'off'
 | 
			
		||||
      },
 | 
			
		||||
      automaticDropdown: Boolean,
 | 
			
		||||
      size: String,
 | 
			
		||||
      disabled: Boolean,
 | 
			
		||||
      clearable: Boolean,
 | 
			
		||||
| 
						 | 
				
			
			@ -309,6 +311,7 @@
 | 
			
		|||
        previousQuery: null,
 | 
			
		||||
        inputHovering: false,
 | 
			
		||||
        currentPlaceholder: '',
 | 
			
		||||
        menuVisibleOnFocus: false,
 | 
			
		||||
        isOnComposition: false
 | 
			
		||||
      };
 | 
			
		||||
    },
 | 
			
		||||
| 
						 | 
				
			
			@ -546,6 +549,10 @@
 | 
			
		|||
 | 
			
		||||
      handleFocus(event) {
 | 
			
		||||
        if (!this.softFocus) {
 | 
			
		||||
          if (this.automaticDropdown || event.target.className.indexOf('el-select__input') > -1) {
 | 
			
		||||
            this.visible = true;
 | 
			
		||||
            this.menuVisibleOnFocus = true;
 | 
			
		||||
          }
 | 
			
		||||
          this.$emit('focus', event);
 | 
			
		||||
        } else {
 | 
			
		||||
          this.softFocus = false;
 | 
			
		||||
| 
						 | 
				
			
			@ -559,6 +566,7 @@
 | 
			
		|||
 | 
			
		||||
      handleBlur(event) {
 | 
			
		||||
        this.$emit('blur', event);
 | 
			
		||||
        this.softFocus = false;
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      handleIconClick(event) {
 | 
			
		||||
| 
						 | 
				
			
			@ -698,7 +706,11 @@
 | 
			
		|||
 | 
			
		||||
      toggleMenu() {
 | 
			
		||||
        if (!this.selectDisabled) {
 | 
			
		||||
          this.visible = !this.visible;
 | 
			
		||||
          if (this.menuVisibleOnFocus) {
 | 
			
		||||
            this.menuVisibleOnFocus = false;
 | 
			
		||||
          } else {
 | 
			
		||||
            this.visible = !this.visible;
 | 
			
		||||
          }
 | 
			
		||||
          if (this.visible) {
 | 
			
		||||
            (this.$refs.input || this.$refs.reference).focus();
 | 
			
		||||
          }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ import Select from 'packages/select';
 | 
			
		|||
 | 
			
		||||
describe('Select', () => {
 | 
			
		||||
  const getSelectVm = (configs = {}, options) => {
 | 
			
		||||
    ['multiple', 'clearable', 'filterable', 'allowCreate', 'remote', 'collapseTags'].forEach(config => {
 | 
			
		||||
    ['multiple', 'clearable', 'filterable', 'allowCreate', 'remote', 'collapseTags', 'automaticDropdown'].forEach(config => {
 | 
			
		||||
      configs[config] = configs[config] || false;
 | 
			
		||||
    });
 | 
			
		||||
    configs.multipleLimit = configs.multipleLimit || 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -46,7 +46,8 @@ describe('Select', () => {
 | 
			
		|||
            :filterMethod="filterMethod"
 | 
			
		||||
            :remote="remote"
 | 
			
		||||
            :loading="loading"
 | 
			
		||||
            :remoteMethod="remoteMethod">
 | 
			
		||||
            :remoteMethod="remoteMethod"
 | 
			
		||||
            :automatic-dropdown="automaticDropdown">
 | 
			
		||||
            <el-option
 | 
			
		||||
              v-for="item in options"
 | 
			
		||||
              :label="item.label"
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +69,7 @@ describe('Select', () => {
 | 
			
		|||
          collapseTags: configs.collapseTags,
 | 
			
		||||
          allowCreate: configs.allowCreate,
 | 
			
		||||
          popperClass: configs.popperClass,
 | 
			
		||||
          automaticDropdown: configs.automaticDropdown,
 | 
			
		||||
          loading: false,
 | 
			
		||||
          filterMethod: configs.filterMethod && configs.filterMethod(this),
 | 
			
		||||
          remote: configs.remote,
 | 
			
		||||
| 
						 | 
				
			
			@ -668,7 +670,7 @@ describe('Select', () => {
 | 
			
		|||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('soft focus', done => {
 | 
			
		||||
  it('should return focus to input inside select after option select', done => {
 | 
			
		||||
    vm = createVue({
 | 
			
		||||
      template: `
 | 
			
		||||
        <div>
 | 
			
		||||
| 
						 | 
				
			
			@ -701,6 +703,28 @@ describe('Select', () => {
 | 
			
		|||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should not open popper when automatic-dropdown not set', done => {
 | 
			
		||||
    vm = getSelectVm();
 | 
			
		||||
 | 
			
		||||
    vm.$refs.select.$refs.reference.$refs.input.focus();
 | 
			
		||||
 | 
			
		||||
    vm.$nextTick(_ => {
 | 
			
		||||
      expect(vm.$refs.select.visible).to.be.false;
 | 
			
		||||
      done();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('should open popper when automatic-dropdown is set', done => {
 | 
			
		||||
    vm = getSelectVm({ automaticDropdown: true });
 | 
			
		||||
 | 
			
		||||
    vm.$refs.select.$refs.reference.$refs.input.focus();
 | 
			
		||||
 | 
			
		||||
    vm.$nextTick(_ => {
 | 
			
		||||
      expect(vm.$refs.select.visible).to.be.true;
 | 
			
		||||
      done();
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  it('focus', done => {
 | 
			
		||||
    vm = createVue({
 | 
			
		||||
      template: `
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue