1.1.6 • Published 4 years ago

vue-field-select v1.1.6

Weekly downloads
2
License
MIT
Repository
github
Last release
4 years ago

VueFieldSelect vue-field-select

npm (scoped) npm MIT

Installation via NPM

First

Install via NPM

npm i vue-field-select --save-dev

or

npm i  vue-field-select --save

Second

Require in your project:

var VueFieldSelect = require('vue-field-select');

or ES6 syntax:

import VueFieldSelect from 'vue-field-select'
import {VueFieldSelectValid} from 'vue-field-select'

Third

You can register the component globally:

Vue.component('vue-field-select', VueFieldSelect)
                                                

Or locally in a single Vue component / both not needed / an example of either:

 components: { 'vue-field-select':VueFieldSelect,
'vue-field-select-valid':VueFieldSelectValid,
 },

All Available Props for vue-field-select

PropTypeDefaultDescription
keyFieldStringidid for the hidden input / your expected object key i.e. id:xxx
valueFieldStringnamethe value that is set for your expected object value i.e. name:xxx
remoteKeyString*keyFieldthe value that is set for your expected object key i.e. {id:xxx}
remoteValueString*valueFieldthe value that is set for your expected object value i.e. {name:xxx}
remoteSelectValueString-This is complex to explain follow example 5 to understand better - used for dynamic content
showSelectBooleantrueshow select box / area
fieldStringnamethe value that is set for a blank select box
clazzString-css classes to load if additional css styling needed
returnPromiseBooleanfalsereturn entire object - this is for more complex objects that have many other things you need to do with returned data
actualItemObject{}The actual selected object when user chooses one of drop down - emited back to parent call overwriting parent key/value fields
nameString-The name of select field must match object name that is being saved for validation to work or valueField name
valuesArray[]parent's array of selectable objects - can be fixed or db driven - key presses by user trigger list to update
disabledBooleanfalseset to true to disable selectable area
readonlyBooleanfalseset to true to make area non selectable and readonly

All Available Props for vue-field-select-valid (above + below)

PropTypeDefaultDescription
validationErrorsArray[]returns any vee-validate validation issues back to caller
validationString-the validation types required i.e. 'requiredxx'

Events

EventDescription
@key-pressFired when the input text changes
@search-valueif v-model directive declared then not required but if set allows you to manipulate locally from set selected value field
@id-sentif v-model directive declared then not required but if set allows you to manipulate locally from set selected key field
@return-promiseNot required but if set won't manipulate parent object instead return the full object from remote selection back to you, this contains the entire object selected. It may have many other values you need to update page with.

Usage

Working Demo project (needs to be downloaded run)

YouTube demo video

Example 1: Basic
 <vue-field-select v-model="currentEdit.vehicle" name="name"
                        keyField="id"
                        valueField="name"
                        :field="$t('select_a_vehicle')"
                        :actualItem="currentEdit.vehicle" :values="vehicles" />
<script> 
import VueFieldSelect from 'vue-field-select'
export default {
    data () {
        return {
            validationErrors:[],
            currentEdit: {id:'', vehicle:{id:'', name:''}, someOtherProperty:''},
            vehicles:[]
        }
    },
    components: {
        VueFieldSelect
    },
    created() {
        this.initialiseDropDowns();
    },
   methods: {
        initialiseDropDowns(){
            MyService.fetch('/vehicle/list')
                .then((res) => {
                    if (res.data) {
                        this.vehicles = res.data;
                        /**
                        {id:'a',name:'vehicle 01'},{id:'a0', name:'zyz vehicle 01'},
                        {id:'a1', name:'abc vehicle 02'},{id:'a2', name:'vehicle 03'},{id:'a3', name:'vehicle 03'},
                        {id:'a4', name:'abc vehicle 04'},{id:'a5', name:'vehicle 05'},{id:'a6', name:'vehicle 06'},
                        {id:'a7', name:'abc vehicle 07'},{id:'a8', name:'vehicle 08'},{id:'a9', name:'vehicle 09'}
                        */
                    }
                });
        },
   }
}
</script>
Example 2 vue-field-select-valid: Validation using vee-validate

You need to add "vee-validate": "^2.2.13" to devDependencies in package.json.

Then in src/main.js Following has been added

import VeeValidate from 'vee-validate';
Vue.use(VeeValidate, { inject: false });

Then in your vue page:

 <vue-field-select-valid v-model="currentEdit" name="vehicName"
                        :validationErrors="validationErrors"
                        validation='required'
                        remoteKey="vhecId"
                        remoteValue="vehicleName"
                        keyField="vehicleId"
                        valueField="vehicName"
                        :field="$t('select_a_vehicle')"
                        :actualItem="currentEdit" :values="vehicles" />
<script> 
import {VueFieldSelectValid} from 'vue-field-select'
export default {
    $_veeValidate: {
        validator: 'new'
    },
    data () {
        return {
            validationErrors:[],
            currentEdit: {id:'', vehicleId:'',vehicName:'', someOtherProperty:''},
            vehicles:[]
        }
    },
    components: {
        VueFieldSelectValid
    },
    created() {
        this.initialiseDropDowns();
    },
   methods: {
        initialiseDropDowns(){
            MyService.fetch('/vehicle/list')
                .then((res) => {
                    if (res.data) {
                        this.vehicles = res.data;
                        /**
                        {vhecId:'a',vehicleName:'vehicle 01'},{vhecId:'a0', vehicleName:'zyz vehicle 01'},
                        {vhecId:'a1', vehicleName:'abc vehicle 02'},{vhecId:'a2', vehicleName:'vehicle 03'},{vhecId:'a3', vehicleName:'vehicle 03'},
                        {vhecId:'a4', vehicleName:'abc vehicle 04'},{vhecId:'a5', vehicleName:'vehicle 05'},{vhecId:'a6', vehicleName:'vehicle 06'},
                        {vhecId:'a7', vehicleName:'abc vehicle 07'},{vhecId:'a8', vehicleName:'vehicle 08'},{vhecId:'a9', vehicleName:'vehicle 09'}
                        */
                    }
                });
        },
   }
}
</script>
Example 3 : Return promise and deal with selected item manually
 <vue-field-select  name="vehicleName"
                        :returnPromise="true"
                        @return-promise="returnPromise"
                        remoteKey="id"
                        remoteValue="name"
                        keyField="vehicleId"
                        valueField="vehicleName"
                        :field="$t('select_a_vehicle')"
                        :actualItem="currentEdit" :values="vehicles"/>
<script> 
import VueFieldSelect from 'vue-field-select'
export default {
    data () {
        return {
            validationErrors:[],
            currentEdit: {id:'', vehicleId:'', vehicleName:'', chassisNumber:'',colour:'',steering:'', someOtherProperty:''},
            vehicles:[]
        }
    },
    components: {
        VueFieldSelect
    },
    created() {
        this.initialiseDropDowns();
    },
   methods: {
         //  Populate multiple elements from returned promise which may have other fields to be filled
        returnPromise:function(data) {             
             // for (var key in data) {
             //     this.currentEdit[key]=data[key]
             // }        
            this.currentEdit.chassisNumber=data.chassisNumber
            this.currentEdit.colour=data.colour
            this.currentEdit.steering=data.steering

            this.currentEdit.vehicleId=data.id
            this.currentEdit.vehicleName=data.name
        },
        initialiseDropDowns(){
            MyService.fetch('/vehicle/list')
                .then((res) => {
                    if (res.data) {
                        this.vehicles = res.data;
                        /**
                        {id:'a',name:'vehicle 01', colour:'red', chassisNumber:'x', steering:'Power'},
                        {id:'a0', name:'zyz vehicle 01',colour:'red', chassisNumber:'x', steering:'Power'},
                        {id:'a1', name:'abc vehicle 02',colour:'red', chassisNumber:'x', steering:'Power'},
                        {id:'a2', name:'vehicle 03',colour:'red', chassisNumber:'x', steering:'Power'},
                        {id:'a3', name:'vehicle 03',colour:'red', chassisNumber:'x', steering:'Power'},
                        */
                    }
                });
        },
   }
}
</script>
Example 4 : v-model directive not defined @search-value @id-sent
 <vue-field-select  name="name"
                        @id-sent="updateSelectKey"
                        @search-value="updateSelectValue"
                        keyField="id"
                        valueField="name"
                        :field="$t('select_a_vehicle')"
                        :actualItem="currentEdit" :values="vehicles"/>
<script> 
import VueFieldSelect from 'vue-field-select'
export default {
    data () {
        return {
            validationErrors:[],
            currentEdit: {id:'', name:''},
            vehicles:[]
        }
    },
    components: {
        VueFieldSelect
    },
    created() {
        this.initialiseDropDowns();
    },
   methods: {
        updateSelectKey:function(value) {
            this.currentEdit.id=value
        },
        updateSelectValue:function(value) {
            this.currentEdit.name=value
        },
        initialiseDropDowns(){
            MyService.fetch('/vehicle/list')
                .then((res) => {
                    if (res.data) {
                        this.vehicles = res.data;
                        /**
                        {id:'a',name:'vehicle 01'},{id:'a0', name:'zyz vehicle 01'},
                        {id:'a1', name:'abc vehicle 02'},{id:'a2', name:'vehicle 03'},{id:'a3', name:'vehicle 03'},
                        {id:'a4', name:'abc vehicle 04'},{id:'a5', name:'vehicle 05'},{id:'a6', name:'vehicle 06'},
                        {id:'a7', name:'abc vehicle 07'},{id:'a8', name:'vehicle 08'},{id:'a9', name:'vehicle 09'}
                        */
                    }
                });
        },
   }
}
</script>
Example 5 : Complex dynamic field selection from 1.1.6+

When changing selection you should see at the bottom of the page current selections change as an example

Output
[ { "id": "SPORT", "value": "FOOT" }, { "id": "OFFICE" }, { "id": "HOME", "value": "AWAY" } ]
[ { "id": "SPORT", "value": "RUG" }, { "id": "OFFICE", "value": "REA" }, { "id": "HOME", "value": "SPO" } ]
content
      <section class="row colset-2-its well">
        <h1>Test complex field select</h1>

        <div  v-for="(currentField,index) in dynamicContent"  v-if="currentField.type=='SELECT'">
          <vue-field-select v-model="findFromArray(selectItems,'id',currentField.id).currentObject"
                          :validationErrors="validationErrors"
                          :name="currentField.id" field=""
                          :actualItem="findFromArray(selectItems,'id',currentField.id).currentObject"
                          :values="currentField.values"
                          remoteKey="code"
                          remoteValue="description"
                          remoteStoreValue="code"
                          valueField="value"
                          keyField="value"
                          :validation="{required:currentField.mandatory}"></vue-field-select>

        </div>
        <h4>Curent select to be sent is : <br></h4>
        <h6>{{selectItems}}</h6>
      </section>
<script> 
 import VueFieldSelect from 'vue-field-select'
    export default {
        name: 'Welcome',
        data () {
            return {
                validationErrors:[],
                selectItems:[{id:'SPORT', value:'FOOT'}, {id:'OFFICE', value:''}, {id:'HOME', value:'AWAY'}],
                dynamicContent:[
                    {id:'SPORT',
                        type:'SELECT',
                        mandatory:true,
                        values:[
                            {code:'FOOT', description:'FootBall'},
                            {code:'BASE', description:'BaseBall'},
                            {code:'RUG', description:'RUGBY'}
                        ]
                    },
                    {id:'OFFICE',
                        type:'SELECT',
                        mandatory:false,
                        values:[
                            {code:'FOC', description:'Focus'},
                            {code:'REA', description:'READ'},
                            {code:'RES', description:'Research'}
                        ]
                    },
                    {id:'HOME',
                        type:'SELECT',
                        mandatory:false,
                        values:[
                            {code:'AWAY', description:'Vacation'},
                            {code:'BUSY', description:'Busy'},
                            {code:'SPO', description:'Sports'}
                        ]
                    },
                ]
            }
        },
        components: {
            VueFieldSelect
        },
        methods: {
            findFromArray(array, key, value) {
                let currentObject = {}
                if (Array.isArray(array)) {
                    currentObject = array.filter(function (element) {
                        return element[key] == value;
                    }).shift();
                }
                return {
                    currentObject
                };
            }
        }
    }
</script>

Changelog

v.1.1.6

  • Dynamic field selection support added for dynamically producing binding to provided selection content and selection set data. Please refer to Example 5 or or complex field select example in demo project provided

v.1.1.5

  • id ref tags added to autocomplete will be set to what ever you set name as .
  • likely an issue with pre-loading existing data the created mounted functions did not work single mounted added

v.1.1.4

This is really version 1.0.1, should have kept to 1.1.3 as initial release to save on current headache revert

v.1.0.2 / 1.0.1

  • minor logic issues spotted - but due to a bad release of 1.1.3 I can't publish properly npm version patch && npm publish --tag current-version npm info vue-field-select versions None of this update to the latest which is now an old tag grrrr...

v.1.0.0

  • Working release built on webpack 4 - includes vue-field-select & vue-field-select-valid

Credits

Zachary Klein

FieldSelect was the original code that got expanded to become this a more flexible way of calling field-select

1.1.6

4 years ago

1.1.5

4 years ago

1.0.2

4 years ago

1.1.4

4 years ago

1.0.0

4 years ago

1.1.3

4 years ago