From 3d3b17adb8f53bd31a360bafc12f64b7b290ef9e Mon Sep 17 00:00:00 2001 From: Francis Lachapelle Date: Tue, 23 Jun 2020 12:02:31 -0400 Subject: [PATCH] fix(calendar(js)): improve attendees editor when adding new attendees Fixes #5049 --- .../UIxAppointmentEditorTemplate.wox | 3 +- .../js/Contacts/AddressBook.service.js | 24 ++++++++-------- .../js/Scheduler/ComponentController.js | 28 ++++++++++++++----- 3 files changed, 35 insertions(+), 20 deletions(-) diff --git a/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox b/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox index ee40d1908..bb822978d 100644 --- a/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox +++ b/UI/Templates/SchedulerUI/UIxAppointmentEditorTemplate.wox @@ -254,13 +254,14 @@ md-selected-item-change="editor.addAttendee(card, editor.searchText)" md-items="card in editor.cardFilter(editor.searchText)" md-item-text="card.empty" + md-autoselect="true" var:md-min-length="minimumSearchLength" md-delay="150" md-no-cache="true" sg-enter="editor.addAttendee(editor.searchText)">
-
{{ card.$shortFormat(editor.searchText) }}
+
{{ card.$shortFormat(editor.searchText) }}
{{ card.containername }}
diff --git a/UI/WebServerResources/js/Contacts/AddressBook.service.js b/UI/WebServerResources/js/Contacts/AddressBook.service.js index ed49146c1..e194164d8 100644 --- a/UI/WebServerResources/js/Contacts/AddressBook.service.js +++ b/UI/WebServerResources/js/Contacts/AddressBook.service.js @@ -85,17 +85,17 @@ * @param {object[]} excludedCards - a list of Card objects that must be excluded from the results * @returns a collection of Cards instances */ - AddressBook.$filterAll = function(search, options, excludedCards) { + AddressBook.$filterAll = function(search, cards, options, excludedCards) { var params = { search: search }; if (!search) { // No query specified - AddressBook.$cards = []; - return AddressBook.$q.when(AddressBook.$cards); + cards = []; + return AddressBook.$q.when(cards); } - if (angular.isUndefined(AddressBook.$cards)) { + if (angular.isUndefined(cards)) { // First session query - AddressBook.$cards = []; + cards = []; } angular.extend(params, options); @@ -115,23 +115,23 @@ results = response.contacts; } // Remove cards that no longer match the search query - for (index = AddressBook.$cards.length - 1; index >= 0; index--) { - card = AddressBook.$cards[index]; + for (index = cards.length - 1; index >= 0; index--) { + card = cards[index]; if (_.isUndefined(_.find(results, _.bind(compareIds, card)))) { - AddressBook.$cards.splice(index, 1); + cards.splice(index, 1); } } // Add new cards matching the search query _.forEach(results, function(data, index) { - if (_.isUndefined(_.find(AddressBook.$cards, _.bind(compareIds, data)))) { + if (_.isUndefined(_.find(cards, _.bind(compareIds, data)))) { var card = new AddressBook.$Card(_.mapKeys(data, function(value, key) { return key.toLowerCase(); }), search); - AddressBook.$cards.splice(index, 0, card); + cards.splice(index, 0, card); } }); - AddressBook.$log.debug(AddressBook.$cards); - return AddressBook.$cards; + AddressBook.$log.debug(cards); + return cards; }); }; diff --git a/UI/WebServerResources/js/Scheduler/ComponentController.js b/UI/WebServerResources/js/Scheduler/ComponentController.js index 57e9c97f7..aefe67925 100644 --- a/UI/WebServerResources/js/Scheduler/ComponentController.js +++ b/UI/WebServerResources/js/Scheduler/ComponentController.js @@ -283,8 +283,7 @@ // Autocomplete cards for attendees this.cardFilter = function ($query) { - AddressBook.$filterAll($query); - return AddressBook.$cards; + return AddressBook.$filterAll($query); }; this.addAttendee = function (card, partial) { @@ -301,7 +300,21 @@ name = str.replace(new RegExp(" *? *"), ''); vm.showAttendeesEditor |= initOrganizer; vm.searchText = ''; - return new Card({ c_cn: _.trim(name, ' "'), emails: [{ value: email }] }); + return vm.cardFilter(email).then(function (cards) { + if (cards.length) { + return cards[0]; + } else { + return new Card({ c_cn: _.trim(name, ' "'), emails: [{ value: email }] }); + } + }).catch(function (err) { + // Server error + return new Card({ c_cn: _.trim(name, ' "'), emails: [{ value: email }] }); + }); + } + + function addCard(newCard) { + if (!vm.component.$attendees.hasAttendee(newCard)) + vm.component.$attendees.add(newCard, options); } if (angular.isString(card)) { @@ -317,18 +330,19 @@ card.charCodeAt(i) == 44 || // , card.charCodeAt(i) == 59) && // ; emailRE.test(address)) { - this.component.$attendees.add(createCard(address), options); + createCard(address).then(addCard); address = ''; } else { address += card.charAt(i); } } - if (address) - this.component.$attendees.add(createCard(address), options); + if (address && emailRE.test(address)) + createCard(address).then(addCard); } else { - this.component.$attendees.add(card, options); + if (!this.component.$attendees.hasAttendee(card)) + this.component.$attendees.add(card, options); this.showAttendeesEditor |= initOrganizer; }