summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Molakvoæ <skjnldsv@users.noreply.github.com>2018-09-27 19:07:10 +0200
committerGitHub <noreply@github.com>2018-09-27 19:07:10 +0200
commit96f0afd98ae57983c7552966914e2d0d13fed62b (patch)
treef42b7c1ef754649061f626c6dd95ba1a28446576
parent6d848dcd3bf513076bb2f5cadb138898422d4b30 (diff)
parentd0db1895ac094f7e6198dd2298fa88207ab8ad8f (diff)
Merge pull request #649 from nextcloud/no-duplicate-types-vue
Do not display dupisate types
-rw-r--r--src/components/ContactDetails/ContactDetailsProperty.vue49
-rw-r--r--src/components/Properties/PropertyDateTime.vue6
-rw-r--r--src/components/Properties/PropertyMultipleText.vue6
-rw-r--r--src/components/Properties/PropertyText.vue6
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