Merge branch 'master' into fix-some-warnings
Conflicts: UI/Scheduler/UIxAppointmentActions.mpull/199/head
commit
9cb1b899b0
|
@ -1338,7 +1338,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
changeDetected: (BOOL *) changeDetected
|
changeDetected: (BOOL *) changeDetected
|
||||||
maxSyncResponseSize: (int) theMaxSyncResponseSize
|
maxSyncResponseSize: (int) theMaxSyncResponseSize
|
||||||
{
|
{
|
||||||
NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *lastServerKey, *syncKeyInCache, *folderKey;
|
NSString *collectionId, *realCollectionId, *syncKey, *davCollectionTag, *bodyPreferenceType, *mimeSupport, *mimeTruncation, *lastServerKey, *syncKeyInCache, *folderKey;
|
||||||
NSMutableDictionary *folderMetadata, *folderOptions;
|
NSMutableDictionary *folderMetadata, *folderOptions;
|
||||||
NSMutableArray *supportedElements, *supportedElementNames;
|
NSMutableArray *supportedElements, *supportedElementNames;
|
||||||
NSMutableString *changeBuffer, *commandsBuffer;
|
NSMutableString *changeBuffer, *commandsBuffer;
|
||||||
|
@ -1450,48 +1450,60 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue];
|
bodyPreferenceType = [[(id)[[(id)[theDocumentElement getElementsByTagName: @"BodyPreference"] lastObject] getElementsByTagName: @"Type"] lastObject] textValue];
|
||||||
|
|
||||||
if (!bodyPreferenceType)
|
if (!bodyPreferenceType)
|
||||||
{
|
{
|
||||||
bodyPreferenceType = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"];
|
bodyPreferenceType = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"];
|
||||||
|
|
||||||
// By default, send MIME mails. See #3146 for details.
|
// By default, send MIME mails. See #3146 for details.
|
||||||
if (!bodyPreferenceType)
|
if (!bodyPreferenceType)
|
||||||
bodyPreferenceType = @"4";
|
bodyPreferenceType = @"4";
|
||||||
|
|
||||||
mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"];
|
mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"];
|
||||||
|
mimeTruncation = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMETruncation"];
|
||||||
|
|
||||||
if (!mimeSupport)
|
if (!mimeSupport)
|
||||||
mimeSupport = @"1";
|
mimeSupport = @"1";
|
||||||
}
|
|
||||||
|
if (!mimeTruncation)
|
||||||
|
mimeTruncation = @"8";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue];
|
mimeSupport = [[(id)[theDocumentElement getElementsByTagName: @"MIMESupport"] lastObject] textValue];
|
||||||
|
mimeTruncation = [[(id)[theDocumentElement getElementsByTagName: @"MIMETruncation"] lastObject] textValue];
|
||||||
|
|
||||||
if (!mimeSupport)
|
if (!mimeSupport)
|
||||||
mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"];
|
mimeSupport = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"];
|
||||||
|
|
||||||
if (!mimeSupport)
|
if (!mimeSupport)
|
||||||
mimeSupport = @"0";
|
mimeSupport = @"0";
|
||||||
|
|
||||||
if ([mimeSupport isEqualToString: @"1"] && [bodyPreferenceType isEqualToString: @"4"])
|
if (!mimeTruncation)
|
||||||
|
mimeTruncation = [[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMETruncation"];
|
||||||
|
|
||||||
|
if (!mimeTruncation)
|
||||||
|
mimeTruncation = @"8";
|
||||||
|
|
||||||
|
if ([mimeSupport isEqualToString: @"1"] && [bodyPreferenceType isEqualToString: @"4"])
|
||||||
bodyPreferenceType = @"2";
|
bodyPreferenceType = @"2";
|
||||||
else if ([mimeSupport isEqualToString: @"2"] && [bodyPreferenceType isEqualToString: @"4"])
|
else if ([mimeSupport isEqualToString: @"2"] && [bodyPreferenceType isEqualToString: @"4"])
|
||||||
bodyPreferenceType = @"4";
|
bodyPreferenceType = @"4";
|
||||||
else if ([mimeSupport isEqualToString: @"0"] && [bodyPreferenceType isEqualToString: @"4"])
|
else if ([mimeSupport isEqualToString: @"0"] && [bodyPreferenceType isEqualToString: @"4"])
|
||||||
bodyPreferenceType = @"2";
|
bodyPreferenceType = @"2";
|
||||||
|
|
||||||
|
// Avoid writing to cache if there is nothing to change.
|
||||||
// Avoid writing to cache if there is nothing to change.
|
if (![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"] isEqualToString: bodyPreferenceType] ||
|
||||||
if (![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"BodyPreferenceType"] isEqualToString: bodyPreferenceType] ||
|
![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"] isEqualToString: mimeSupport] ||
|
||||||
![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMESupport"] isEqualToString: mimeSupport])
|
![[[folderMetadata objectForKey: @"FolderOptions"] objectForKey: @"MIMETruncation"] isEqualToString: mimeTruncation])
|
||||||
{
|
{
|
||||||
folderOptions = [[NSDictionary alloc] initWithObjectsAndKeys: mimeSupport, @"MIMESupport", bodyPreferenceType, @"BodyPreferenceType", nil];
|
folderOptions = [[NSDictionary alloc] initWithObjectsAndKeys: mimeSupport, @"MIMESupport", mimeTruncation, @"MIMETruncation", bodyPreferenceType, @"BodyPreferenceType", nil];
|
||||||
[folderMetadata setObject: folderOptions forKey: @"FolderOptions"];
|
[folderMetadata setObject: folderOptions forKey: @"FolderOptions"];
|
||||||
[self _setFolderMetadata: folderMetadata forKey: folderKey];
|
[self _setFolderMetadata: folderMetadata forKey: folderKey];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
|
[context setObject: bodyPreferenceType forKey: @"BodyPreferenceType"];
|
||||||
[context setObject: mimeSupport forKey: @"MIMESupport"];
|
[context setObject: mimeSupport forKey: @"MIMESupport"];
|
||||||
|
[context setObject: mimeTruncation forKey: @"MIMETruncation"];
|
||||||
[context setObject: [folderMetadata objectForKey: @"SupportedElements"] forKey: @"SupportedElements"];
|
[context setObject: [folderMetadata objectForKey: @"SupportedElements"] forKey: @"SupportedElements"];
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -668,13 +668,14 @@ struct GlobalObjectId {
|
||||||
NSMutableString *s;
|
NSMutableString *s;
|
||||||
id value;
|
id value;
|
||||||
|
|
||||||
int preferredBodyType, mimeSupport, nativeBodyType;
|
int preferredBodyType, mimeSupport, mimeTruncation, nativeBodyType;
|
||||||
uint32_t v;
|
uint32_t v;
|
||||||
|
|
||||||
subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString];
|
subtype = [[[self bodyStructure] valueForKey: @"subtype"] lowercaseString];
|
||||||
|
|
||||||
preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue];
|
preferredBodyType = [[context objectForKey: @"BodyPreferenceType"] intValue];
|
||||||
mimeSupport = [[context objectForKey: @"MIMESupport"] intValue];
|
mimeSupport = [[context objectForKey: @"MIMESupport"] intValue];
|
||||||
|
mimeTruncation = [[context objectForKey: @"MIMETruncation"] intValue];
|
||||||
|
|
||||||
s = [NSMutableString string];
|
s = [NSMutableString string];
|
||||||
|
|
||||||
|
@ -980,9 +981,71 @@ struct GlobalObjectId {
|
||||||
AUTORELEASE(content);
|
AUTORELEASE(content);
|
||||||
|
|
||||||
content = [content activeSyncRepresentationInContext: context];
|
content = [content activeSyncRepresentationInContext: context];
|
||||||
|
len = [content length];
|
||||||
truncated = 0;
|
truncated = 0;
|
||||||
|
|
||||||
len = [content length];
|
// We handle MIMETruncation
|
||||||
|
switch (mimeTruncation)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
content = @"";
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if ([content length] > 4096)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 4096];
|
||||||
|
len = 4096; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if ([content length] > 5120)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 5120];
|
||||||
|
len = 5120; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
if ([content length] > 7168)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 7168];
|
||||||
|
len = 7168; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if ([content length] > 10240)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 10240];
|
||||||
|
len = 10240; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if ([content length] > 20480)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 20480];
|
||||||
|
len = 20480; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
if ([content length] > 51200)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 51200];
|
||||||
|
len = 51200; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
if ([content length] > 102400)
|
||||||
|
{
|
||||||
|
content = [content substringToIndex: 102400];
|
||||||
|
len = 102400; truncated = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
default:
|
||||||
|
truncated = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
if ([[[context request] headerForKey: @"MS-ASProtocolVersion"] isEqualToString: @"2.5"])
|
||||||
{
|
{
|
||||||
|
@ -990,7 +1053,7 @@ struct GlobalObjectId {
|
||||||
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
|
[s appendFormat: @"<BodyTruncated xmlns=\"Email:\">%d</BodyTruncated>", truncated];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
[s appendString: @"<Body xmlns=\"AirSyncBase:\">"];
|
||||||
|
|
||||||
// Set the correct type if client requested text/html but we got text/plain.
|
// Set the correct type if client requested text/html but we got text/plain.
|
||||||
|
@ -1004,16 +1067,12 @@ struct GlobalObjectId {
|
||||||
|
|
||||||
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
|
[s appendFormat: @"<Truncated>%d</Truncated>", truncated];
|
||||||
[s appendFormat: @"<Preview></Preview>"];
|
[s appendFormat: @"<Preview></Preview>"];
|
||||||
|
[s appendFormat: @"<Data>%@</Data>", content];
|
||||||
if (!truncated)
|
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
|
||||||
{
|
|
||||||
[s appendFormat: @"<Data>%@</Data>", content];
|
|
||||||
[s appendFormat: @"<EstimatedDataSize>%d</EstimatedDataSize>", len];
|
|
||||||
}
|
|
||||||
[s appendString: @"</Body>"];
|
[s appendString: @"</Body>"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attachments -namespace 16
|
// Attachments -namespace 16
|
||||||
attachmentKeys = [self fetchFileAttachmentKeys];
|
attachmentKeys = [self fetchFileAttachmentKeys];
|
||||||
|
|
||||||
|
|
2
NEWS
2
NEWS
|
@ -15,6 +15,7 @@ Enhancements
|
||||||
- [web] improved confirm dialogs for deletions
|
- [web] improved confirm dialogs for deletions
|
||||||
- [web] allow resources to prevent invitations (#3410)
|
- [web] allow resources to prevent invitations (#3410)
|
||||||
- [web] warn when double-booking attendees and offer force save option
|
- [web] warn when double-booking attendees and offer force save option
|
||||||
|
- [eas] now support EAS MIME truncation
|
||||||
|
|
||||||
Bug fixes
|
Bug fixes
|
||||||
- [web] handle birthday dates before 1970
|
- [web] handle birthday dates before 1970
|
||||||
|
@ -26,6 +27,7 @@ Bug fixes
|
||||||
- [web] fixed batched delete of components (#3516)
|
- [web] fixed batched delete of components (#3516)
|
||||||
- [web] fixed mail draft autosave in preferences (#3519)
|
- [web] fixed mail draft autosave in preferences (#3519)
|
||||||
- [web] fixed password change (#3496)
|
- [web] fixed password change (#3496)
|
||||||
|
- [web] fixed saving of notification email for calendar changes (#3522)
|
||||||
- [eas] allow EAS attachments get on 2nd-level mailboxes (#3505)
|
- [eas] allow EAS attachments get on 2nd-level mailboxes (#3505)
|
||||||
- [eas] fix EAS bday shift (#3518)
|
- [eas] fix EAS bday shift (#3518)
|
||||||
|
|
||||||
|
|
|
@ -652,7 +652,7 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
iCalCalendar *calendar;
|
iCalCalendar *calendar;
|
||||||
NSDictionary *values;
|
NSDictionary *values, *info;
|
||||||
NSString *reason;
|
NSString *reason;
|
||||||
iCalEvent *event;
|
iCalEvent *event;
|
||||||
|
|
||||||
|
@ -669,8 +669,10 @@
|
||||||
|
|
||||||
reason = [values keysWithFormat: [self labelForKey: @"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}."]];
|
reason = [values keysWithFormat: [self labelForKey: @"Maximum number of simultaneous bookings (%{NumberOfSimultaneousBookings}) reached for resource \"%{Cn} %{SystemEmail}\". The conflicting event is \"%{EventTitle}\", and starts on %{StartDate}."]];
|
||||||
|
|
||||||
|
info = [NSDictionary dictionaryWithObject: reason forKey: @"reject"];
|
||||||
|
|
||||||
return [NSException exceptionWithHTTPStatus: 403
|
return [NSException exceptionWithHTTPStatus: 403
|
||||||
reason: reason];
|
reason: [info jsonRepresentation]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* SOGoComponentOccurence.m - this file is part of SOGo
|
/* SOGoComponentOccurence.m - this file is part of SOGo
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-2014 Inverse inc.
|
* Copyright (C) 2008-2016 Inverse inc.
|
||||||
*
|
*
|
||||||
* This file is free software; you can redistribute it and/or modify
|
* This file is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -204,6 +204,13 @@
|
||||||
return [container saveComponent: newObject];
|
return [container saveComponent: newObject];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSException *) saveComponent: (iCalRepeatableEntityObject *) newObject
|
||||||
|
force: (BOOL) forceSave
|
||||||
|
{
|
||||||
|
return [container saveComponent: newObject
|
||||||
|
force: forceSave];
|
||||||
|
}
|
||||||
|
|
||||||
#warning most of SOGoCalendarComponent and SOGoComponentOccurence share the same external interface... \
|
#warning most of SOGoCalendarComponent and SOGoComponentOccurence share the same external interface... \
|
||||||
they should be siblings or SOGoComponentOccurence the parent class of SOGoCalendarComponent...
|
they should be siblings or SOGoComponentOccurence the parent class of SOGoCalendarComponent...
|
||||||
- (NSException *) changeParticipationStatus: (NSString *) newStatus
|
- (NSException *) changeParticipationStatus: (NSString *) newStatus
|
||||||
|
|
|
@ -64,6 +64,7 @@
|
||||||
SOGoAppointmentFolder *targetCalendar, *sourceCalendar;
|
SOGoAppointmentFolder *targetCalendar, *sourceCalendar;
|
||||||
SOGoAppointmentFolders *folders;
|
SOGoAppointmentFolders *folders;
|
||||||
BOOL forceSave;
|
BOOL forceSave;
|
||||||
|
id error;
|
||||||
|
|
||||||
rq = [context request];
|
rq = [context request];
|
||||||
params = [[rq contentAsString] objectFromJSONString];
|
params = [[rq contentAsString] objectFromJSONString];
|
||||||
|
@ -72,7 +73,7 @@
|
||||||
startDelta = [params objectForKey: @"start"];
|
startDelta = [params objectForKey: @"start"];
|
||||||
durationDelta = [params objectForKey: @"duration"];
|
durationDelta = [params objectForKey: @"duration"];
|
||||||
destionationCalendar = [params objectForKey: @"destination"];
|
destionationCalendar = [params objectForKey: @"destination"];
|
||||||
forceSave = NO;
|
forceSave = [[params objectForKey: @"ignoreConflicts"] boolValue];
|
||||||
|
|
||||||
if (daysDelta || startDelta || durationDelta)
|
if (daysDelta || startDelta || durationDelta)
|
||||||
{
|
{
|
||||||
|
@ -146,8 +147,11 @@
|
||||||
if ([ex respondsToSelector: @selector(httpStatus)])
|
if ([ex respondsToSelector: @selector(httpStatus)])
|
||||||
httpStatus = [ex httpStatus];
|
httpStatus = [ex httpStatus];
|
||||||
|
|
||||||
|
error = [[ex reason] objectFromJSONString];
|
||||||
|
if (error == nil)
|
||||||
|
error = [ex reason];
|
||||||
jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys:
|
jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||||
[ex reason], @"message",
|
error, @"message",
|
||||||
nil];
|
nil];
|
||||||
|
|
||||||
response = [self responseWithStatus: httpStatus
|
response = [self responseWithStatus: httpStatus
|
||||||
|
|
|
@ -454,6 +454,7 @@
|
||||||
SOGoAppointmentObject *co;
|
SOGoAppointmentObject *co;
|
||||||
SoSecurityManager *sm;
|
SoSecurityManager *sm;
|
||||||
WORequest *request;
|
WORequest *request;
|
||||||
|
id error;
|
||||||
|
|
||||||
unsigned int httpStatus;
|
unsigned int httpStatus;
|
||||||
BOOL forceSave;
|
BOOL forceSave;
|
||||||
|
@ -477,7 +478,7 @@
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
[self setAttributes: params];
|
[self setAttributes: params];
|
||||||
forceSave = NO;
|
forceSave = [[params objectForKey: @"ignoreConflicts"] boolValue];
|
||||||
|
|
||||||
if ([event hasRecurrenceRules])
|
if ([event hasRecurrenceRules])
|
||||||
[self _adjustRecurrentRules];
|
[self _adjustRecurrentRules];
|
||||||
|
@ -533,9 +534,11 @@
|
||||||
if ([ex respondsToSelector: @selector(httpStatus)])
|
if ([ex respondsToSelector: @selector(httpStatus)])
|
||||||
httpStatus = [ex httpStatus];
|
httpStatus = [ex httpStatus];
|
||||||
|
|
||||||
|
error = [[ex reason] objectFromJSONString];
|
||||||
|
if (error == nil)
|
||||||
|
error = [ex reason];
|
||||||
jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys:
|
jsonResponse = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||||
[ex reason], @"message",
|
error, @"message", nil];
|
||||||
nil];
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -275,7 +275,7 @@
|
||||||
</div>
|
</div>
|
||||||
</md-dialog-content>
|
</md-dialog-content>
|
||||||
<!-- cancel/reset/save -->
|
<!-- cancel/reset/save -->
|
||||||
<md-dialog-actions>
|
<md-dialog-actions ng-hide="editor.attendeeConflictError">
|
||||||
<md-button type="button" ng-click="editor.cancel()">
|
<md-button type="button" ng-click="editor.cancel()">
|
||||||
<var:string label:value="Cancel"/>
|
<var:string label:value="Cancel"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
|
@ -287,6 +287,65 @@
|
||||||
<var:string label:value="Save"/>
|
<var:string label:value="Save"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-dialog-actions>
|
</md-dialog-actions>
|
||||||
|
|
||||||
|
<!-- attendee availability conflict -->
|
||||||
|
<md-dialog-content class="md-default-theme md-bg md-warn md-padding sg-dialog-message ng-hide"
|
||||||
|
ng-show="editor.attendeeConflictError.conflicts">
|
||||||
|
<div layout="row">
|
||||||
|
<div class="md-flex"><var:string label:value="A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"/></div>
|
||||||
|
<md-button class="md-icon-button" ng-click="editor.attendeeConflictError = false">
|
||||||
|
<md-icon label:aria-label="Close">close</md-icon>
|
||||||
|
</md-button>
|
||||||
|
</div>
|
||||||
|
<div class="md-flex" ng-show="editor.attendeeConflictError.attendee_email">
|
||||||
|
<md-icon>person</md-icon> {{editor.attendeeConflictError.attendee_name}} ({{editor.attendeeConflictError.attendee_email}})
|
||||||
|
</div>
|
||||||
|
<div layout="row"
|
||||||
|
ng-show="editor.attendeeConflictError.conflicts"
|
||||||
|
ng-repeat="conflict in editor.attendeeConflictError.conflicts">
|
||||||
|
<md-icon>schedule</md-icon>
|
||||||
|
<div class="pseudo-input-container">
|
||||||
|
<label class="pseudo-input-label"><var:string label:value="From"/></label>
|
||||||
|
<div>{{conflict.startDate}} <md-icon>trending_flat</md-icon></div>
|
||||||
|
</div>
|
||||||
|
<div class="pseudo-input-container md-flex">
|
||||||
|
<label class="pseudo-input-label"><var:string label:value="To"/></label>
|
||||||
|
<div>{{conflict.endDate}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</md-dialog-content>
|
||||||
|
<md-dialog-actions ng-show="editor.attendeeConflictError.conflicts">
|
||||||
|
<md-button type="button" ng-click="editor.cancel()">
|
||||||
|
<var:string label:value="Cancel"/>
|
||||||
|
</md-button>
|
||||||
|
<md-button type="button"
|
||||||
|
ng-click="editor.attendeeConflictError = false">
|
||||||
|
<var:string label:value="Edit"/>
|
||||||
|
</md-button>
|
||||||
|
<md-button class="md-warn" type="button"
|
||||||
|
ng-click="editor.save(eventForm, { ignoreConflicts: true })"
|
||||||
|
ng-disabled="editor.eventForm.$invalid">
|
||||||
|
<var:string label:value="Save"/>
|
||||||
|
</md-button>
|
||||||
|
</md-dialog-actions>
|
||||||
|
|
||||||
|
<!-- rejected attendee invitation -->
|
||||||
|
<md-dialog-content class="md-default-theme md-bg md-warn md-padding sg-dialog-message ng-hide" layout="row"
|
||||||
|
ng-show="editor.attendeeConflictError.reject">
|
||||||
|
<div class="md-flex">{{editor.attendeeConflictError.reject}}</div>
|
||||||
|
<md-button class="md-icon-button" ng-click="editor.attendeeConflictError = false">
|
||||||
|
<md-icon label:aria-label="Close">close</md-icon>
|
||||||
|
</md-button>
|
||||||
|
</md-dialog-content>
|
||||||
|
<md-dialog-actions ng-show="editor.attendeeConflictError.reject">
|
||||||
|
<md-button type="button" ng-click="editor.cancel()">
|
||||||
|
<var:string label:value="Cancel"/>
|
||||||
|
</md-button>
|
||||||
|
<md-button type="button"
|
||||||
|
ng-click="editor.attendeeConflictError = false">
|
||||||
|
<var:string label:value="Edit"/>
|
||||||
|
</md-button>
|
||||||
|
</md-dialog-actions>
|
||||||
</form>
|
</form>
|
||||||
</md-dialog>
|
</md-dialog>
|
||||||
</container>
|
</container>
|
||||||
|
|
|
@ -211,26 +211,39 @@
|
||||||
</md-button>
|
</md-button>
|
||||||
<md-menu-content>
|
<md-menu-content>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button class="md-warn"
|
<md-button class="md-warn"
|
||||||
ng-click="editor.deleteOccurrence()">
|
ng-click="editor.deleteOccurrence()">
|
||||||
<var:string label:value="Delete This Occurrence"/>
|
<md-icon>repeat_one</md-icon> <var:string label:value="Delete This Occurrence"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button class="md-warn"
|
<md-button class="md-warn"
|
||||||
ng-click="editor.deleteAllOccurrences()">
|
ng-click="editor.deleteAllOccurrences()">
|
||||||
<var:string label:value="Delete All Occurrences"/>
|
<md-icon>repeat</md-icon> <var:string label:value="Delete All Occurrences"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
</md-menu-content>
|
</md-menu-content>
|
||||||
</md-menu>
|
</md-menu>
|
||||||
<div class="md-flex"><!-- spacer --></div>
|
<div class="md-flex"><!-- spacer --></div>
|
||||||
<md-button type="button" ng-click="editor.editAllOccurrences()">
|
<md-menu>
|
||||||
<var:string label:value="Edit All Occurrences"/>
|
<md-button label:aria-label="Edit"
|
||||||
</md-button>
|
ng-click="$mdOpenMenu()"
|
||||||
<md-button type="button" ng-click="editor.edit()">
|
md-menu-origin="md-menu-origin">
|
||||||
<var:string label:value="Edit This Occurrence"/>
|
<var:string label:value="Edit"/> <md-icon>arrow_drop_down</md-icon>
|
||||||
</md-button>
|
</md-button>
|
||||||
|
<md-menu-content>
|
||||||
|
<md-menu-item>
|
||||||
|
<md-button type="button" ng-click="editor.edit()">
|
||||||
|
<md-icon>repeat_one</md-icon> <var:string label:value="Edit This Occurrence"/>
|
||||||
|
</md-button>
|
||||||
|
</md-menu-item>
|
||||||
|
<md-menu-item>
|
||||||
|
<md-button type="button" ng-click="editor.editAllOccurrences()">
|
||||||
|
<md-icon>repeat</md-icon> <var:string label:value="Edit All Occurrences"/>
|
||||||
|
</md-button>
|
||||||
|
</md-menu-item>
|
||||||
|
</md-menu-content>
|
||||||
|
</md-menu>
|
||||||
</md-dialog-actions>
|
</md-dialog-actions>
|
||||||
<!-- invitation but not recurrent -->
|
<!-- invitation but not recurrent -->
|
||||||
<md-dialog-actions ng-show="editor.component.isInvitation()">
|
<md-dialog-actions ng-show="editor.component.isInvitation()">
|
||||||
|
@ -251,49 +264,41 @@
|
||||||
label:aria-label="Delete Event"
|
label:aria-label="Delete Event"
|
||||||
ng-click="$mdOpenMenu()"
|
ng-click="$mdOpenMenu()"
|
||||||
md-menu-origin="md-menu-origin">
|
md-menu-origin="md-menu-origin">
|
||||||
<var:string label:value="Delete"/>
|
<var:string label:value="Delete"/> <md-icon>arrow_drop_down</md-icon>
|
||||||
</md-button>
|
</md-button>
|
||||||
<md-menu-content>
|
<md-menu-content>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button class="md-warn"
|
<md-button class="md-warn"
|
||||||
ng-click="editor.deleteOccurrence()">
|
ng-click="editor.deleteOccurrence()">
|
||||||
<var:string label:value="Delete This Occurrence"/>
|
<md-icon>repeat_one</md-icon> <var:string label:value="Delete This Occurrence"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button class="md-warn"
|
<md-button class="md-warn"
|
||||||
ng-click="editor.deleteAllOccurrences()">
|
ng-click="editor.deleteAllOccurrences()">
|
||||||
<var:string label:value="Delete All Occurrences"/>
|
<md-icon>repeat</md-icon> <var:string label:value="Delete All Occurrences"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
</md-menu-content>
|
</md-menu-content>
|
||||||
</md-menu>
|
</md-menu>
|
||||||
<div class="md-flex"><!-- spacer --></div>
|
<div class="md-flex"><!-- spacer --></div>
|
||||||
<!-- On larger screens, show both buttons -->
|
<md-menu>
|
||||||
<md-button type="button" class="hide-xs" ng-click="editor.replyAllOccurrences()">
|
|
||||||
<var:string label:value="Update All Occurrences"/>
|
|
||||||
</md-button>
|
|
||||||
<md-button type="button" class="hide-xs" ng-click="editor.reply()">
|
|
||||||
<var:string label:value="Update This Occurrence"/>
|
|
||||||
</md-button>
|
|
||||||
<!-- On small screens, show a md-menu with the two choices -->
|
|
||||||
<md-menu class="hide show-xs">
|
|
||||||
<md-button label:aria-label="Update"
|
<md-button label:aria-label="Update"
|
||||||
ng-click="$mdOpenMenu()"
|
ng-click="$mdOpenMenu()"
|
||||||
md-menu-origin="md-menu-origin">
|
md-menu-origin="md-menu-origin">
|
||||||
<var:string label:value="Update"/>
|
<var:string label:value="Update"/> <md-icon>arrow_drop_down</md-icon>
|
||||||
</md-button>
|
</md-button>
|
||||||
<md-menu-content>
|
<md-menu-content>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button type="button" ng-click="editor.replyAllOccurrences()">
|
<md-button type="button" ng-click="editor.reply()">
|
||||||
<var:string label:value="Update All Occurrences"/>
|
<md-icon>repeat_one</md-icon> <var:string label:value="Update This Occurrence"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
<md-menu-item>
|
<md-menu-item>
|
||||||
<md-button type="button" ng-click="editor.reply()">
|
<md-button type="button" ng-click="editor.replyAllOccurrences()">
|
||||||
<var:string label:value="Update This Occurrence"/>
|
<md-icon>repeat</md-icon> <var:string label:value="Update All Occurrences"/>
|
||||||
</md-button>
|
</md-button>
|
||||||
</md-menu-item>
|
</md-menu-item>
|
||||||
</md-menu-content>
|
</md-menu-content>
|
||||||
</md-menu>
|
</md-menu>
|
||||||
</md-dialog-actions>
|
</md-dialog-actions>
|
||||||
|
|
|
@ -737,4 +737,46 @@
|
||||||
</md-dialog>
|
</md-dialog>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- modal for attendee availability conflict -->
|
||||||
|
<script type="text/ng-template" id="UIxAttendeeConflictDialog">
|
||||||
|
<md-dialog flex="60" flex-xs="100">
|
||||||
|
<md-dialog-content class="md-dialog-content"
|
||||||
|
ng-show="$AttendeeConflictDialogController.conflictError.attendee_email">
|
||||||
|
<h2 class="md-title"><var:string label:value="Warning"/></h2>
|
||||||
|
<p><var:string label:value="A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"/></p>
|
||||||
|
<md-list>
|
||||||
|
<md-list-item>
|
||||||
|
<md-icon>person</md-icon> {{$AttendeeConflictDialogController.conflictError.attendee_name}} ({{$AttendeeConflictDialogController.conflictError.attendee_email}})
|
||||||
|
</md-list-item>
|
||||||
|
<md-list-item ng-repeat="conflict in $AttendeeConflictDialogController.conflictError.conflicts">
|
||||||
|
<md-icon>schedule</md-icon>
|
||||||
|
<div class="pseudo-input-container">
|
||||||
|
<label class="pseudo-input-label"><var:string label:value="From"/></label>
|
||||||
|
<div>{{conflict.startDate}}</div>
|
||||||
|
</div>
|
||||||
|
<div class="pseudo-input-container md-flex">
|
||||||
|
<label class="pseudo-input-label"><var:string label:value="To"/></label>
|
||||||
|
<div>{{conflict.endDate}}</div>
|
||||||
|
</div>
|
||||||
|
</md-list-item>
|
||||||
|
</md-list>
|
||||||
|
</md-dialog-content>
|
||||||
|
<md-dialog-content class="md-dialog-content"
|
||||||
|
ng-show="$AttendeeConflictDialogController.conflictError.reject">
|
||||||
|
<h2 class="md-title"><var:string label:value="Warning"/></h2>
|
||||||
|
<p>{{$AttendeeConflictDialogController.conflictError.reject}}</p>
|
||||||
|
</md-dialog-content>
|
||||||
|
<md-dialog-actions>
|
||||||
|
<md-button type="button" ng-click="$AttendeeConflictDialogController.cancel()">
|
||||||
|
<var:string label:value="Cancel"/>
|
||||||
|
</md-button>
|
||||||
|
<md-button class="md-warn" type="button"
|
||||||
|
ng-show="$AttendeeConflictDialogController.conflictError.conflicts"
|
||||||
|
ng-click="$AttendeeConflictDialogController.save()">
|
||||||
|
<var:string label:value="Save"/>
|
||||||
|
</md-button>
|
||||||
|
</md-dialog-actions>
|
||||||
|
</md-dialog>
|
||||||
|
</script>
|
||||||
|
|
||||||
</var:component>
|
</var:component>
|
||||||
|
|
|
@ -82,7 +82,7 @@
|
||||||
<md-input-container flex-offset="5" md-no-float="md-no-float">
|
<md-input-container flex-offset="5" md-no-float="md-no-float">
|
||||||
<input type="text"
|
<input type="text"
|
||||||
label:placeholder="Email Address"
|
label:placeholder="Email Address"
|
||||||
ng-value="properties.calendar.notifications.notifiedUserOnPersonalModifications"
|
ng-model="properties.calendar.notifications.notifiedUserOnPersonalModifications"
|
||||||
ng-disabled="!properties.calendar.notifications.notifyUserOnPersonalModifications"/>
|
ng-disabled="!properties.calendar.notifications.notifyUserOnPersonalModifications"/>
|
||||||
</md-input-container>
|
</md-input-container>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -66,7 +66,7 @@
|
||||||
|
|
||||||
function onHttpError(event, response) {
|
function onHttpError(event, response) {
|
||||||
var message;
|
var message;
|
||||||
if (response.data && response.data.message)
|
if (response.data && response.data.message && angular.isString(response.data.message))
|
||||||
message = response.data.message;
|
message = response.data.message;
|
||||||
else if (response.status)
|
else if (response.status)
|
||||||
message = response.statusText;
|
message = response.statusText;
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
position: 'top right'
|
position: 'top right'
|
||||||
});
|
});
|
||||||
else
|
else
|
||||||
console.debug('untrap error');
|
$log.debug('untrap error');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Listen to HTTP errors broadcasted from HTTP interceptor
|
// Listen to HTTP errors broadcasted from HTTP interceptor
|
||||||
|
|
|
@ -162,8 +162,7 @@
|
||||||
component.setDelta(coordinates.duration * 15);
|
component.setDelta(coordinates.duration * 15);
|
||||||
newComponent(null, component).finally(function() {
|
newComponent(null, component).finally(function() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
Component.$ghost.pointerHandler = null;
|
Component.$resetGhost();
|
||||||
Component.$ghost.component = null;
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -186,8 +185,11 @@
|
||||||
// Immediately perform the adjustments
|
// Immediately perform the adjustments
|
||||||
component.$adjust(params).then(function() {
|
component.$adjust(params).then(function() {
|
||||||
$rootScope.$emit('calendars:list');
|
$rootScope.$emit('calendars:list');
|
||||||
|
}, function(response) {
|
||||||
|
onComponentAdjustError(response, component, params);
|
||||||
|
}).finally(function() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
Component.$ghost = {};
|
Component.$resetGhost();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
else if (component.occurrenceId) {
|
else if (component.occurrenceId) {
|
||||||
|
@ -199,7 +201,7 @@
|
||||||
params: params
|
params: params
|
||||||
},
|
},
|
||||||
template: [
|
template: [
|
||||||
'<md-dialog flex="50" md-flex="80" sm-flex="90">',
|
'<md-dialog flex="50" sm-flex="80" xs-flex="90">',
|
||||||
' <md-dialog-content class="md-dialog-content">',
|
' <md-dialog-content class="md-dialog-content">',
|
||||||
' <p>' + l('editRepeatingItem') + '</p>',
|
' <p>' + l('editRepeatingItem') + '</p>',
|
||||||
' </md-dialog-content>',
|
' </md-dialog-content>',
|
||||||
|
@ -214,7 +216,7 @@
|
||||||
$rootScope.$emit('calendars:list');
|
$rootScope.$emit('calendars:list');
|
||||||
}).finally(function() {
|
}).finally(function() {
|
||||||
$timeout(function() {
|
$timeout(function() {
|
||||||
Component.$ghost = {};
|
Component.$resetGhost();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -226,13 +228,58 @@
|
||||||
RecurrentComponentDialogController.$inject = ['$scope', '$mdDialog', 'component', 'params'];
|
RecurrentComponentDialogController.$inject = ['$scope', '$mdDialog', 'component', 'params'];
|
||||||
function RecurrentComponentDialogController($scope, $mdDialog, component, params) {
|
function RecurrentComponentDialogController($scope, $mdDialog, component, params) {
|
||||||
$scope.updateThisOccurrence = function() {
|
$scope.updateThisOccurrence = function() {
|
||||||
component.$adjust(params).then($mdDialog.hide, $mdDialog.cancel);
|
component.$adjust(params).then($mdDialog.hide, function(response) {
|
||||||
|
$mdDialog.cancel().then(function() {
|
||||||
|
onComponentAdjustError(response, component, params);
|
||||||
|
});
|
||||||
|
});
|
||||||
};
|
};
|
||||||
$scope.updateAllOccurrences = function() {
|
$scope.updateAllOccurrences = function() {
|
||||||
delete component.occurrenceId;
|
delete component.occurrenceId;
|
||||||
component.$adjust(params).then($mdDialog.hide, $mdDialog.cancel);
|
component.$adjust(params).then($mdDialog.hide, function(response) {
|
||||||
|
$mdDialog.cancel().then(function() {
|
||||||
|
onComponentAdjustError(response, component, params);
|
||||||
|
});
|
||||||
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function onComponentAdjustError(response, component, params) {
|
||||||
|
if (response.status == 403 &&
|
||||||
|
response.data && response.data.message && angular.isObject(response.data.message)) {
|
||||||
|
$mdDialog.show({
|
||||||
|
parent: angular.element(document.body),
|
||||||
|
clickOutsideToClose: false,
|
||||||
|
escapeToClose: false,
|
||||||
|
templateUrl: 'UIxAttendeeConflictDialog',
|
||||||
|
controller: AttendeeConflictDialogController,
|
||||||
|
controllerAs: '$AttendeeConflictDialogController',
|
||||||
|
locals: {
|
||||||
|
component: component,
|
||||||
|
params: params,
|
||||||
|
conflictError: response.data.message
|
||||||
|
}
|
||||||
|
}).then(function() {
|
||||||
|
$rootScope.$emit('calendars:list');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngInject
|
||||||
|
*/
|
||||||
|
AttendeeConflictDialogController.$inject = ['$scope', '$mdDialog', 'component', 'params', 'conflictError'];
|
||||||
|
function AttendeeConflictDialogController($scope, $mdDialog, component, params, conflictError) {
|
||||||
|
var vm = this;
|
||||||
|
|
||||||
|
vm.conflictError = conflictError;
|
||||||
|
vm.cancel = $mdDialog.cancel;
|
||||||
|
vm.save = save;
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
component.$adjust(angular.extend({ ignoreConflicts: true }, params)).then($mdDialog.hide);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filter(filterpopup) {
|
function filter(filterpopup) {
|
||||||
|
|
|
@ -414,6 +414,15 @@
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function $resetGhost
|
||||||
|
* @desc Prepare the ghost object for the next drag by resetting appropriate attributes
|
||||||
|
*/
|
||||||
|
Component.$resetGhost = function() {
|
||||||
|
this.$ghost.pointerHandler = null;
|
||||||
|
this.$ghost.component = null;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function $parseDate
|
* @function $parseDate
|
||||||
* @desc Parse a date string with format YYYY-MM-DDTHH:MM
|
* @desc Parse a date string with format YYYY-MM-DDTHH:MM
|
||||||
|
@ -1035,8 +1044,9 @@
|
||||||
* @function $save
|
* @function $save
|
||||||
* @memberof Component.prototype
|
* @memberof Component.prototype
|
||||||
* @desc Save the component to the server.
|
* @desc Save the component to the server.
|
||||||
|
* @param {object} extraAttributes - additional attributes to send to the server
|
||||||
*/
|
*/
|
||||||
Component.prototype.$save = function() {
|
Component.prototype.$save = function(extraAttributes) {
|
||||||
var _this = this, options, path, component, date, dlp;
|
var _this = this, options, path, component, date, dlp;
|
||||||
|
|
||||||
component = this.$omit();
|
component = this.$omit();
|
||||||
|
@ -1106,6 +1116,8 @@
|
||||||
if (this.occurrenceId)
|
if (this.occurrenceId)
|
||||||
path.push(this.occurrenceId);
|
path.push(this.occurrenceId);
|
||||||
|
|
||||||
|
angular.extend(component, extraAttributes);
|
||||||
|
|
||||||
return Component.$$resource.save(path.join('/'), component, options)
|
return Component.$$resource.save(path.join('/'), component, options)
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
// Make a copy of the data for an eventual reset
|
// Make a copy of the data for an eventual reset
|
||||||
|
|
|
@ -162,6 +162,7 @@
|
||||||
vm.addAttachUrl = addAttachUrl;
|
vm.addAttachUrl = addAttachUrl;
|
||||||
vm.cancel = cancel;
|
vm.cancel = cancel;
|
||||||
vm.save = save;
|
vm.save = save;
|
||||||
|
vm.attendeeConflictError = false;
|
||||||
vm.attendeesEditor = {
|
vm.attendeesEditor = {
|
||||||
days: getDays(),
|
days: getDays(),
|
||||||
hours: getHours()
|
hours: getHours()
|
||||||
|
@ -217,15 +218,18 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function save(form) {
|
function save(form, options) {
|
||||||
if (form.$valid) {
|
if (form.$valid) {
|
||||||
vm.component.$save()
|
vm.component.$save(options)
|
||||||
.then(function(data) {
|
.then(function(data) {
|
||||||
$rootScope.$emit('calendars:list');
|
$rootScope.$emit('calendars:list');
|
||||||
$mdDialog.hide();
|
$mdDialog.hide();
|
||||||
Alarm.getAlarms();
|
Alarm.getAlarms();
|
||||||
}, function(data, status) {
|
}, function(response) {
|
||||||
$log.debug('failed');
|
if (response.status == 403 &&
|
||||||
|
response.data && response.data.message &&
|
||||||
|
angular.isObject(response.data.message))
|
||||||
|
vm.attendeeConflictError = response.data.message;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,22 @@ body.popup {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
md-dialog {
|
||||||
|
md-dialog-content {
|
||||||
|
&.sg-dialog-message {
|
||||||
|
// Prepare content to receive a "close" button on the right
|
||||||
|
align-items: flex-start;
|
||||||
|
display: flex;
|
||||||
|
flex-shrink: 0;
|
||||||
|
transition: background-color $swift-ease-in-duration $swift-ease-in-timing-function;
|
||||||
|
&.ng-hide {
|
||||||
|
background-color: white !important;
|
||||||
|
transition-duration: 0s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: $layout-breakpoint-xs) {
|
@media (max-width: $layout-breakpoint-xs) {
|
||||||
md-dialog {
|
md-dialog {
|
||||||
&[flex-xs="100"],
|
&[flex-xs="100"],
|
||||||
|
|
Loading…
Reference in New Issue