Skip to content

Commit

Permalink
Fix saving the note of a card
Browse files Browse the repository at this point in the history
Fixes #3849
  • Loading branch information
cgx committed Oct 20, 2016
1 parent 03661ee commit f326ca5
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 46 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -14,6 +14,7 @@ Bug fixes
- [web] improved detection of changes in CKEditor (#3839)
- [web] fixed vCard generation for tags with no type (#3826)
- [web] only show the organizer field of an IMIP REPLY if one is defined
- [web] fixed saving the note of a card (#3849)
- [eas] improve handling of email folders without a parent
- [eas] never send IMIP reply when the "initiator" is Outlook 2013/2016
- [core] only consider SMTP addresses for AD's proxyAddresses (#3842)
Expand Down
3 changes: 3 additions & 0 deletions SoObjects/Contacts/NGVCard+SOGo.m
Expand Up @@ -861,8 +861,11 @@ - (NSCalendarDate *) birthday

- (void) setNotes: (NSArray *) newNotes
{
NSArray *elements;
NSUInteger count, max;

elements = [self childrenWithTag: @"note"];
[self removeChildren: elements];
max = [newNotes count];
for (count = 0; count < max; count++)
{
Expand Down
2 changes: 1 addition & 1 deletion UI/Contacts/UIxContactEditor.m
Expand Up @@ -476,7 +476,7 @@ - (void) setAttributes: (NSDictionary *) attributes
}
}

[card setNote: [attributes objectForKey: @"note"]];
[card setNotes: [attributes objectForKey: @"notes"]];

if ([[attributes objectForKey: @"categories"] isKindOfClass: [NSArray class]])
{
Expand Down
42 changes: 21 additions & 21 deletions UI/Contacts/UIxContactView.m
Expand Up @@ -705,28 +705,28 @@ - (NSArray *) deliveryAddresses
// return [self _cardStringWithLabel: @"Timezone:" value: [card tz]];
// }

- (NSArray *) notes
{
NSMutableArray *notes;
NSString *note;
NSUInteger count, max;
// - (NSArray *) notes
// {
// NSMutableArray *notes;
// NSString *note;
// NSUInteger count, max;

notes = [NSMutableArray arrayWithArray: [card notes]];
max = [notes count];
for (count = 0; count < max; count++)
{
note = [notes objectAtIndex: count];
note = [note stringByEscapingHTMLString];
note = [note stringByReplacingString: @"\r\n"
withString: @"<br />"];
note = [note stringByReplacingString: @"\n"
withString: @"<br />"];

[notes replaceObjectAtIndex: count withObject: note];
}
// notes = [NSMutableArray arrayWithArray: [card notes]];
// max = [notes count];
// for (count = 0; count < max; count++)
// {
// note = [notes objectAtIndex: count];
// note = [note stringByEscapingHTMLString];
// note = [note stringByReplacingString: @"\r\n"
// withString: @"<br />"];
// note = [note stringByReplacingString: @"\n"
// withString: @"<br />"];

// [notes replaceObjectAtIndex: count withObject: note];
// }

return notes;
}
// return notes;
// }

/* hrefs */

Expand Down Expand Up @@ -888,7 +888,7 @@ - (NSArray *) notes
o = [self urls];
if ([o count]) [data setObject: o forKey: @"urls"];

o = [self notes];
o = [card notes];
if (o) [data setObject: o forKey: @"notes"];
o = [self _fetchAndCombineCategoriesList];
if (o) [data setObject: o forKey: @"allCategories"];
Expand Down
5 changes: 3 additions & 2 deletions UI/Templates/ContactsUI/UIxContactEditorTemplate.wox
Expand Up @@ -337,9 +337,10 @@
</div>

<!-- note -->
<md-input-container class="md-block md-flex">
<md-input-container class="md-block md-flex"
ng-repeat="note in editor.card.notes">
<label><var:string label:value="Note"/></label>
<textarea ng-model="editor.card.note"><!-- note --></textarea>
<textarea ng-model="note.value"><!-- note --></textarea>
</md-input-container>
</form>

Expand Down
4 changes: 2 additions & 2 deletions UI/Templates/ContactsUI/UIxContactViewTemplate.wox
Expand Up @@ -147,11 +147,11 @@
</div>
</div>

<div class="section" ng-show="editor.card.notes">
<div class="section" ng-show="editor.card.notes[0].value.length">
<div class="pseudo-input-container" ng-repeat="note in editor.card.notes">
<label class="pseudo-input-label"><var:string label:value="Note"/></label>
<div class="pseudo-input-field">
<div ng-bind-html="note"><!-- note --></div>
<div ng-bind-html="note.value | ln2br"><!-- note --></div>
</div>
</div>
</div>
Expand Down
21 changes: 21 additions & 0 deletions UI/WebServerResources/js/Common/ln2br.filter.js
@@ -0,0 +1,21 @@
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */

/**
* ln2br - A filter to convert line feeds and carriage returns to html line breaks
* @memberof SOGo.Common
*/
(function () {
'use strict';

/**
* @ngInject
*/
function ln2br() {
return function(text) {
return text ? String(text).replace(/\r?\n/gm, '<br>') : undefined;
};
}

angular.module('SOGo.Common')
.filter('ln2br', ln2br);
})();
44 changes: 24 additions & 20 deletions UI/WebServerResources/js/Contacts/Card.service.js
Expand Up @@ -140,7 +140,6 @@

this.refs = [];
this.categories = [];
this.notes = [this.note];
this.c_screenname = null;
angular.extend(this, data);
if (!this.$$fullname)
Expand All @@ -155,6 +154,25 @@
});
if (this.isgroup)
this.c_component = 'vlist';
if (this.notes && this.notes.length)
this.notes = _.map(this.notes, function(note) { return { 'value': note }; });
else
this.notes = [ { value: '' } ];
// Instanciate Card objects for list members
angular.forEach(this.refs, function(o, i) {
if (o.email) o.emails = [{value: o.email}];
o.id = o.reference;
_this.refs[i] = new Card(o);
});
// Instanciate date object of birthday
if (this.birthday) {
Card.$Preferences.ready().then(function() {
var dlp = Card.$Preferences.$mdDateLocaleProvider;
_this.birthday = _this.birthday.parseDate(dlp, '%Y-%m-%d');
_this.$birthday = dlp.formatDate(_this.birthday);
});
}

this.$loaded = angular.isDefined(this.c_name)? Card.STATUS.LOADED : Card.STATUS.NOT_LOADED;

// An empty attribute to trick md-autocomplete when adding attendees from the appointment editor
Expand Down Expand Up @@ -497,12 +515,7 @@
delete _this[key];
}
});
angular.extend(this, this.$shadowData);
// Reinstanciate Card objects for list members
angular.forEach(this.refs, function(o, i) {
if (o.email) o.emails = [{value: o.email}];
_this.refs[i] = new Card(o);
});
this.init(this.$shadowData);
this.$shadowData = this.$omit(true);
};

Expand Down Expand Up @@ -547,19 +560,6 @@
// Expose the promise
this.$futureCardData = futureCardData.then(function(data) {
_this.init(data);
// Instanciate Card objects for list members
angular.forEach(_this.refs, function(o, i) {
if (o.email) o.emails = [{value: o.email}];
o.id = o.reference;
_this.refs[i] = new Card(o);
});
if (_this.birthday) {
Card.$Preferences.ready().then(function() {
var dlp = Card.$Preferences.$mdDateLocaleProvider;
_this.birthday = _this.birthday.parseDate(dlp, '%Y-%m-%d');
_this.$birthday = dlp.formatDate(_this.birthday);
});
}
// Mark card as loaded
_this.$loaded = Card.STATUS.LOADED;
// Make a copy of the data for an eventual reset
Expand Down Expand Up @@ -602,6 +602,10 @@
card.birthday = '';
}

// We flatten the notes to an array of strings
if (this.notes)
card.notes = _.map(this.notes, 'value');

return card;
};

Expand Down

0 comments on commit f326ca5

Please sign in to comment.