diff options
4 files changed, 59 insertions, 8 deletions
diff --git a/src/components/ContactDetails/ContactDetailsProperty.vue b/src/components/ContactDetails/ContactDetailsProperty.vue index 289efe3a..bfafbd06 100644 --- a/src/components/ContactDetails/ContactDetailsProperty.vue +++ b/src/components/ContactDetails/ContactDetailsProperty.vue @@ -26,7 +26,7 @@ :is="componentInstance" :select-type.sync="selectType" :prop-model="propModel" :value.sync="value" :is-first-property="isFirstProperty" :property="property" :is-last-property="isLastProperty" :class="{'property--last': isLastProperty}" :contact="contact" - @delete="deleteProp" /> + :options="sortedModelOptions" @delete="deleteProp" /> </template> <script> @@ -109,10 +109,20 @@ export default { return true }, - // the type of the prop e.g. FN + /** + * Return the type of the prop e.g. FN + * + * @returns {String} + */ propName() { return this.property.name }, + /** + * Return the type or property + * + * @see src/models/rfcProps + * @returns {String} + */ propType() { // if we have a force type set, use it! if (this.propModel && this.propModel.force) { @@ -121,12 +131,42 @@ export default { return this.property.getDefaultType() }, - // template to use + /** + * RFC template matching this property + * + * @see src/models/rfcProps + * @returns {Object} + */ propModel() { return this.properties[this.propName] }, - // select type handler + /** + * Remove duplicate name amongst options + * but make sure to include the selected one + * in the final list + * + * @returns {Array<Object>} + */ + sortedModelOptions() { + if (this.propModel.options) { + return this.propModel.options.reduce((list, option) => { + if (!list.find(search => search.name === option.name)) { + list.push(option) + } + return list + }, this.selectType ? [this.selectType] : []) + } + return [] + }, + + /** + * Returns the closest match to the selected type + * or return the default selected as a new object if + * none exists + * + * @returns Object|undefined + */ selectType: { get() { if (this.propModel && this.propModel.options && this.type) { @@ -165,7 +205,6 @@ export default { name: selectedType } } - return false }, set(data) { // ical.js take types as arrays diff --git a/src/components/Properties/PropertyDateTime.vue b/src/components/Properties/PropertyDateTime.vue index db312bcd..79064bf4 100644 --- a/src/components/Properties/PropertyDateTime.vue +++ b/src/components/Properties/PropertyDateTime.vue @@ -29,7 +29,7 @@ <div class="property__row"> <!-- type selector --> <multiselect v-if="propModel.options" v-model="localType" - :options="propModel.options" :searchable="false" :placeholder="t('contacts', 'Select type')" + :options="options" :searchable="false" :placeholder="t('contacts', 'Select type')" class="multiselect-vue property__label" track-by="id" label="name" @input="updateType" /> @@ -148,6 +148,10 @@ export default { default: '', required: true }, + options: { + type: Array, + default: () => [] + }, property: { type: Object, default: () => {}, diff --git a/src/components/Properties/PropertyMultipleText.vue b/src/components/Properties/PropertyMultipleText.vue index 6804c9e5..0196adf4 100644 --- a/src/components/Properties/PropertyMultipleText.vue +++ b/src/components/Properties/PropertyMultipleText.vue @@ -29,7 +29,7 @@ <div class="property__row"> <!-- type selector --> <multiselect v-if="propModel.options" v-model="localType" - :options="propModel.options" :searchable="false" :placeholder="t('contacts', 'Select type')" + :options="options" :searchable="false" :placeholder="t('contacts', 'Select type')" class="multiselect-vue property__label" track-by="id" label="name" @input="updateType" /> @@ -96,6 +96,10 @@ export default { default: () => [], required: true }, + options: { + type: Array, + default: () => [] + }, property: { type: Object, default: () => {}, diff --git a/src/components/Properties/PropertyText.vue b/src/components/Properties/PropertyText.vue index d5488bab..531e8e81 100644 --- a/src/components/Properties/PropertyText.vue +++ b/src/components/Properties/PropertyText.vue @@ -29,7 +29,7 @@ <div class="property__row"> <!-- type selector --> <multiselect v-if="propModel.options" v-model="localType" - :options="propModel.options" :searchable="false" :placeholder="t('contacts', 'Select type')" + :options="options" :searchable="false" :placeholder="t('contacts', 'Select type')" class="multiselect-vue property__label" track-by="id" label="name" @input="updateType" /> @@ -76,6 +76,10 @@ export default { default: '', required: true }, + options: { + type: Array, + default: () => [] + }, isFirstProperty: { type: Boolean, default: true |