diff options
author | Christian Kraus <hanzi@hanzi.cc> | 2020-01-06 10:49:19 +0100 |
---|---|---|
committer | Christian Kraus <hanzi@hanzi.cc> | 2020-01-06 10:49:19 +0100 |
commit | 58187a40f1c41f949770a77b94845d77a53df3f2 (patch) | |
tree | 43c8f6f18bad952e45915c9e57d921f736244cd9 /src | |
parent | 432c2bbd75c73d4b0a9c1d85c200155356bc6973 (diff) |
Refactor ical.js design set changes into its own service
Signed-off-by: Christian Kraus <hanzi@hanzi.cc>
Diffstat (limited to 'src')
-rw-r--r-- | src/mixins/PropertyMixin.js | 11 | ||||
-rw-r--r-- | src/models/contact.js | 46 | ||||
-rw-r--r-- | src/services/updateDesignSet.js | 111 |
3 files changed, 114 insertions, 54 deletions
diff --git a/src/mixins/PropertyMixin.js b/src/mixins/PropertyMixin.js index 031b0437..61c67d52 100644 --- a/src/mixins/PropertyMixin.js +++ b/src/mixins/PropertyMixin.js @@ -21,7 +21,7 @@ */ import debounce from 'debounce' import Contact from '../models/contact' -import ICAL from 'ical.js' +import { setPropertyAlias } from '../services/updateDesignSet' export default { props: { @@ -142,14 +142,7 @@ export default { this.localContact.vCard.addPropertyWithValue(`${group}.x-ablabel`, label) // force update the main design sets - if (ICAL.design.vcard.property[name]) { - ICAL.design.vcard.property[propGroup] - = ICAL.design.vcard.property[name] - } - if (ICAL.design.vcard3.property[name]) { - ICAL.design.vcard3.property[propGroup] - = ICAL.design.vcard3.property[name] - } + setPropertyAlias(name, propGroup) this.$emit('update') }, diff --git a/src/models/contact.js b/src/models/contact.js index ba0d2651..b3256a9f 100644 --- a/src/models/contact.js +++ b/src/models/contact.js @@ -24,6 +24,7 @@ import uuid from 'uuid' import ICAL from 'ical.js' import store from '../store' +import updateDesignSet from '../services/updateDesignSet' /** * Check if the given value is an empty array or an empty string @@ -35,40 +36,6 @@ const isEmpty = value => { return (Array.isArray(value) && value.join('') === '') || (!Array.isArray(value) && value === '') } -/** - * Parse a jCal and update the global designset - * if any grouped property is found - * - * @param {Array} jCal the contact ICAL.js jCal - * @returns {Boolean} - */ -const updateDesignSet = jCal => { - let result = false - jCal[1].forEach(prop => { - const propGroup = prop[0].split('.') - - // if this is a grouped property, update the designSet - if (propGroup.length === 2 && ( - ICAL.design.vcard.property[propGroup[1]] - || ICAL.design.vcard3.property[propGroup[1]] - )) { - // force update the main design sets - if (ICAL.design.vcard.property[propGroup[1]]) { - ICAL.design.vcard.property[prop[0]] - = ICAL.design.vcard.property[propGroup[1]] - result = true - } - if (ICAL.design.vcard3.property[propGroup[1]]) { - ICAL.design.vcard3.property[prop[0]] - = ICAL.design.vcard3.property[propGroup[1]] - - result = true - } - } - }) - return result -} - export default class Contact { /** @@ -83,22 +50,11 @@ export default class Contact { throw new Error('Invalid vCard') } - // Fixes nextcloud/contacts#1009 that prevented editing of contacts if - // their address contained a comma. This is actually a bug in ical.js - // but it has not been fixed for some time now. - // - // This can be removed once https://github.com/mozilla-comm/ical.js/issues/386 - // has been resolved. - ICAL.design.vcard.param.label = { multiValue: false } - ICAL.design.vcard3.param.label = { multiValue: false } - let jCal = ICAL.parse(vcard) if (jCal[0] !== 'vcard') { throw new Error('Only one contact is allowed in the vcard data') } - // add grouped properties to the design set - // if any found, refresh the contact jCal if (updateDesignSet(jCal)) { jCal = ICAL.parse(vcard) } diff --git a/src/services/updateDesignSet.js b/src/services/updateDesignSet.js new file mode 100644 index 00000000..cb6cf5c7 --- /dev/null +++ b/src/services/updateDesignSet.js @@ -0,0 +1,111 @@ +/** + * @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * @author Christian Kraus <hanzi@hanzi.cc> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ +import ICAL from 'ical.js' + +/** + * Fixes nextcloud/contacts#1009 that prevented editing of contacts if + * their address contained a comma. This is actually a bug in ical.js + * but it has not been fixed for some time now. + * + * This can be removed once https://github.com/mozilla-comm/ical.js/issues/386 + * has been resolved. + * + * @returns {Boolean} Whether or not the design set has been altered. + */ +const setLabelAsSingleValue = () => { + if ( + !ICAL.design.vcard.param.label + || ICAL.design.vcard.param.label.multiValue !== false + || !ICAL.design.vcard3.param.label + || ICAL.design.vcard3.param.label.multiValue !== false + ) { + ICAL.design.vcard.param.label = { multiValue: false } + ICAL.design.vcard3.param.label = { multiValue: false } + + return true + } + + return false +} + +/** + * Some clients group properties by naming them something like 'ITEM1.URL'. + * These should be treated the same as their original (i.e. 'URL' in this + * example), so we iterate through the vCard to find these properties and + * add them to the ical.js design set. + * + * @link https://github.com/nextcloud/contacts/issues/42 + * + * @param {Array} vCard The ical.js vCard + * @returns {Boolean} Whether or not the design set has been altered. + */ +const addGroupedProperties = vCard => { + let madeChanges = false + vCard[1].forEach(prop => { + const propGroup = prop[0].split('.') + + // if this is a grouped property, update the designSet + if (propGroup.length === 2) { + madeChanges = setPropertyAlias(propGroup[1], prop[0]) + } + }) + return madeChanges +} + +/** + * Check whether the ical.js design sets need updating (and if so, do it) + * + * @param {Array} vCard The ical.js vCard + * @returns {boolean} Whether or not the design set has been altered. + */ +export default function(vCard) { + let madeChanges = false + + madeChanges |= setLabelAsSingleValue() + madeChanges |= addGroupedProperties(vCard) + + return madeChanges +} + +/** + * @param {String} original Name of the property whose settings should be copied + * @param {String} alias Name of the new property + * @returns {boolean} Whether or not the design set has been altered. + */ +export function setPropertyAlias(original, alias) { + let madeChanges = false + original = original.toLowerCase() + alias = alias.toLowerCase() + + if (ICAL.design.vcard.property[original]) { + ICAL.design.vcard.property[alias] = ICAL.design.vcard.property[original] + madeChanges = true + } + + if (ICAL.design.vcard3.property[original]) { + ICAL.design.vcard3.property[alias] = ICAL.design.vcard3.property[original] + madeChanges = true + } + + return madeChanges +} |