Compare commits
54
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b864c55a8a | ||
|
|
9017c85581 | ||
|
|
5cba10ccff | ||
|
|
b48704e7ff | ||
|
|
69116d8eb7 | ||
|
|
d15f0ee804 | ||
|
|
a1e8a5c4af | ||
|
|
02dd5c3501 | ||
|
|
7a7f85d1a7 | ||
|
|
6d4016dfdb | ||
|
|
e06a0d2035 | ||
|
|
f8ff98b657 | ||
|
|
512f14f6d0 | ||
|
|
9f4f48a44f | ||
|
|
092e7694e0 | ||
|
|
42c227beca | ||
|
|
c400f45ef1 | ||
|
|
78655ae127 | ||
|
|
29e00f3e9e | ||
|
|
beb0d9cb1b | ||
|
|
5c1278a895 | ||
|
|
616c9291e0 | ||
|
|
9941e2a04b | ||
|
|
b40d777a86 | ||
|
|
70f72eb92f | ||
|
|
0a828a739e | ||
|
|
395a01ed52 | ||
|
|
c05b331ac0 | ||
|
|
da32b3f86d | ||
|
|
a09720cf22 | ||
|
|
0364f7f2a4 | ||
|
|
00082eb0bc | ||
|
|
178b1a3a0e | ||
|
|
9ffa72ee9b | ||
|
|
169a0c6125 | ||
|
|
c7b0133000 | ||
|
|
2f9c2cf4da | ||
|
|
57db6b5f91 | ||
|
|
f65ab9b43a | ||
|
|
2258d5cd60 | ||
|
|
ea427ea41a | ||
|
|
ce86d14826 | ||
|
|
7f7c743976 | ||
|
|
6f86506b28 | ||
|
|
e44bc1fc91 | ||
|
|
c90e2b0501 | ||
|
|
cd0324dd49 | ||
|
|
581b2c1912 | ||
|
|
9a9d968756 | ||
|
|
fe003eeef5 | ||
|
|
a09f4d8f49 | ||
|
|
617c1bbc64 | ||
|
|
5bab72726a | ||
|
|
01863987dd |
No files matched your search
@@ -477,6 +477,19 @@ example.
|
||||
|
||||
Defaults to `YES` when unset.
|
||||
|
||||
|S |SOGoCalendarEnableJitsiLink
|
||||
|Parameter allowing users to create Jitsi link when creating an event.
|
||||
Be aware that a least one of the attendees will need an account from a
|
||||
platform that Jitsi supports: Google, Facebook or Github
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|D |SOGoCalendarJitsiBaseUrl
|
||||
|Only used if SOGoCalendarEnableJitsiLink is set to YES. String for the URL of
|
||||
the jitsi server used for creating the meeting link.
|
||||
|
||||
Defaults to `https://meet.jit.si` when unset.
|
||||
|
||||
|S |SOGoSAML2PrivateKeyLocation
|
||||
|The location of the SSL private key file on the filesystem that is used
|
||||
by SOGo to sign and encrypt communications with the SAML2 identity
|
||||
@@ -1546,6 +1559,81 @@ SOGoIMAPCASServiceName should be set to the actual imap service name
|
||||
expected by pam_cas, otherwise it will fail to authenticate incoming
|
||||
connection properly.
|
||||
|
||||
|
||||
Authenticating using OPENID
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
SOGo natively supports OPENID authentication. For activating OpenId authentication you need first to make sure that
|
||||
_SOGoAuthenticationType_ is set to `openid`,
|
||||
_SOGoXSRFValidationEnabled_ is set to `NO` and set the following parameters:
|
||||
|
||||
[cols="^4,46,50a"]
|
||||
|=======================================================================
|
||||
|S |OCSOpenIdURL
|
||||
|Parameter used to set the database URL for openID session.
|
||||
|
||||
For MariaDB/MySQL, set the database URL to something like: mysql://sogo:sogo@127.0.0.1:3306/sogo/sogo_openid.
|
||||
|
||||
|
||||
|S |SOGoOpenIdConfigUrl
|
||||
|Parameter used to specify the endpoint of OpenID Provider Configuration, mandatory. For example:
|
||||
https://myopenid.net/.well-known/openid-configuration
|
||||
|
||||
|S |SOGoOpenIdClient
|
||||
|Name of your openid client, mandatory.
|
||||
|
||||
|S |SOGoOpenIdClientSecret
|
||||
|Secret of your openid client, mandatory
|
||||
|
||||
|S |SOGoOpenIdScope
|
||||
|Scope or your openid client, mandatory. List of words space separated like this:
|
||||
"openid profile email"
|
||||
|
||||
|S |SOGoOpenIdEmailParam
|
||||
|Name of the parameter from user profile that contains the mail/uid.
|
||||
|
||||
Defaults to `email` when unset.
|
||||
|
||||
|S |SOGoOpenIdEnableRefreshToken
|
||||
|Set to `YES` to Enable the mechanism of refresh token if provided. You may have to configure
|
||||
and/or add a value to your scope for it to work.
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|S |SOGoOpenIdTokenCheckInterval
|
||||
|Number of seconds before sogo check again the user's access token validity.
|
||||
This is to prevent sogo to do too much request to the openid server.
|
||||
|
||||
Defaults to `0` when unset.
|
||||
|
||||
|S |SOGoOpenIdLogoutEnabled
|
||||
|Allow user to end their openId with the webmail. Meaning that will disconnect them from
|
||||
the others applicaitons as well.
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|=======================================================================
|
||||
|
||||
|
||||
The tricky part shows up for the imap and smtp sever. SOGo doesn't know the password
|
||||
of the user and only have its access token. A new auth mechanism has been implemented,
|
||||
the https://developers.google.com/gmail/imap/xoauth2-protocol#initial_client_response[xoauth2]
|
||||
|
||||
You can set it with the parameter _NGImap4AuthMechanism_ and/or _SOGoSMTPAuthenticationType_
|
||||
|
||||
*With dovecot:* +
|
||||
Dovecot natively supports xoauth2 and can be figured as such: https://doc.dovecot.org/2.3/configuration_manual/authentication/oauth2/
|
||||
|
||||
*With cyrus:* +
|
||||
Cyrus doesn't support xoauth2 mechanism and pluggins or homemade solutions must be found. +
|
||||
_Please note, as Alinto uses dovecot, we didn't investigate cyrus' case. If one member of the community
|
||||
finds a solution, we will be happy to update this documentation._
|
||||
|
||||
As you can see, a new database table is used for handling openid session. The table is automaticcaly created when _OCSOpenIdURL_ is set.
|
||||
If the user quits the webmail without logging out or trough another application,
|
||||
the session will stays in the table and be useless. That's why a new sogo-tool command has been added to clean this table.
|
||||
You can put it in a cron to do that periodicly. +
|
||||
See _<<sogo-tool-clean-openid-sessions,sogo-tool clean-openid-sessions>>_.
|
||||
|
||||
Authenticating using SAML2
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -1678,6 +1766,9 @@ URL could be set to something like:
|
||||
|
||||
See the "EMail reminders" section in this document for more information.
|
||||
|
||||
|S |SOGoEnableMailCleaning
|
||||
|Parameter used to enable cleaning folders and mailbox (remove mail older than X days). Default value is `NO`.
|
||||
|
||||
|S |SOGoDisableOrganizerEventCheck
|
||||
|Parameter used to disable organizer's calendar event check
|
||||
|
||||
@@ -2097,8 +2188,7 @@ To disable TLS verification for localhost domains, add
|
||||
|
||||
|D |SOGoSMTPAuthenticationType
|
||||
|Activate SMTP authentication and specifies which type is in use.
|
||||
Current, only `PLAIN` is supported and other values will cause
|
||||
the authentication to fail.
|
||||
Current, Are supported `PLAIN` and 'xoauth2' for openid.
|
||||
|
||||
|D |SOGoSMTPMasterUserEnabled
|
||||
|Enable specific SMTP user account for system e-mails (notifications, reminders, ...). Default is `NO`.
|
||||
@@ -2281,6 +2371,7 @@ SASL mechanism. Using `AUTHENTICATE` instead of `LOGIN` is also necessary
|
||||
to enable UTF-8 characters in users' passwords. To enable simple use of
|
||||
`AUTHENTICATE` for this purpose, set this setting to `plain`. Please note
|
||||
that this feature might be limited at this time.
|
||||
Now support `xoauth2` mechanism when using openid. Be sure you imap server undesrtands this mechanism.
|
||||
|
||||
|D |NGImap4ConnectionGroupIdPrefix
|
||||
|Prefix to prepend to names in IMAP ACL transactions, to indicate the
|
||||
@@ -2427,6 +2518,16 @@ appended to the user's vacation message. For example:
|
||||
|
||||
See `SOGoVacationHeaderTemplateFile` for available template variables.
|
||||
|
||||
|D |SOGoVacationAllowZeroDays
|
||||
|Parameter used to enable an option of 0 for the vacation days setting.
|
||||
A value of 0 means that auto response mails are sent for every incoming mail.
|
||||
|
||||
This option has to be supported by the IMAP host
|
||||
(see https://doc.dovecot.org/2.3/settings/pigeonhole-ext/vacation/#pigeonhole_setting-sieve_vacation_min_period
|
||||
for instructions regarding Dovecot/Pigeonhole).
|
||||
|
||||
Defaults to `NO` when unset.
|
||||
|
||||
|D |SOGoForwardEnabled
|
||||
|Parameter used to activate the edition from the preferences window of a
|
||||
forwarding email address. Requires Sieve script support on the IMAP
|
||||
@@ -3604,6 +3705,22 @@ sogo-tool checkup user1
|
||||
sogo-tool checkup -d user1
|
||||
----
|
||||
|
||||
|
||||
[[sogo-tool-clean-openid-sessions]]
|
||||
|
||||
sogo-tool clean-openid-sessions
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Obviously only usefull if you have set SOGo with openId authentication.
|
||||
Will clean all expired openId sessions from the database.
|
||||
|
||||
sogo-tool clean-openid-sessions
|
||||
|
||||
Example:
|
||||
----
|
||||
sogo-tool clean-openid-sessions
|
||||
----
|
||||
|
||||
sogo-tool cleanup
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
@@ -3951,7 +4068,7 @@ _Defaults_ stores all parameters that can be found in Preferences panel. So it g
|
||||
autoreply to many others options.
|
||||
|
||||
|
||||
user-preferences get|set|unset defaults|settings user key [value|-f filename] [-p credentialFile]
|
||||
user-preferences get|set|unset defaults|settings user key [value|-f filename] [-p credentialFile [-F]]
|
||||
|
||||
* First argument is the action *get*, *set* or *unset*
|
||||
* Second argument is parameter type *settings* or *defaults*
|
||||
@@ -3959,7 +4076,8 @@ autoreply to many others options.
|
||||
* Fourth argument *key* is the name of the parameters where to make the action
|
||||
* If the action is *set*, you should provide either *value* as fifth argument or a file with the value inside with *-f* filename/path
|
||||
* If the action is *set* or *unset* and the *key* concerns a sieve script (filter, vacation, forward...), you
|
||||
should provide a credential file, a one-line file that contains "username:password" of an admin account of your imap/sieve server.
|
||||
should provide a credential file, a one-line file that contains "username:password" of an admin account of your imap/sieve server. If you
|
||||
want t oforce the sieve script activation add -F after.
|
||||
|
||||
As there is a lot of parameters, this documentation will not go into details for each one. To know what are
|
||||
the key names and their value you should got to your database in table defined by _SOGoProfileURL_ in your sogo.conf.
|
||||
@@ -3988,7 +4106,7 @@ sogo-tool user-preferences unset defaults user1 Forward -p /etc/sogo/cred
|
||||
|
||||
*set* action:
|
||||
----
|
||||
sogo-tool user-preferences set defaults user1 Forward '{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}' -p cred
|
||||
sogo-tool user-preferences set defaults user1 Forward '{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}' -p cred -F
|
||||
----
|
||||
or create a json file which contains _{"forwardAddress":["sogo-tests2@sogo.alinto"],"enabled":1,"keepCopy":0}_ then:
|
||||
----
|
||||
|
||||
+4
-2
@@ -380,8 +380,10 @@ static BOOL debugLeaks;
|
||||
|
||||
request = [_ctx request];
|
||||
login = [SOGoUser getDecryptedUsernameIfNeeded: _key request: request];
|
||||
|
||||
user = [SOGoUser userWithLogin: login roles: nil];
|
||||
if([login isEqualToString: @"changeLanguage"])
|
||||
user = nil;
|
||||
else
|
||||
user = [SOGoUser userWithLogin: login roles: nil];
|
||||
if (user)
|
||||
userFolder = [$(@"SOGoUserFolder") objectWithName: login
|
||||
inContainer: self];
|
||||
|
||||
@@ -464,7 +464,8 @@ lastPossibleRecurrenceStartDateUsingFirstInstanceCalendarDateRange: (NGCalendarD
|
||||
}
|
||||
}
|
||||
|
||||
if ([self hasRecurrenceDates])
|
||||
//If there are recurrence rules and we have no date yet, its means it's infinite and rdates shouldn't be count as last dates.
|
||||
if ([self hasRecurrenceDates] && !([self hasRecurrenceRules] && !date))
|
||||
{
|
||||
NSEnumerator *rDates;
|
||||
|
||||
|
||||
@@ -1130,28 +1130,26 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
|
||||
delta = [masterEndDate timeIntervalSinceDate: [master startDate]];
|
||||
recurrenceIdRange = [NGCalendarDateRange calendarDateRangeWithStartDate: recurrenceId
|
||||
endDate: [recurrenceId dateByAddingYears:0 months:0 days:0 hours:0 minutes:0 seconds: delta]];
|
||||
if ([dateRange doesIntersectWithDateRange: recurrenceIdRange])
|
||||
recordIndex = [self _indexOfRecordMatchingDate: recurrenceId inArray: ma];
|
||||
if ([dateRange doesIntersectWithDateRange: recurrenceIdRange] && recordIndex == -1) {
|
||||
[self warnWithFormat:
|
||||
@"missing exception record for recurrence-id %@ (uid %@), ma = %@, dr = %@, rir = %@",
|
||||
recurrenceId, [component uid], ma, dateRange, recurrenceIdRange];
|
||||
}
|
||||
if ([dateRange doesIntersectWithDateRange: recurrenceIdRange] && recordIndex != -1)
|
||||
{
|
||||
// The recurrence exception intersects with the date range;
|
||||
// find the occurence and replace it with the new record
|
||||
recordIndex = [self _indexOfRecordMatchingDate: recurrenceId inArray: ma];
|
||||
if (recordIndex > -1)
|
||||
{
|
||||
if ([dateRange containsDate: [component startDate]] ||
|
||||
(endDate && [dateRange containsDate: endDate]))
|
||||
{
|
||||
// We must pass nil to :container here in order to avoid re-entrancy issues.
|
||||
newRecord = [self _fixupRecord: [component quickRecordFromContent: nil container: nil nameInContainer: nil]];
|
||||
[ma replaceObjectAtIndex: recordIndex withObject: newRecord];
|
||||
}
|
||||
else
|
||||
// The range doesn't cover the exception; remove it from the records
|
||||
[ma removeObjectAtIndex: recordIndex];
|
||||
}
|
||||
else
|
||||
[self errorWithFormat:
|
||||
@"missing exception record for recurrence-id %@ (uid %@)",
|
||||
recurrenceId, [component uid]];
|
||||
if ([dateRange containsDate: [component startDate]] ||
|
||||
(endDate && [dateRange containsDate: endDate]))
|
||||
{
|
||||
// We must pass nil to :container here in order to avoid re-entrancy issues.
|
||||
newRecord = [self _fixupRecord: [component quickRecordFromContent: nil container: nil nameInContainer: nil]];
|
||||
[ma replaceObjectAtIndex: recordIndex withObject: newRecord];
|
||||
}
|
||||
else
|
||||
// The range doesn't cover the exception; remove it from the records
|
||||
[ma removeObjectAtIndex: recordIndex];
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1762,7 +1760,7 @@ firstInstanceCalendarDateRange: (NGCalendarDateRange *) fir
|
||||
{
|
||||
NSCalendarDate *now, *rc;
|
||||
|
||||
if (davCalendarStartTimeLimit > 0 && ![[context activeUser] isSuperUser])
|
||||
if ([[context request] isSoWebDAVRequest] && davCalendarStartTimeLimit > 0 && ![[context activeUser] isSuperUser])
|
||||
{
|
||||
now = [NSCalendarDate date];
|
||||
rc = [now addTimeInterval: -davTimeLimitSeconds];
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#import <Foundation/NSString.h>
|
||||
|
||||
#import <NGCards/iCalEvent.h>
|
||||
#import <NGCards/iCalDateTime.h>
|
||||
#import <NGCards/iCalRepeatableEntityObject.h>
|
||||
|
||||
#import "iCalCalendar+SOGo.h"
|
||||
@@ -97,7 +98,29 @@
|
||||
elements = [self allObjects];
|
||||
count = [elements count];
|
||||
if (count)
|
||||
{
|
||||
element = [elements objectAtIndex: 0];
|
||||
if(count >1)
|
||||
{
|
||||
//If there more than one event, it may because there is the main reccurent event and some exceptions with reccurenceId
|
||||
//It's important to fetch the "main" vevent and not the other.
|
||||
NSEnumerator *elementEnum;
|
||||
NSCalendarDate *recurrenceId;
|
||||
CardGroup *elem;
|
||||
elementEnum = [elements objectEnumerator];
|
||||
while((elem = [elementEnum nextObject]))
|
||||
{
|
||||
recurrenceId = [(iCalDateTime *) [elem uniqueChildWithTag: @"recurrence-id"] dateTime];
|
||||
if(recurrenceId)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
element = elem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//NSLog(@"ERROR: given calendar contains no elements: %@", self);
|
||||
|
||||
@@ -379,7 +379,7 @@ NSNumber *iCalDistantFutureNumber = nil;
|
||||
currentAttendee = [attendees nextObject];
|
||||
while (!isAttendee
|
||||
&& currentAttendee)
|
||||
if ([user hasEmail: [currentAttendee rfc822Email]])
|
||||
if ([user hasEmail: [currentAttendee rfc822Email]] && ![self isOrganizer:[currentAttendee rfc822Email]]) // Exclude organizer if in attendees
|
||||
isAttendee = YES;
|
||||
else
|
||||
currentAttendee = [attendees nextObject];
|
||||
|
||||
@@ -993,7 +993,6 @@ static NSString *userAgent = nil;
|
||||
[self _fileAttachmentsFromPart: [m body] onlyImages: onlyImages];
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -1022,7 +1021,7 @@ static NSString *userAgent = nil;
|
||||
|
||||
addresses = [NSMutableArray array];
|
||||
[self _addEMailsOfAddresses: [sourceEnvelope from] toArray: addresses];
|
||||
if ([addresses count])
|
||||
if ([addresses count] > 0)
|
||||
[info setObject: [addresses objectAtIndex: 0] forKey: @"from"];
|
||||
addresses = [NSMutableArray array];
|
||||
[self _addEMailsOfAddresses: [sourceEnvelope to] toArray: addresses];
|
||||
@@ -1038,7 +1037,7 @@ static NSString *userAgent = nil;
|
||||
addresses = [NSMutableArray array];
|
||||
[self _addEMailsOfAddresses: [sourceEnvelope replyTo] toArray: addresses];
|
||||
if ([addresses count] > 0)
|
||||
[info setObject: addresses forKey: @"replyTo"];
|
||||
[info setObject: [addresses objectAtIndex: 0] forKey: @"replyTo"];
|
||||
|
||||
h = [sourceMail mailHeaders];
|
||||
priority = [h objectForKey: @"x-priority"];
|
||||
|
||||
@@ -104,6 +104,7 @@ typedef enum {
|
||||
- (NSArray *) toManyRelationshipKeysWithNamespaces: (BOOL) withNSs;
|
||||
|
||||
- (NSArray *) allFolderPaths: (SOGoMailListingMode) theListingMode;
|
||||
- (NSArray *) allFolderPaths: (SOGoMailListingMode) theListingMode onlyRoot: (BOOL) onlyRoot;
|
||||
- (NSArray *) allFoldersMetadata: (SOGoMailListingMode) theListingMode;
|
||||
|
||||
- (NSDictionary *) imapFolderGUIDs;
|
||||
|
||||
@@ -378,14 +378,21 @@ static NSString *inboxFolderName = @"INBOX";
|
||||
return folders;
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (NSArray *) allFolderPaths: (SOGoMailListingMode) theListingMode
|
||||
- (NSArray *) allFolderPaths: (SOGoMailListingMode) theListingMode
|
||||
{
|
||||
NSMutableArray *folderPaths, *namespaces;
|
||||
return [self allFolderPaths: theListingMode onlyRoot: NO];
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (NSArray *) allFolderPaths: (SOGoMailListingMode) theListingMode onlyRoot: (BOOL) onlyRoot
|
||||
{
|
||||
NSMutableArray *folderPaths, *namespaces, *filteredFolders;
|
||||
NSArray *folders, *mainFolders;
|
||||
NSString *namespace;
|
||||
NSString *folder;
|
||||
NSUInteger slashCount;
|
||||
|
||||
BOOL subscribedOnly;
|
||||
int count, max;
|
||||
@@ -401,10 +408,10 @@ static NSString *inboxFolderName = @"INBOX";
|
||||
onlySubscribedFolders: YES];
|
||||
max = [folders count];
|
||||
for (count = 0; count < max; count++)
|
||||
{
|
||||
[subscribedFolders setObject: [NSNull null]
|
||||
forKey: [folders objectAtIndex: count]];
|
||||
}
|
||||
{
|
||||
[subscribedFolders setObject: [NSNull null]
|
||||
forKey: [folders objectAtIndex: count]];
|
||||
}
|
||||
[[self imap4Connection] flushFolderHierarchyCache];
|
||||
}
|
||||
|
||||
@@ -418,6 +425,17 @@ static NSString *inboxFolderName = @"INBOX";
|
||||
nil] stringsWithFormat: @"/%@"];
|
||||
folders = [[self imap4Connection] allFoldersForURL: [self imap4URL]
|
||||
onlySubscribedFolders: subscribedOnly];
|
||||
if (onlyRoot) {
|
||||
filteredFolders = [[NSMutableArray alloc] init];
|
||||
for (folder in folders) {
|
||||
slashCount = [[folder componentsSeparatedByString:@"/"] count] - 1;
|
||||
if (slashCount <= 1) {
|
||||
[filteredFolders addObject: folder];
|
||||
}
|
||||
}
|
||||
folders = [NSArray arrayWithArray: filteredFolders];
|
||||
[filteredFolders release];
|
||||
}
|
||||
folderPaths = [folders mutableCopy];
|
||||
[folderPaths autorelease];
|
||||
|
||||
|
||||
@@ -953,7 +953,10 @@ static BOOL debugSoParts = NO;
|
||||
body = [NSData data];
|
||||
|
||||
currentAttachment = [NSMutableDictionary dictionaryWithDictionary: currentInfo];
|
||||
[currentAttachment setObject: body forKey: @"body"];
|
||||
if (body)
|
||||
[currentAttachment setObject: body forKey: @"body"];
|
||||
else
|
||||
[self errorWithFormat: @"Failed add attachement %@, empty body - failed to decode : %@", currentPath, currentInfo];
|
||||
[attachments addObject: currentAttachment];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1429,11 +1429,22 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses
|
||||
NSMutableArray *contacts;
|
||||
EOQualifier *qualifier;
|
||||
unsigned int i;
|
||||
NSMutableString *s;
|
||||
NSString *sortAttribute;
|
||||
BOOL sortReverse;
|
||||
|
||||
contacts = [NSMutableArray array];
|
||||
|
||||
if(theDomain != nil && [theDomain length] > 0)
|
||||
{
|
||||
if ([_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
|
||||
{
|
||||
s = [NSMutableString stringWithString: _pristineBaseDN];
|
||||
[s replaceOccurrencesOfString: @"%d" withString: theDomain options: 0 range: NSMakeRange(0, [s length])];
|
||||
ASSIGN(_baseDN, s);
|
||||
}
|
||||
}
|
||||
|
||||
if ([match length] > 0 || !_listRequiresDot)
|
||||
{
|
||||
ldapConnection = [self _ldapConnection];
|
||||
@@ -2290,8 +2301,7 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
|
||||
NSRange r;
|
||||
|
||||
r = [theLogin rangeOfString: @"@"];
|
||||
if (r.location != NSNotFound &&
|
||||
[_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
|
||||
if (r.location != NSNotFound && [_pristineBaseDN rangeOfString: @"%d"].location != NSNotFound)
|
||||
{
|
||||
s = [NSMutableString stringWithString: _pristineBaseDN];
|
||||
[s replaceOccurrencesOfString: @"%d" withString: [theLogin substringFromIndex: r.location+1] options: 0 range: NSMakeRange(0, [s length])];
|
||||
@@ -2364,7 +2374,8 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
|
||||
[pool release];
|
||||
continue; //user alrady fetch
|
||||
}
|
||||
[userLogins addObject: login];
|
||||
if(login != nil)
|
||||
[userLogins addObject: login];
|
||||
user = [SOGoUser userWithLogin: login roles: nil];
|
||||
if (user)
|
||||
{
|
||||
@@ -2397,7 +2408,8 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
|
||||
[pool release];
|
||||
continue; //user alrady fetch
|
||||
}
|
||||
[userLogins addObject: login];
|
||||
if(login != nil)
|
||||
[userLogins addObject: login];
|
||||
user = [SOGoUser userWithLogin: login roles: nil];
|
||||
if (user)
|
||||
{
|
||||
@@ -2469,4 +2481,4 @@ _makeLDAPChanges (NGLdapConnection *ldapConnection,
|
||||
return rc;
|
||||
}
|
||||
|
||||
@end
|
||||
@end
|
||||
@@ -65,7 +65,8 @@
|
||||
domain: &domain
|
||||
perr: &perr
|
||||
expire: &expire
|
||||
grace: &grace]
|
||||
grace: &grace
|
||||
additionalInfo: nil]
|
||||
&& perr == PolicyNoError);
|
||||
|
||||
if (!rc)
|
||||
@@ -140,6 +141,7 @@
|
||||
return password;
|
||||
}
|
||||
|
||||
|
||||
/* create SOGoUser */
|
||||
|
||||
- (SOGoUser *) userInContext: (WOContext *)_ctx
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
- (NSString *) vacationDefaultSubject;
|
||||
- (NSString *) vacationHeaderTemplateFile;
|
||||
- (NSString *) vacationFooterTemplateFile;
|
||||
- (BOOL) vacationAllowZeroDays;
|
||||
- (NSString *) mailingMechanism;
|
||||
- (NSString *) smtpServer;
|
||||
- (BOOL)smtpMasterUserEnabled;
|
||||
@@ -77,6 +78,7 @@
|
||||
- (BOOL) appointmentSendEMailNotifications;
|
||||
- (BOOL) foldersSendEMailNotifications;
|
||||
- (NSArray *) calendarDefaultRoles;
|
||||
- (NSString *) calendarJistiBaseUrl;
|
||||
- (NSArray *) contactsDefaultRoles;
|
||||
- (NSArray *) refreshViewIntervals;
|
||||
- (NSString *) subscriptionFolderFormat;
|
||||
|
||||
@@ -169,6 +169,16 @@
|
||||
return [self stringArrayForKey: @"SOGoCalendarDefaultRoles"];
|
||||
}
|
||||
|
||||
- (NSString *) calendarJistiBaseUrl
|
||||
{
|
||||
NSString *jitsiBaseUrl;
|
||||
jitsiBaseUrl = [self stringForKey: @"SOGoCalendarJitsiBaseUrl"];
|
||||
if(!jitsiBaseUrl)
|
||||
jitsiBaseUrl = @"https://meet.jit.si";
|
||||
|
||||
return jitsiBaseUrl;
|
||||
}
|
||||
|
||||
- (NSArray *) contactsDefaultRoles
|
||||
{
|
||||
return [self stringArrayForKey: @"SOGoContactsDefaultRoles"];
|
||||
@@ -267,6 +277,18 @@
|
||||
return [self stringForKey: @"SOGoVacationFooterTemplateFile"];
|
||||
}
|
||||
|
||||
- (BOOL) vacationAllowZeroDays
|
||||
{
|
||||
id o;
|
||||
|
||||
o = [self stringForKey: @"SOGoVacationAllowZeroDays"];
|
||||
|
||||
if (o)
|
||||
return [o boolValue];
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSString *) mailingMechanism
|
||||
{
|
||||
NSString *mailingMechanism;
|
||||
|
||||
@@ -1531,6 +1531,11 @@ static NSArray *childRecordFields = nil;
|
||||
return valid;
|
||||
}
|
||||
|
||||
- (NSCalendarDate *) _getMaxStartDate
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
/**
|
||||
DAV:sync-collection Report
|
||||
https://datatracker.ietf.org/doc/html/rfc6578#section-3.2
|
||||
@@ -1559,9 +1564,10 @@ static NSArray *childRecordFields = nil;
|
||||
propElement = [(NGDOMNodeWithChildren *) documentElement
|
||||
firstElementWithTag: @"prop" inNamespace: XMLNS_WEBDAV];
|
||||
properties = [self parseDAVRequestedProperties: propElement];
|
||||
|
||||
records = [self syncTokenFieldsWithProperties: properties
|
||||
matchingSyncToken: syncToken
|
||||
fromDate: nil
|
||||
fromDate: [self _getMaxStartDate]
|
||||
initialLoad: NO];
|
||||
|
||||
[self _appendComponentProperties: [properties allKeys]
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
@class NSArray;
|
||||
@class NSException;
|
||||
@class NSString;
|
||||
@class NSDictionary;
|
||||
|
||||
@class WOContext;
|
||||
@class SOGoDomainDefaults;
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#import "NSString+Utilities.h"
|
||||
#import "SOGoStaticAuthenticator.h"
|
||||
#import "SOGoEmptyAuthenticator.h"
|
||||
#import "SOGoWebAuthenticator.h"
|
||||
#import "SOGoSystemDefaults.h"
|
||||
#import "SOGoUser.h"
|
||||
#import "SOGoUserManager.h"
|
||||
@@ -265,7 +266,7 @@
|
||||
inContext: (WOContext *) woContext
|
||||
systemMessage: (BOOL) isSystemMessage
|
||||
{
|
||||
NSString *currentTo, *login, *password;
|
||||
NSString *currentTo, *login, *password, *encryption, *protocol, *server;
|
||||
NSString * smtpAuthMethod;
|
||||
NSDictionary *currentAcount;
|
||||
NSMutableArray *toErrors;
|
||||
@@ -274,6 +275,7 @@
|
||||
NSException *result;
|
||||
NSURL * smtpUrl;
|
||||
SOGoUser* user;
|
||||
SOGoSystemDefaults *sd;
|
||||
BOOL doSmtpAuth;
|
||||
|
||||
result = nil;
|
||||
@@ -297,6 +299,22 @@
|
||||
doSmtpAuth = [currentAcount objectForKey: @"smtpAuth"] ? [[currentAcount objectForKey: @"smtpAuth"] boolValue] : NO;
|
||||
}
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
if(userId == 0 && [sd doesLoginTypeByDomain] && [authenticator isKindOfClass: [SOGoWebAuthenticator class]])
|
||||
{
|
||||
//Check if the authentication depends on the domain, only for webmail requets not for dav...
|
||||
NSString *username, *_domain;
|
||||
NSRange r;
|
||||
|
||||
username = [currentAcount objectForKey: @"userName"];
|
||||
r = [username rangeOfString: @"@"];
|
||||
if (r.location != NSNotFound)
|
||||
{
|
||||
_domain = [username substringFromIndex: r.location+1];
|
||||
smtpAuthMethod = [sd getSmtpAuthMechForDomain: _domain];
|
||||
}
|
||||
}
|
||||
|
||||
NS_DURING
|
||||
{
|
||||
[client connect];
|
||||
@@ -319,7 +337,18 @@
|
||||
getExternalLoginForUID: [[authenticator userInContext: woContext] loginInDomain]
|
||||
inDomain: [[authenticator userInContext: woContext] domain]];
|
||||
|
||||
password = [authenticator passwordInContext: woContext];
|
||||
encryption = [currentAcount objectForKey: @"encryption"];
|
||||
protocol = @"imap";
|
||||
if ([encryption isEqualToString: @"ssl"] || [encryption isEqualToString: @"tls"])
|
||||
protocol = @"imaps";
|
||||
server = [NSString stringWithFormat: @"%@://%@", protocol, [currentAcount objectForKey: @"serverName"]];
|
||||
if([authenticator isKindOfClass: [SOGoWebAuthenticator class]])
|
||||
password = [authenticator smtpPasswordInContext: woContext forURL: server];
|
||||
else
|
||||
{
|
||||
password = [authenticator passwordInContext: woContext];
|
||||
smtpAuthMethod = @"plain"; //is a dav or activesync request, only support plain method
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
NSString *openIdClientSecret;
|
||||
NSString *openIdEmailParam;
|
||||
BOOL openIdEnableRefreshToken;
|
||||
BOOL sendDomainInfo;
|
||||
|
||||
NSString *forDomain;
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
- (void) initializeWithConfig: (NSDictionary *) _config
|
||||
{
|
||||
SOGoSystemDefaults *sd;
|
||||
id refreshTokenBool;
|
||||
id refreshTokenBool, domainInfo;
|
||||
|
||||
if([_config objectForKey: @"SOGoOpenIdConfigUrl"] &&
|
||||
[_config objectForKey: @"SOGoOpenIdScope"] &&
|
||||
@@ -76,6 +76,12 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
if (refreshTokenBool && [refreshTokenBool respondsToSelector: @selector (boolValue)])
|
||||
openIdEnableRefreshToken = [refreshTokenBool boolValue];
|
||||
|
||||
sendDomainInfo = NO;
|
||||
domainInfo = [_config objectForKey: @"SOGoOpenIdSendDomainInfo"];
|
||||
if (domainInfo && [domainInfo respondsToSelector: @selector (boolValue)])
|
||||
sendDomainInfo = [domainInfo boolValue];
|
||||
|
||||
|
||||
userTokenInterval = [_config objectForKey: @"SOGoOpenIdTokenCheckInterval"];
|
||||
[self _loadSessionFromCache: forDomain];
|
||||
|
||||
@@ -124,6 +130,7 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
openIdEmailParam = [sd openIdEmailParam];
|
||||
openIdEnableRefreshToken = [sd openIdEnableRefreshToken];
|
||||
userTokenInterval = [sd openIdTokenCheckInterval];
|
||||
sendDomainInfo = [sd openIdSendDomainInfo];
|
||||
forDomain = _domain;
|
||||
|
||||
[self _loadSessionFromCache: _domain];
|
||||
@@ -140,12 +147,6 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSString *) _get_user_domain
|
||||
{
|
||||
SOGoUser* user = [[context activeUser] login];
|
||||
NSLog(@"user is %@", user);
|
||||
|
||||
}
|
||||
|
||||
- (WOResponse *) _performOpenIdRequest: (NSString *) endpoint
|
||||
method: (NSString *) method
|
||||
@@ -159,7 +160,6 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
WOHTTPConnection *httpConnection;
|
||||
|
||||
|
||||
[self _get_user_domain];
|
||||
url = [NSURL URLWithString: endpoint];
|
||||
if (url)
|
||||
{
|
||||
@@ -167,8 +167,8 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
{
|
||||
NSLog(@"OpenId perform request: %@ %@", method, endpoint);
|
||||
NSLog(@"OpenId perform request, headers %@", headers);
|
||||
if(body)
|
||||
NSLog(@"OpenId perform request: content %@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
|
||||
// if(body)
|
||||
// NSLog(@"OpenId perform request: content %@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
|
||||
}
|
||||
|
||||
httpConnection = [[WOHTTPConnection alloc] initWithURL: url];
|
||||
@@ -218,7 +218,7 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
url = [NSURL URLWithString: self->openIdConfigUrl ];
|
||||
if (url)
|
||||
{
|
||||
if(_domain != nil && [_domain length] > 0)
|
||||
if(self->sendDomainInfo && _domain != nil && [_domain length] > 0)
|
||||
headers = [NSDictionary dictionaryWithObject: _domain forKey: @"sogo-user-domain"];
|
||||
else
|
||||
headers = nil;
|
||||
@@ -505,7 +505,7 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
form = [form stringByAppendingFormat: @"&client_secret=%@", self->openIdClientSecret];
|
||||
form = [form stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
|
||||
|
||||
if(self->forDomain != nil && [self->forDomain length] > 0)
|
||||
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
|
||||
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
|
||||
self->forDomain, @"sogo-user-domain", nil];
|
||||
else
|
||||
@@ -579,7 +579,7 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
form = [form stringByAppendingFormat: @"&client_secret=%@", self->openIdClientSecret];
|
||||
form = [form stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
|
||||
|
||||
if(self->forDomain != nil && [self->forDomain length] > 0)
|
||||
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
|
||||
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
|
||||
self->forDomain, @"sogo-user-domain", nil];
|
||||
else
|
||||
@@ -641,12 +641,13 @@ static BOOL SOGoOpenIDDebugEnabled = YES;
|
||||
if (url)
|
||||
{
|
||||
auth = [NSString stringWithFormat: @"Bearer %@", self->accessToken];
|
||||
if(self->forDomain != nil && [self->forDomain length] > 0)
|
||||
if(self->sendDomainInfo && self->forDomain != nil && [self->forDomain length] > 0)
|
||||
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
|
||||
self->forDomain, @"sogo-user-domain",
|
||||
auth, @"authorization", nil];
|
||||
else
|
||||
headers = [NSDictionary dictionaryWithObject: auth forKey: @"authorization"];
|
||||
headers = [NSDictionary dictionaryWithObjectsAndKeys: @"application/x-www-form-urlencoded", @"content-type",
|
||||
auth, @"authorization", nil];
|
||||
|
||||
response = [self _performOpenIdRequest: location
|
||||
method: @"GET"
|
||||
|
||||
@@ -1033,8 +1033,8 @@ static NSString *sieveScriptName = @"sogo";
|
||||
text = [NSString stringWithFormat: @"%@%@", text, [templateFile textForUser: user]];
|
||||
}
|
||||
|
||||
if (days == 0)
|
||||
days = 7;
|
||||
if (days <= 0)
|
||||
days = [dd vacationAllowZeroDays] ? 0 : 7;
|
||||
|
||||
vacation_script = [NSMutableString string];
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ static const NSString *kDisableSharingCalendar = @"Calendar";
|
||||
|
||||
- (BOOL) isWebAccessEnabled;
|
||||
- (BOOL) isCalendarDAVAccessEnabled;
|
||||
- (BOOL) isCalendarJitsiLinkEnabled;
|
||||
- (BOOL) isAddressBookDAVAccessEnabled;
|
||||
|
||||
- (BOOL) enableEMailAlarms;
|
||||
@@ -108,6 +109,7 @@ NSComparisonResult languageSort(id el1, id el2, void *context);
|
||||
- (BOOL) openIdEnableRefreshToken;
|
||||
- (BOOL) openIdLogoutEnabled: (NSString *) _domain;
|
||||
- (int) openIdTokenCheckInterval;
|
||||
- (BOOL) openIdSendDomainInfo;
|
||||
|
||||
- (NSString *) SAML2PrivateKeyLocation;
|
||||
- (NSString *) SAML2CertificateLocation;
|
||||
@@ -158,6 +160,8 @@ NSComparisonResult languageSort(id el1, id el2, void *context);
|
||||
|
||||
- (NSString *)urlCreateAccount;
|
||||
|
||||
- (BOOL)enableMailCleaning;
|
||||
|
||||
@end
|
||||
|
||||
#endif /* SOGOSYSTEMDEFAULTS_H */
|
||||
@@ -578,6 +578,11 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
|
||||
return [self boolForKey: @"SOGoCalendarDAVAccessEnabled"];
|
||||
}
|
||||
|
||||
- (BOOL) isCalendarJitsiLinkEnabled
|
||||
{
|
||||
return [self boolForKey: @"SOGoCalendarEnableJitsiLink"];
|
||||
}
|
||||
|
||||
- (BOOL) isAddressBookDAVAccessEnabled
|
||||
{
|
||||
return [self boolForKey: @"SOGoAddressBookDAVAccessEnabled"];
|
||||
@@ -791,6 +796,11 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
|
||||
return [self boolForKey: @"SOGoOpenIdLogoutEnabled"];
|
||||
}
|
||||
|
||||
- (BOOL) openIdSendDomainInfo
|
||||
{
|
||||
return [self boolForKey: @"SOGoOpenIdSendDomainInfo"];
|
||||
}
|
||||
|
||||
- (int) openIdTokenCheckInterval
|
||||
{
|
||||
|
||||
@@ -1152,4 +1162,9 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
|
||||
return [self stringForKey: @"SOGoURLCreateAccount"];
|
||||
}
|
||||
|
||||
- (BOOL) enableMailCleaning
|
||||
{
|
||||
return [self boolForKey: @"SOGoEnableMailCleaning"];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -502,6 +502,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
perr: (SOGoPasswordPolicyError *) perr
|
||||
expire: (int *) expire
|
||||
grace: (int *) grace
|
||||
additionalInfo: (NSMutableDictionary **)_additionalInfo
|
||||
{
|
||||
NSObject <SOGoSource> *sogoSource;
|
||||
NSEnumerator *authIDs;
|
||||
@@ -520,8 +521,11 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
perr: perr
|
||||
expire: expire
|
||||
grace: grace];
|
||||
if (_additionalInfo && *_additionalInfo && [sogoSource userPasswordPolicy] && [[sogoSource userPasswordPolicy] count] > 0) {
|
||||
[*_additionalInfo setObject:[sogoSource userPasswordPolicy] forKey:@"userPolicies"];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (checkOK && *domain == nil)
|
||||
{
|
||||
SOGoSystemDefaults *sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
@@ -554,6 +558,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
additionalInfo:(NSMutableDictionary **)_additionalInfo
|
||||
{
|
||||
return [self checkLogin: _login
|
||||
password: _pwd
|
||||
@@ -561,6 +566,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
perr: _perr
|
||||
expire: _expire
|
||||
grace: _grace
|
||||
additionalInfo: _additionalInfo
|
||||
useCache: YES];
|
||||
}
|
||||
|
||||
@@ -573,6 +579,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
additionalInfo: (NSMutableDictionary **)_additionalInfo
|
||||
useCache: (BOOL) useCache
|
||||
{
|
||||
NSString *dictPassword, *username, *jsonUser;
|
||||
@@ -587,7 +594,6 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
|
||||
username = _login;
|
||||
NSLog(@"D login are %@", _login);
|
||||
|
||||
if (*_domain && ![*_domain isKindOfClass: NSNullK])
|
||||
{
|
||||
@@ -727,7 +733,8 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
domain: _domain
|
||||
perr: _perr
|
||||
expire: _expire
|
||||
grace: _grace])
|
||||
grace: _grace
|
||||
additionalInfo: _additionalInfo])
|
||||
{
|
||||
checkOK = YES;
|
||||
if (!currentUser)
|
||||
@@ -1086,30 +1093,37 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
domain = nil;
|
||||
infos = nil;
|
||||
|
||||
//Try to get the domain from the uid
|
||||
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
|
||||
if (r.location != NSNotFound)
|
||||
{
|
||||
// The domain is probably appended to the username;
|
||||
// make sure it is a defined domain in the configuration.
|
||||
domain = [uid substringFromIndex: (r.location + r.length)];
|
||||
if ([self isDomainDefined: domain])
|
||||
username = [uid substringToIndex: r.location];
|
||||
else
|
||||
domain = nil;
|
||||
}
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
if ([sd enableDomainBasedUID])
|
||||
{
|
||||
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
|
||||
if (r.location != NSNotFound)
|
||||
{
|
||||
// The domain is probably appended to the username;
|
||||
// make sure it is a defined domain in the configuration.
|
||||
domain = [uid substringFromIndex: (r.location + r.length)];
|
||||
if ([self isDomainDefined: domain])
|
||||
username = [uid substringToIndex: r.location];
|
||||
else
|
||||
domain = nil;
|
||||
}
|
||||
if (domain != nil)
|
||||
infos = [self contactInfosForUserWithUIDorEmail: username
|
||||
if (domain != nil)
|
||||
{
|
||||
if ([sd enableDomainBasedUID])
|
||||
infos = [self contactInfosForUserWithUIDorEmail: username
|
||||
inDomain: domain];
|
||||
}
|
||||
else
|
||||
infos = [self contactInfosForUserWithUIDorEmail: uid
|
||||
inDomain: domain];
|
||||
}
|
||||
|
||||
if (infos == nil)
|
||||
{
|
||||
// If the user was not found using the domain or if no domain was detected,
|
||||
// search using the original uid.
|
||||
infos = [self contactInfosForUserWithUIDorEmail: uid
|
||||
inDomain: nil];
|
||||
}
|
||||
|
||||
return infos;
|
||||
}
|
||||
@@ -1138,8 +1152,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
|
||||
if ([currentUser isKindOfClass: NSNullK])
|
||||
currentUser = nil;
|
||||
else if (!([currentUser objectForKey: @"emails"]
|
||||
&& [currentUser objectForKey: @"cn"]))
|
||||
else if (!([currentUser objectForKey: @"emails"] && [currentUser objectForKey: @"cn"]))
|
||||
{
|
||||
// We make sure that we either have no occurence of a cache entry or
|
||||
// that we have an occurence with only a cached password. In the
|
||||
@@ -1156,6 +1169,19 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
}
|
||||
else
|
||||
newUser = NO;
|
||||
|
||||
if(!domain)
|
||||
{
|
||||
//No domain provided is there one?
|
||||
NSRange r;
|
||||
r = [uid rangeOfString: @"@" options: NSBackwardsSearch];
|
||||
if (r.location != NSNotFound)
|
||||
{
|
||||
domain = [uid substringFromIndex: (r.location + r.length)];
|
||||
if (![self isDomainDefined: domain])
|
||||
domain = nil;
|
||||
}
|
||||
}
|
||||
[self _fillContactInfosForUser: currentUser
|
||||
withUIDorEmail: aUID
|
||||
inDomain: domain];
|
||||
@@ -1333,8 +1359,7 @@ static const NSString *kObfuscatedSecondaryEmailKey = @"obfuscatedSecondaryEmail
|
||||
- (NSArray *) fetchContactsMatching: (NSString *) filter
|
||||
inDomain: (NSString *) domain
|
||||
{
|
||||
return [self
|
||||
_fetchEntriesInSources: [self addressBookSourceIDsInDomain: domain]
|
||||
return [self _fetchEntriesInSources: [self addressBookSourceIDsInDomain: domain]
|
||||
matching: filter
|
||||
inDomain: domain];
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#import "SOGoConstants.h"
|
||||
|
||||
@class NSString;
|
||||
@class NSMutableDictionary;
|
||||
|
||||
@class WOContext;
|
||||
@class WOCookie;
|
||||
@@ -37,20 +38,22 @@
|
||||
|
||||
+ (id) sharedSOGoWebAuthenticator;
|
||||
|
||||
- (BOOL) checkLogin: (NSString *) _login
|
||||
password: (NSString *) _pwd
|
||||
domain: (NSString **) _domain
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace;
|
||||
- (BOOL)checkLogin:(NSString *)_login
|
||||
password:(NSString *)_pwd
|
||||
domain:(NSString **)_domain
|
||||
perr:(SOGoPasswordPolicyError *)_perr
|
||||
expire:(int *)_expire
|
||||
grace:(int *)_grace
|
||||
additionalInfo:(NSMutableDictionary **)_additionalInfo;
|
||||
|
||||
- (BOOL) checkLogin: (NSString *) _login
|
||||
password: (NSString *) _pwd
|
||||
domain: (NSString **) _domain
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
useCache: (BOOL) useCache;
|
||||
- (BOOL)checkLogin:(NSString *)_login
|
||||
password:(NSString *)_pwd
|
||||
domain:(NSString **)_domain
|
||||
perr:(SOGoPasswordPolicyError *)_perr
|
||||
expire:(int *)_expire
|
||||
grace:(int *)_grace
|
||||
additionalInfo:(NSMutableDictionary **)_additionalInfo
|
||||
useCache:(BOOL)useCache;
|
||||
|
||||
- (WOCookie *) cookieWithUsername: (NSString *) username
|
||||
andPassword: (NSString *) password
|
||||
|
||||
@@ -103,7 +103,8 @@
|
||||
domain: &domain
|
||||
perr: &perr
|
||||
expire: &expire
|
||||
grace: &grace];
|
||||
grace: &grace
|
||||
additionalInfo: nil];
|
||||
}
|
||||
|
||||
- (BOOL) checkLogin: (NSString *) _login
|
||||
@@ -112,6 +113,7 @@
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
additionalInfo: (NSMutableDictionary **)_additionalInfo
|
||||
{
|
||||
return [self checkLogin: _login
|
||||
password: _pwd
|
||||
@@ -119,6 +121,7 @@
|
||||
perr: _perr
|
||||
expire: _expire
|
||||
grace: _grace
|
||||
additionalInfo: _additionalInfo
|
||||
useCache: YES];
|
||||
}
|
||||
|
||||
@@ -128,6 +131,7 @@
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
additionalInfo: (NSMutableDictionary **)_additionalInfo
|
||||
useCache: (BOOL) _useCache
|
||||
{
|
||||
SOGoCASSession *casSession;
|
||||
@@ -139,7 +143,6 @@
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
|
||||
NSLog(@"B Credentials are %@", _login);
|
||||
//Basic check
|
||||
if(!_login)
|
||||
return NO;
|
||||
@@ -156,8 +159,6 @@
|
||||
loginDomain = [_login substringFromIndex: r.location+1];
|
||||
}
|
||||
}
|
||||
if(loginDomain)
|
||||
NSLog(@"C domain are %@", loginDomain);
|
||||
|
||||
if([sd doesLoginTypeByDomain])
|
||||
authenticationType = [sd getLoginTypeForDomain: loginDomain];
|
||||
@@ -198,7 +199,8 @@
|
||||
domain: _domain
|
||||
perr: _perr
|
||||
expire: _expire
|
||||
grace: _grace
|
||||
grace: _grace
|
||||
additionalInfo: _additionalInfo
|
||||
useCache: _useCache];
|
||||
//[self logWithFormat: @"Checked login with ppolicy enabled: %d %d %d", *_perr, *_expire, *_grace];
|
||||
|
||||
@@ -273,21 +275,20 @@
|
||||
|
||||
sessionKey = [creds objectAtIndex:1];
|
||||
|
||||
NSLog(@"AAAA decodevalue for");
|
||||
[SOGoSession decodeValue: [SOGoSession valueForSessionKey: sessionKey]
|
||||
usingKey: userKey
|
||||
login: &login
|
||||
domain: &domain
|
||||
password: &pwd];
|
||||
|
||||
NSLog(@"A Credentials are %@", login);
|
||||
|
||||
|
||||
if (![self checkLogin: login
|
||||
password: pwd
|
||||
domain: &domain
|
||||
perr: &perr
|
||||
expire: &expire
|
||||
grace: &grace])
|
||||
grace: &grace
|
||||
additionalInfo: nil])
|
||||
return nil;
|
||||
|
||||
if (domain && [login rangeOfString: @"@"].location == NSNotFound)
|
||||
@@ -381,6 +382,16 @@
|
||||
return password;
|
||||
}
|
||||
|
||||
- (NSString *) smtpPasswordInContext: (WOContext *) context
|
||||
forURL: (NSURL *) server
|
||||
{
|
||||
NSString *password;
|
||||
|
||||
password = [self imapPasswordInContext: context forURL: server forceRenew:NO];
|
||||
|
||||
return password;
|
||||
}
|
||||
|
||||
/* create SOGoUser */
|
||||
|
||||
- (SOGoUser *) userWithLogin: (NSString *) login
|
||||
|
||||
+77
-25
@@ -245,6 +245,20 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
- (BOOL) checkLogin: (NSString *) _login
|
||||
password: (NSString *) _pwd
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
{
|
||||
return [self checkLogin: _login
|
||||
password: _pwd
|
||||
perr: _perr
|
||||
expire: _perr
|
||||
grace: _grace
|
||||
disablepasswordPolicyCheck: NO];
|
||||
}
|
||||
|
||||
//
|
||||
// SQL sources don't support right now all the password policy
|
||||
// stuff supported by OpenLDAP (and others). If we want to support
|
||||
@@ -256,6 +270,7 @@
|
||||
perr: (SOGoPasswordPolicyError *) _perr
|
||||
expire: (int *) _expire
|
||||
grace: (int *) _grace
|
||||
disablepasswordPolicyCheck: (BOOL) _disablepasswordPolicyCheck
|
||||
{
|
||||
EOAdaptorChannel *channel;
|
||||
EOQualifier *qualifier;
|
||||
@@ -335,10 +350,69 @@
|
||||
else
|
||||
[self errorWithFormat:@"failed to acquire channel for URL: %@",
|
||||
[_viewURL absoluteString]];
|
||||
|
||||
if (YES == rc && !_disablepasswordPolicyCheck) {
|
||||
[self checkPasswordPolicyWithPassword:_pwd perr: _perr];
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates a given password against the configured user password policies.
|
||||
*
|
||||
* This method checks if the provided password complies with all defined
|
||||
* password policies for the user. Each policy is expected to include
|
||||
* a regular expression (`regex`) that the password must match.
|
||||
*
|
||||
* If the password violates any policy, the method sets an appropriate error
|
||||
* in the `perr` parameter and stops further validation.
|
||||
*
|
||||
* @param password the password to validate.
|
||||
* @param perr will be set to indicate a policy violation, if the password
|
||||
* does not meet the required standards. Possible values include:
|
||||
* `PolicyInsufficientPasswordQuality` for insufficient complexity.
|
||||
* @return YES if the password satisfies all policies, NO otherwise.
|
||||
*
|
||||
* @note This method assumes that `_userPasswordPolicy` is an array of dictionaries,
|
||||
* where each dictionary represents a password policy with at least a "regex" key.
|
||||
* @warning If a policy does not include a "regex" key, an error will be logged, and
|
||||
* the method will continue to the next policy.
|
||||
*/
|
||||
- (BOOL) checkPasswordPolicyWithPassword: (NSString *)password perr: (SOGoPasswordPolicyError *)perr
|
||||
{
|
||||
BOOL isPolicyOk;
|
||||
NSDictionary *policy;
|
||||
NSEnumerator *policies;
|
||||
NSRange match;
|
||||
NSString *regex;
|
||||
|
||||
isPolicyOk = YES;
|
||||
|
||||
if ([_userPasswordPolicy count])
|
||||
{
|
||||
policies = [_userPasswordPolicy objectEnumerator];
|
||||
while (isPolicyOk && (policy = [policies nextObject]))
|
||||
{
|
||||
regex = [policy objectForKey: @"regex"];
|
||||
if (regex)
|
||||
{
|
||||
match = [password rangeOfString: regex options: NSRegularExpressionSearch];
|
||||
isPolicyOk = isPolicyOk && match.length > 0;
|
||||
if (match.length == 0)
|
||||
{
|
||||
// [self errorWithFormat: @"Password not conform to policy %@ (%@)", regex, [policy objectForKey: @"label"]];
|
||||
*perr = PolicyInsufficientPasswordQuality;
|
||||
}
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"Invalid password policy (missing regex): %@", policy];
|
||||
}
|
||||
}
|
||||
|
||||
return isPolicyOk;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change a user's password.
|
||||
* @param login the user's login name.
|
||||
@@ -357,11 +431,8 @@
|
||||
BOOL didChange, isOldPwdOk, isPolicyOk;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelManager *cm;
|
||||
NSDictionary *policy;
|
||||
NSEnumerator *policies;
|
||||
NSException *ex;
|
||||
NSRange match;
|
||||
NSString *sqlstr, *regex;
|
||||
NSString *sqlstr;
|
||||
|
||||
*perr = -1;
|
||||
isOldPwdOk = NO;
|
||||
@@ -369,30 +440,11 @@
|
||||
didChange = NO;
|
||||
|
||||
// Verify current password
|
||||
isOldPwdOk = [self checkLogin:login password:oldPassword perr:perr expire:0 grace:0];
|
||||
isOldPwdOk = [self checkLogin:login password:oldPassword perr:perr expire:0 grace:0 disablepasswordPolicyCheck: YES];
|
||||
|
||||
if (isOldPwdOk || passwordRecovery)
|
||||
{
|
||||
if ([_userPasswordPolicy count])
|
||||
{
|
||||
policies = [_userPasswordPolicy objectEnumerator];
|
||||
while (isPolicyOk && (policy = [policies nextObject]))
|
||||
{
|
||||
regex = [policy objectForKey: @"regex"];
|
||||
if (regex)
|
||||
{
|
||||
match = [newPassword rangeOfString: regex options: NSRegularExpressionSearch];
|
||||
isPolicyOk = isPolicyOk && match.length > 0;
|
||||
if (match.length == 0)
|
||||
{
|
||||
// [self errorWithFormat: @"Password not conform to policy %@ (%@)", regex, [policy objectForKey: @"label"]];
|
||||
*perr = PolicyInsufficientPasswordQuality;
|
||||
}
|
||||
}
|
||||
else
|
||||
[self errorWithFormat: @"Invalid password policy (missing regex): %@", policy];
|
||||
}
|
||||
}
|
||||
isPolicyOk = [self checkPasswordPolicyWithPassword:newPassword perr: perr];
|
||||
}
|
||||
|
||||
if ((isOldPwdOk || passwordRecovery) && isPolicyOk)
|
||||
|
||||
@@ -21,6 +21,7 @@ $(SOGO_TOOL)_OBJC_FILES += \
|
||||
SOGoToolRemoveDoubles.m \
|
||||
SOGoToolRenameUser.m \
|
||||
SOGoToolCheckupUser.m \
|
||||
SOGoToolCleanOpenIdSessions.m \
|
||||
SOGoToolCleanupUser.m \
|
||||
SOGoToolRestore.m \
|
||||
SOGoToolCreateFolder.m \
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
/* SOGoToolCleanOpenIdSessions.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2012-2021 Inverse inc.
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This file 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/NSURL+GCS.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import <SOGo/SOGoSession.h>
|
||||
#import <SOGo/SOGoOpenIdSession.h>
|
||||
|
||||
#import "SOGoTool.h"
|
||||
|
||||
@interface SOGoToolCleanOpenIdSessions : SOGoTool
|
||||
@end
|
||||
|
||||
@implementation SOGoToolCleanOpenIdSessions
|
||||
|
||||
+ (NSString *) command
|
||||
{
|
||||
return @"clean-openid-sessions";
|
||||
}
|
||||
|
||||
+ (NSString *) description
|
||||
{
|
||||
return @"clean user openid sessions that are expired";
|
||||
}
|
||||
|
||||
- (void) usage
|
||||
{
|
||||
fprintf (stderr, "clean-openid-sessions\n\n"
|
||||
"\n"
|
||||
"The clean-openid-sessions action should be configured as a cronjob.\n");
|
||||
}
|
||||
|
||||
- (BOOL) cleanExpiredOpenIdSession
|
||||
{
|
||||
BOOL rc;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelManager *cm;
|
||||
NSArray *attrs;
|
||||
NSDictionary *qresult;
|
||||
NSException *ex;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID;
|
||||
NSURL *tableURL;
|
||||
NSUserDefaults *ud;
|
||||
|
||||
unsigned int now;
|
||||
|
||||
rc = YES;
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
|
||||
sessionID = nil;
|
||||
|
||||
sessionsFolderURL = [ud stringForKey: @"OCSOpenIdURL"];
|
||||
if (!sessionsFolderURL)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Couldn't read OCSOpenIdURL");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
tableURL = [[NSURL alloc] initWithString: sessionsFolderURL];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: tableURL];
|
||||
if (!channel)
|
||||
{
|
||||
/* FIXME: nice error msg */
|
||||
NSLog(@"Can't acquire channel");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT c_user_session FROM %@ WHERE c_access_token_expires_in <= %d AND c_refresh_token_expires_in <= %d",
|
||||
[tableURL gcsTableName], now, now];
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (ex)
|
||||
{
|
||||
NSLog(@"%@", [ex reason]);
|
||||
[ex raise];
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
attrs = [channel describeResults: NO];
|
||||
while ((qresult = [channel fetchAttributes: attrs withZone: NULL]))
|
||||
{
|
||||
sessionID = [qresult objectForKey: @"c_user_session"];
|
||||
if (sessionID)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Removing session %@", sessionID);
|
||||
[SOGoOpenIdSession deleteValueForSessionKey: sessionID];
|
||||
}
|
||||
}
|
||||
[cm releaseChannel: channel immediately: YES];
|
||||
|
||||
if (verbose && sessionID == nil)
|
||||
NSLog(@"No session to remove on openId table");
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (BOOL) run
|
||||
{
|
||||
BOOL rc;
|
||||
|
||||
rc = [self cleanExpiredOpenIdSession];
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -1,235 +0,0 @@
|
||||
/* SOGoToolExpireUserSessions.m - this file is part of SOGo
|
||||
*
|
||||
* Copyright (C) 2012-2021 Inverse inc.
|
||||
*
|
||||
* 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
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This file 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSCalendarDate.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSException.h>
|
||||
#import <Foundation/NSUserDefaults.h>
|
||||
|
||||
#import <GDLAccess/EOAdaptorChannel.h>
|
||||
|
||||
#import <GDLContentStore/GCSChannelManager.h>
|
||||
#import <GDLContentStore/NSURL+GCS.h>
|
||||
|
||||
#import <NGExtensions/NSNull+misc.h>
|
||||
|
||||
#import <SOGo/NSString+Utilities.h>
|
||||
#import <SOGo/SOGoSession.h>
|
||||
#import <SOGo/SOGoOpenIdSession.h>
|
||||
|
||||
#import "SOGoTool.h"
|
||||
|
||||
@interface SOGoToolExpireUserSessions : SOGoTool
|
||||
@end
|
||||
|
||||
@implementation SOGoToolExpireUserSessions
|
||||
|
||||
+ (NSString *) command
|
||||
{
|
||||
return @"expire-sessions";
|
||||
}
|
||||
|
||||
+ (NSString *) description
|
||||
{
|
||||
return @"expires user sessions without activity for specified number of minutes";
|
||||
}
|
||||
|
||||
- (void) usage
|
||||
{
|
||||
fprintf (stderr, "expire-sessions [nbMinutes]\n\n"
|
||||
" nbMinutes Number of minutes of inactivity after which a user session will be expired\n"
|
||||
"\n"
|
||||
"The expire-sessions action should be configured as a cronjob.\n");
|
||||
}
|
||||
|
||||
- (BOOL) expireUserOpenIdSessionOlderThan: (int) nbMinutes
|
||||
{
|
||||
BOOL rc;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelManager *cm;
|
||||
NSArray *attrs;
|
||||
NSDictionary *qresult;
|
||||
NSException *ex;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID;
|
||||
NSURL *tableURL;
|
||||
NSUserDefaults *ud;
|
||||
|
||||
unsigned int now, oldest;
|
||||
|
||||
rc = YES;
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
|
||||
oldest = now - (nbMinutes * 60);
|
||||
sessionID = nil;
|
||||
|
||||
sessionsFolderURL = [ud stringForKey: @"OCSOpenIdURL"];
|
||||
if (!sessionsFolderURL)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Couldn't read OCSOpenIdURL");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
tableURL = [[NSURL alloc] initWithString: sessionsFolderURL];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: tableURL];
|
||||
if (!channel)
|
||||
{
|
||||
/* FIXME: nice error msg */
|
||||
NSLog(@"Can't aquire channel");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT c_user_session FROM %@ WHERE c_access_token_expires_in <= %d",
|
||||
[tableURL gcsTableName], oldest];
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (ex)
|
||||
{
|
||||
NSLog(@"%@", [ex reason]);
|
||||
[ex raise];
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
attrs = [channel describeResults: NO];
|
||||
while ((qresult = [channel fetchAttributes: attrs withZone: NULL]))
|
||||
{
|
||||
sessionID = [qresult objectForKey: @"c_user_session"];
|
||||
if (sessionID)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Removing session %@", sessionID);
|
||||
[SOGoOpenIdSession deleteValueForSessionKey: sessionID];
|
||||
}
|
||||
}
|
||||
[cm releaseChannel: channel immediately: YES];
|
||||
|
||||
if (verbose && sessionID == nil)
|
||||
NSLog(@"No session to remove on openId");
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (BOOL) expireUserSessionOlderThan: (int) nbMinutes
|
||||
{
|
||||
BOOL rc;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelManager *cm;
|
||||
NSArray *attrs;
|
||||
NSDictionary *qresult;
|
||||
NSException *ex;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID, *authType;
|
||||
NSURL *tableURL;
|
||||
NSUserDefaults *ud;
|
||||
|
||||
unsigned int now, oldest;
|
||||
|
||||
rc = YES;
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
|
||||
oldest = now - (nbMinutes * 60);
|
||||
sessionID = nil;
|
||||
|
||||
sessionsFolderURL = [ud stringForKey: @"OCSSessionsFolderURL"];
|
||||
if (!sessionsFolderURL)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Couldn't read OCSSessionsFolderURL");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
tableURL = [[NSURL alloc] initWithString: sessionsFolderURL];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: tableURL];
|
||||
if (!channel)
|
||||
{
|
||||
/* FIXME: nice error msg */
|
||||
NSLog(@"Can't aquire channel");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT c_id FROM %@ WHERE c_lastseen <= %d",
|
||||
[tableURL gcsTableName], oldest];
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (ex)
|
||||
{
|
||||
NSLog(@"%@", [ex reason]);
|
||||
[ex raise];
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
attrs = [channel describeResults: NO];
|
||||
while ((qresult = [channel fetchAttributes: attrs withZone: NULL]))
|
||||
{
|
||||
sessionID = [qresult objectForKey: @"c_id"];
|
||||
if (sessionID)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Removing session %@", sessionID);
|
||||
[SOGoSession deleteValueForSessionKey: sessionID];
|
||||
}
|
||||
}
|
||||
[cm releaseChannel: channel immediately: YES];
|
||||
|
||||
if (verbose && sessionID == nil)
|
||||
NSLog(@"No session to remove");
|
||||
|
||||
//doing openid session if needed
|
||||
authType = [ud stringForKey:@"SOGoAuthenticationType"];
|
||||
if([authType isEqualToString: @"openid"])
|
||||
{
|
||||
[self expireUserOpenIdSessionOlderThan: nbMinutes];
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (BOOL) run
|
||||
{
|
||||
BOOL rc;
|
||||
int sessionExpireMinutes = -1;
|
||||
|
||||
rc = NO;
|
||||
|
||||
if ([arguments count])
|
||||
{
|
||||
sessionExpireMinutes = [[arguments objectAtIndex: 0] intValue];
|
||||
}
|
||||
|
||||
NSLog(@"Remove all sessions older than %d min", sessionExpireMinutes);
|
||||
|
||||
if (sessionExpireMinutes == 0 && ![[arguments objectAtIndex: 0] isEqualToString:@"0"])
|
||||
{
|
||||
//If the input is not a number intValue return 0 so we check that's really the case
|
||||
[self usage];
|
||||
}
|
||||
else if (sessionExpireMinutes >= 0)
|
||||
{
|
||||
rc = [self expireUserSessionOlderThan: sessionExpireMinutes];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self usage];
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -60,73 +60,6 @@
|
||||
"The expire-sessions action should be configured as a cronjob.\n");
|
||||
}
|
||||
|
||||
- (BOOL) expireUserOpenIdSessionOlderThan: (int) nbMinutes
|
||||
{
|
||||
BOOL rc;
|
||||
EOAdaptorChannel *channel;
|
||||
GCSChannelManager *cm;
|
||||
NSArray *attrs;
|
||||
NSDictionary *qresult;
|
||||
NSException *ex;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID;
|
||||
NSURL *tableURL;
|
||||
NSUserDefaults *ud;
|
||||
|
||||
unsigned int now, oldest;
|
||||
|
||||
rc = YES;
|
||||
ud = [NSUserDefaults standardUserDefaults];
|
||||
now = [[NSCalendarDate calendarDate] timeIntervalSince1970];
|
||||
oldest = now - (nbMinutes * 60);
|
||||
sessionID = nil;
|
||||
|
||||
sessionsFolderURL = [ud stringForKey: @"OCSOpenIdURL"];
|
||||
if (!sessionsFolderURL)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Couldn't read OCSOpenIdURL");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
tableURL = [[NSURL alloc] initWithString: sessionsFolderURL];
|
||||
cm = [GCSChannelManager defaultChannelManager];
|
||||
channel = [cm acquireOpenChannelForURL: tableURL];
|
||||
if (!channel)
|
||||
{
|
||||
/* FIXME: nice error msg */
|
||||
NSLog(@"Can't aquire channel");
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
sql = [NSString stringWithFormat: @"SELECT c_user_session FROM %@ WHERE c_access_token_expires_in <= %d",
|
||||
[tableURL gcsTableName], oldest];
|
||||
ex = [channel evaluateExpressionX: sql];
|
||||
if (ex)
|
||||
{
|
||||
NSLog(@"%@", [ex reason]);
|
||||
[ex raise];
|
||||
return rc = NO;
|
||||
}
|
||||
|
||||
attrs = [channel describeResults: NO];
|
||||
while ((qresult = [channel fetchAttributes: attrs withZone: NULL]))
|
||||
{
|
||||
sessionID = [qresult objectForKey: @"c_user_session"];
|
||||
if (sessionID)
|
||||
{
|
||||
if (verbose)
|
||||
NSLog(@"Removing session %@", sessionID);
|
||||
[SOGoOpenIdSession deleteValueForSessionKey: sessionID];
|
||||
}
|
||||
}
|
||||
[cm releaseChannel: channel immediately: YES];
|
||||
|
||||
if (verbose && sessionID == nil)
|
||||
NSLog(@"No session to remove on openId");
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
- (BOOL) expireUserSessionOlderThan: (int) nbMinutes
|
||||
{
|
||||
BOOL rc;
|
||||
@@ -135,7 +68,7 @@
|
||||
NSArray *attrs;
|
||||
NSDictionary *qresult;
|
||||
NSException *ex;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID, *authType;
|
||||
NSString *sql, *sessionsFolderURL, *sessionID;
|
||||
NSURL *tableURL;
|
||||
NSUserDefaults *ud;
|
||||
|
||||
@@ -191,13 +124,6 @@
|
||||
if (verbose && sessionID == nil)
|
||||
NSLog(@"No session to remove");
|
||||
|
||||
//doing openid session if needed
|
||||
authType = [ud stringForKey:@"SOGoAuthenticationType"];
|
||||
if([authType isEqualToString: @"openid"])
|
||||
{
|
||||
[self expireUserOpenIdSessionOlderThan: nbMinutes];
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,6 +68,7 @@ typedef enum
|
||||
" -p credentialFile Specify the file containing the sieve admin credentials\n"
|
||||
" The file should contain a single line:\n"
|
||||
" username:password\n"
|
||||
" -F force the activation of the sieve script in case external scripts. Must be the las targument after -p credentialsFile"
|
||||
" Examples:\n"
|
||||
" sogo-tool user-preferences get defaults janedoe SOGoLanguage\n"
|
||||
" sogo-tool user-preferences unset settings janedoe Mail\n"
|
||||
@@ -144,9 +145,19 @@ typedef enum
|
||||
account = [folder lookupName: @"0" inContext: localContext acquire: NO];
|
||||
[account setContext: localContext];
|
||||
|
||||
error = [account updateFiltersWithUsername: authname
|
||||
andPassword: authpwd
|
||||
forceActivation: NO];
|
||||
if([[arguments lastObject] isEqualToString: @"-F"])
|
||||
{
|
||||
error = [account updateFiltersWithUsername: authname
|
||||
andPassword: authpwd
|
||||
forceActivation: YES];
|
||||
}
|
||||
else
|
||||
{
|
||||
error = [account updateFiltersWithUsername: authname
|
||||
andPassword: authpwd
|
||||
forceActivation: NO];
|
||||
}
|
||||
|
||||
if (error)
|
||||
return NO;
|
||||
}
|
||||
@@ -248,7 +259,7 @@ typedef enum
|
||||
break;
|
||||
|
||||
case UserPreferencesSet:
|
||||
if (max > 4)
|
||||
if (![arguments containsObject: @"-f"])
|
||||
{
|
||||
/* value specified on command line */
|
||||
value = [sanitizedArguments objectAtIndex: 4];
|
||||
|
||||
+1
-2
@@ -114,8 +114,7 @@
|
||||
if (count < max)
|
||||
{
|
||||
max -= count;
|
||||
toolArguments = [arguments
|
||||
subarrayWithRange: NSMakeRange (count, max)];
|
||||
toolArguments = [arguments subarrayWithRange: NSMakeRange (count, max)];
|
||||
[toolArguments retain];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,3 +233,10 @@
|
||||
"passwordRecovery_SecretQuestion2" = "What was your first car ?";
|
||||
"passwordRecovery_SecretQuestion3" = "What is your favorite movie ?";
|
||||
"passwordRecovery_SecondaryEmail" = "Secondary E-mail";
|
||||
|
||||
/* Password */
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
|
||||
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
|
||||
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
|
||||
@@ -233,3 +233,10 @@
|
||||
"passwordRecovery_SecretQuestion2" = "Quelle était votre première voiture ?";
|
||||
"passwordRecovery_SecretQuestion3" = "Quel est votre film préféré ?";
|
||||
"passwordRecovery_SecondaryEmail" = "E-mail secondaire";
|
||||
|
||||
/* Password */
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Au moins %{0} lettre(s) minuscule(s)";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Au moins %{0} lettre(s) majuscule(s)";
|
||||
"POLICY_MIN_DIGIT" = "Au moins %{0} chiffre(s)";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Au moins %{0} caractère(s) special(aux)";
|
||||
"POLICY_MIN_LENGTH" = "Longueur d'au moins %{0} caractère(s)";
|
||||
@@ -85,6 +85,7 @@ _xmlCharsetForCharset (NSString *charset)
|
||||
{ @"windows-1255", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1255 -> utf8 conversion
|
||||
{ @"windows-1256", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1255 -> utf8 conversion
|
||||
{ @"windows-1257", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-1257 -> utf8 conversion
|
||||
{ @"windows-874", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger windows-874 -> utf8 conversion
|
||||
{ @"gb2312", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
|
||||
{ @"gbk", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
|
||||
{ @"gb18030", XML_CHAR_ENCODING_ERROR}, // unsupported, will trigger gb2312 -> utf8 conversion
|
||||
@@ -521,7 +522,25 @@ static NSString *_sanitizeHtmlForDisplay(NSString *content)
|
||||
{
|
||||
/* [resultPart appendString:
|
||||
@"src=\"/SOGo.woa/WebServerResources/empty.gif\""]; */
|
||||
name = @"unsafe-src";
|
||||
|
||||
//Check if the image is base64 ant not url
|
||||
NSUInteger i, c;
|
||||
BOOL isBase64 = NO;
|
||||
for (i = 0, c = [_attributes count]; i < c; i++) {
|
||||
NSString *type, *value;
|
||||
type = [_attributes nameAtIndex:i];
|
||||
if ([type isEqualToString:@"src"])
|
||||
{
|
||||
value = [_attributes valueAtIndex:i];
|
||||
if([value length] > 4 && [[value substringToIndex: 4] isEqualToString:@"data"])
|
||||
{
|
||||
isBase64 = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!isBase64)
|
||||
name = @"unsafe-src";
|
||||
}
|
||||
else
|
||||
skipAttribute = YES;
|
||||
|
||||
@@ -170,60 +170,95 @@
|
||||
|
||||
emailEvent = [self _emailEvent];
|
||||
if (emailEvent)
|
||||
{
|
||||
*eventObject = [self _eventObjectWithUID: [emailEvent uid]];
|
||||
if ([*eventObject isNew])
|
||||
{
|
||||
*eventObject = [self _eventObjectWithUID: [emailEvent uid]];
|
||||
if ([*eventObject isNew])
|
||||
{
|
||||
chosenEvent = emailEvent;
|
||||
[*eventObject saveCalendar: [emailEvent parent]];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([emailEvent recurrenceId])
|
||||
{
|
||||
// Event attached to email is not complete -- retrieve it
|
||||
// from the database.
|
||||
NSString *recurrenceTime;
|
||||
|
||||
recurrenceTime = [NSString stringWithFormat: @"%f",
|
||||
[[emailEvent recurrenceId] timeIntervalSince1970]];
|
||||
calendarEvent = (iCalEvent *)[*eventObject lookupOccurrence: recurrenceTime];
|
||||
}
|
||||
else
|
||||
calendarEvent = (iCalEvent *) [*eventObject component: NO secure: NO];
|
||||
|
||||
if (calendarEvent != nil)
|
||||
{
|
||||
// Calendar event still exists -- verify which of the calendar
|
||||
// and email events is the most recent. We must also update
|
||||
// the event (or recurrence-id) with the email's content, otherwise
|
||||
// we would never get major properties updates
|
||||
if ([calendarEvent compare: emailEvent] == NSOrderedAscending)
|
||||
{
|
||||
iCalCalendar *parent;
|
||||
|
||||
parent = [calendarEvent parent];
|
||||
[parent removeChild: calendarEvent];
|
||||
[parent addChild: emailEvent];
|
||||
[*eventObject saveCalendar: parent];
|
||||
[*eventObject flush];
|
||||
chosenEvent = emailEvent;
|
||||
}
|
||||
else
|
||||
{
|
||||
chosenEvent = calendarEvent;
|
||||
if (![[[chosenEvent parent] method] length])
|
||||
[[chosenEvent parent] setMethod: [[emailEvent parent] method]];
|
||||
}
|
||||
}
|
||||
else
|
||||
chosenEvent = emailEvent;
|
||||
}
|
||||
|
||||
organizer = [chosenEvent organizer];
|
||||
if (![[organizer rfc822Email] length])
|
||||
[self _fixOrganizerInEvent: chosenEvent];
|
||||
chosenEvent = emailEvent;
|
||||
[*eventObject saveCalendar: [emailEvent parent]];
|
||||
}
|
||||
else
|
||||
{
|
||||
if ([emailEvent recurrenceId])
|
||||
{
|
||||
// Event attached to email is not complete -- retrieve it
|
||||
// from the database.
|
||||
NSString *recurrenceTime;
|
||||
|
||||
recurrenceTime = [NSString stringWithFormat: @"%f",
|
||||
[[emailEvent recurrenceId] timeIntervalSince1970]];
|
||||
calendarEvent = (iCalEvent *)[*eventObject lookupOccurrence: recurrenceTime];
|
||||
}
|
||||
else
|
||||
calendarEvent = (iCalEvent *) [*eventObject component: NO secure: NO];
|
||||
|
||||
if (calendarEvent != nil)
|
||||
{
|
||||
// Calendar event still exists -- verify which of the calendar
|
||||
// and email events is the most recent. We must also update
|
||||
// the event (or recurrence-id) with the email's content, otherwise
|
||||
// we would never get major properties updates
|
||||
if ([calendarEvent compare: emailEvent] == NSOrderedAscending)
|
||||
{
|
||||
iCalCalendar *parent;
|
||||
parent = [calendarEvent parent];
|
||||
|
||||
//careful, sogo vcalendar objets for reccurent event needs to have the main event first, then all the vevent with reccurence-id
|
||||
if(![emailEvent hasRecurrenceRules] || [emailEvent recurrenceId])
|
||||
{
|
||||
[parent removeChild: calendarEvent];
|
||||
[parent addChild: emailEvent];
|
||||
}
|
||||
else
|
||||
{
|
||||
//The main recurrent event has been changed, put it first and also change all the exception with the correct reccurence-id
|
||||
NSMutableArray *childrenNew;
|
||||
NSEnumerator *childrenOldEnum, *childrenNewEnum;
|
||||
iCalEvent *child;
|
||||
NSCalendarDate *oldStartDate, *newStartDate, *recId;
|
||||
NSTimeInterval interval;
|
||||
|
||||
oldStartDate = [calendarEvent startDate];
|
||||
newStartDate = [emailEvent startDate];
|
||||
interval = [newStartDate timeIntervalSinceDate: oldStartDate];
|
||||
|
||||
[parent removeChild: calendarEvent];
|
||||
childrenNew = [NSMutableArray array];
|
||||
childrenOldEnum = [[parent childrenWithTag:@"vevent"] objectEnumerator];
|
||||
while((child = [childrenOldEnum nextObject]))
|
||||
{
|
||||
[parent removeChild: child];
|
||||
if((recId = [child recurrenceId]))
|
||||
[child setRecurrenceId: [recId dateByAddingTimeInterval: interval]];
|
||||
[childrenNew addObject: child];
|
||||
}
|
||||
[parent addChild: emailEvent];
|
||||
childrenNewEnum = [childrenNew objectEnumerator];
|
||||
while((child = [childrenNewEnum nextObject]))
|
||||
{
|
||||
[parent addChild: child];
|
||||
}
|
||||
}
|
||||
|
||||
[*eventObject saveCalendar: parent];
|
||||
[*eventObject flush];
|
||||
chosenEvent = emailEvent;
|
||||
}
|
||||
else
|
||||
{
|
||||
chosenEvent = calendarEvent;
|
||||
if (![[[chosenEvent parent] method] length])
|
||||
[[chosenEvent parent] setMethod: [[emailEvent parent] method]];
|
||||
}
|
||||
}
|
||||
else
|
||||
chosenEvent = emailEvent;
|
||||
}
|
||||
|
||||
organizer = [chosenEvent organizer];
|
||||
if (![[organizer rfc822Email] length])
|
||||
[self _fixOrganizerInEvent: chosenEvent];
|
||||
}
|
||||
else
|
||||
chosenEvent = nil;
|
||||
|
||||
|
||||
@@ -171,6 +171,7 @@
|
||||
/* MailListView */
|
||||
"Sender" = "Sender";
|
||||
"Subject or Sender" = "Subject or Sender";
|
||||
"Subject or Recipient" = "Subject or Recipient";
|
||||
"To or Cc" = "To or Cc";
|
||||
"Entire Message" = "Entire Message";
|
||||
"Date" = "Date";
|
||||
@@ -514,3 +515,18 @@
|
||||
|
||||
/* Hotkey to forward to a message */
|
||||
"hotkey_forward" = "f";
|
||||
|
||||
/* Email deletion */
|
||||
"Clean folder" = "Clean folder";
|
||||
"Clean mailbox" = "Clean mailbox";
|
||||
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
|
||||
"Apply to subfolders" = "Apply to subfolders";
|
||||
"Delete e-mails older than" = "Delete e-mails older than";
|
||||
"3 months" = "3 months";
|
||||
"6 months" = "6 months";
|
||||
"9 months" = "9 months";
|
||||
"1 year" = "1 year";
|
||||
"Custom" = "Custom";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
|
||||
"Apply" = "Apply";
|
||||
"%{0} message(s) deleted" = "%{0} message(s) deleted";
|
||||
@@ -171,6 +171,7 @@
|
||||
/* MailListView */
|
||||
"Sender" = "Expéditeur";
|
||||
"Subject or Sender" = "Sujet ou expéditeur";
|
||||
"Subject or Recipient" = "Sujet ou destinataire";
|
||||
"To or Cc" = "Pour ou Copie à";
|
||||
"Entire Message" = "Message Complet";
|
||||
"Date" = "Date";
|
||||
@@ -514,3 +515,18 @@
|
||||
|
||||
/* Hotkey to forward to a message */
|
||||
"hotkey_forward" = "f";
|
||||
|
||||
/* Email deletion */
|
||||
"Clean folder" = "Nettoyer le dossier";
|
||||
"Clean mailbox" = "Nettoyer la boite mail";
|
||||
"Delete permanently (do not use trash)" = "Supprimer définitivement (ne pas utiliser la corbeille)";
|
||||
"Apply to subfolders" = "Appliquer aux sous-dossiers";
|
||||
"Delete e-mails older than" = "Supprimer les e-mails plus vieux de";
|
||||
"3 months" = "3 mois";
|
||||
"6 months" = "6 mois";
|
||||
"9 months" = "9 mois";
|
||||
"1 year" = "1 an";
|
||||
"Custom" = "Personnalisé";
|
||||
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "Vous êtes sur le point de supprimer définitivement certains messages. Êtes-vous certain de vouloir effectuer cette action ?";
|
||||
"Apply" = "Appliquer";
|
||||
"%{0} message(s) deleted" = "%{0} message(s) supprimés";
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#import <Foundation/NSData.h>
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
|
||||
#import <NGHttp/NGHttpRequest.h>
|
||||
|
||||
@@ -60,11 +61,72 @@
|
||||
|
||||
@implementation UIxMailAccountActions
|
||||
|
||||
- (NSArray *)sortChildrenRecursively: (NSArray *)children {
|
||||
NSInteger i, j;
|
||||
NSMutableArray *sortedArray;
|
||||
NSArray *unsortedChildren, *sortedChildren;
|
||||
NSDictionary *child;
|
||||
NSMutableDictionary *mutableChild;
|
||||
NSString *name1, *name2;
|
||||
|
||||
if (nil == children || 0 == [children count]) {
|
||||
return children;
|
||||
}
|
||||
|
||||
sortedArray = [NSMutableArray array];
|
||||
|
||||
for (child in children) {
|
||||
unsortedChildren = [child objectForKey:@"children"];
|
||||
sortedChildren = [self sortChildrenRecursively:unsortedChildren];
|
||||
mutableChild = [child mutableCopy];
|
||||
[mutableChild setObject:sortedChildren forKey:@"children"];
|
||||
[sortedArray addObject:mutableChild];
|
||||
}
|
||||
|
||||
for (i = 0; i < [sortedArray count] - 1; i++) {
|
||||
for (j = i + 1; j < [sortedArray count]; j++) {
|
||||
name1 = [[sortedArray objectAtIndex:i] objectForKey:@"name"];
|
||||
name2 = [[sortedArray objectAtIndex:j] objectForKey:@"name"];
|
||||
if ([name1 compare:name2 options:NSCaseInsensitiveSearch] == NSOrderedDescending) {
|
||||
[sortedArray exchangeObjectAtIndex:i withObjectAtIndex:j];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sortedArray;
|
||||
}
|
||||
|
||||
- (NSDictionary *)sortMailboxesRecursively: (NSDictionary *)data {
|
||||
NSArray *mailboxes, *mailboxChildren, *sortedMailboxChildren;
|
||||
NSMutableDictionary *sortedData, *mutableMailbox;
|
||||
NSMutableArray *sortedMailboxes;
|
||||
NSDictionary *mailbox;
|
||||
|
||||
mailboxes = [data objectForKey:@"mailboxes"];
|
||||
sortedData = [data mutableCopy];
|
||||
|
||||
sortedMailboxes = [NSMutableArray array];
|
||||
for (mailbox in mailboxes) {
|
||||
mutableMailbox = [mailbox mutableCopy];
|
||||
|
||||
mailboxChildren = [mailbox objectForKey:@"children"];
|
||||
sortedMailboxChildren = [self sortChildrenRecursively:mailboxChildren];
|
||||
|
||||
[mutableMailbox setObject:sortedMailboxChildren forKey:@"children"];
|
||||
[sortedMailboxes addObject:mutableMailbox];
|
||||
}
|
||||
|
||||
[sortedData setObject:sortedMailboxes forKey:@"mailboxes"];
|
||||
|
||||
return sortedData;
|
||||
}
|
||||
|
||||
- (WOResponse *) listMailboxesAction
|
||||
{
|
||||
SOGoMailAccount *co;
|
||||
NSArray *folders;
|
||||
NSDictionary *data;
|
||||
NSAutoreleasePool *pool;
|
||||
|
||||
co = [self clientObject];
|
||||
|
||||
@@ -74,6 +136,9 @@
|
||||
folders, @"mailboxes",
|
||||
[co getInboxQuota], @"quotas",
|
||||
nil];
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
data = [self sortMailboxesRecursively: data];
|
||||
DESTROY(pool);
|
||||
|
||||
return [self responseWithStatus: 200
|
||||
andJSONRepresentation: data];
|
||||
|
||||
@@ -132,6 +132,8 @@
|
||||
drafts = [account draftsFolderInContext: context];
|
||||
newMail = [drafts newDraft];
|
||||
[newMail fetchMailForEditing: co];
|
||||
if ([co isInTemplatesFolder])
|
||||
[newMail save];
|
||||
[newMail storeInfo];
|
||||
|
||||
accountName = [account nameInContainer];
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#import <Foundation/NSDictionary.h>
|
||||
#import <Foundation/NSURL.h>
|
||||
#import <Foundation/NSValue.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <NGObjWeb/WOContext+SoObjects.h>
|
||||
#import <NGObjWeb/WORequest.h>
|
||||
@@ -46,6 +47,8 @@
|
||||
#import <SOGo/SOGoUser.h>
|
||||
#import <SOGo/SOGoUserSettings.h>
|
||||
|
||||
#import <EOControl/EOQualifier.h>
|
||||
|
||||
#import "UIxMailFolderActions.h"
|
||||
|
||||
@implementation UIxMailFolderActions
|
||||
@@ -1298,4 +1301,126 @@
|
||||
return [self _markMessagesAsJunkOrNotJunk: NO];
|
||||
}
|
||||
|
||||
- (BOOL)isDateStringValid: (NSString *)dateString {
|
||||
NSString *dateRegex = @"^\\d{4}-\\d{2}-\\d{2}$";
|
||||
NSPredicate *dateTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", dateRegex];
|
||||
return [dateTest evaluateWithObject:dateString];
|
||||
}
|
||||
|
||||
- (void) cleanFolderWithFolder: (SOGoMailFolder *)folder
|
||||
withQualifier: (EOQualifier *)qualifier
|
||||
recursive: (BOOL)isRecursive
|
||||
withTrashFolder: (BOOL)useTrashFolder
|
||||
exception: (NSException **)exception
|
||||
counter: (NSUInteger *)counter {
|
||||
NSArray *results, *subfolders;
|
||||
NSUInteger i;
|
||||
SOGoMailFolder *newFolder;
|
||||
NSString *folderName;
|
||||
NSException *e;
|
||||
|
||||
results = [folder fetchUIDsMatchingQualifier: qualifier
|
||||
sortOrdering: @"REVERSE DATE"
|
||||
threaded: NO];
|
||||
|
||||
if (results && [results count] > 0) {
|
||||
e = [folder deleteUIDs: results
|
||||
useTrashFolder: &useTrashFolder
|
||||
inContext: [self context]];
|
||||
[folder expunge];
|
||||
[self logWithFormat: @"Removed %d messages in %@ (%@)", [results count], [folder nameInContainer], results];
|
||||
*counter += [results count];
|
||||
if (e) {
|
||||
[self errorWithFormat: @"Error while cleaning mailbox : %@", e];
|
||||
*exception = e;
|
||||
}
|
||||
}
|
||||
|
||||
if (isRecursive) {
|
||||
subfolders = [folder subfolders];
|
||||
for (i = 0 ; i < [subfolders count] ; i++) {
|
||||
folderName = [NSString stringWithFormat:@"%@/%@", [folder nameInContainer], [subfolders objectAtIndex: i]];
|
||||
newFolder = [[SOGoMailFolder alloc] initWithName: folderName inContainer: [folder container]];
|
||||
[self cleanFolderWithFolder: newFolder
|
||||
withQualifier: qualifier
|
||||
recursive: isRecursive
|
||||
withTrashFolder: useTrashFolder
|
||||
exception: exception
|
||||
counter: counter];
|
||||
[newFolder release];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (WOResponse *) cleanMailboxAction
|
||||
{
|
||||
NSDictionary *jsonRequest, *jsonResponse;
|
||||
WORequest *request;
|
||||
NSString *searchString, *folderName;
|
||||
EOQualifier *searchQualifier;
|
||||
BOOL isRecursive, useTrashFolder;
|
||||
NSException *exception;
|
||||
SOGoMailFolder *folder;
|
||||
SOGoMailAccount *account;
|
||||
NSUInteger i, counter;
|
||||
NSArray *folderNames;
|
||||
|
||||
request = [[self context] request];
|
||||
jsonRequest = [[request contentAsString] objectFromJSONString];
|
||||
|
||||
if (![[SOGoSystemDefaults sharedSystemDefaults] enableMailCleaning])
|
||||
return [self responseWithStatus: 401];
|
||||
|
||||
if (![self isDateStringValid: [jsonRequest objectForKey: @"date"]]) {
|
||||
[self errorWithFormat: @"Error while cleaning mailbox, invalid date : %@", [jsonRequest objectForKey: @"date"]];
|
||||
return [self responseWithStatus: 502];
|
||||
}
|
||||
|
||||
searchString = [NSString stringWithFormat: @"(NOT (flags = 'deleted') AND (DATE <= (NSCalendarDate)\"%@\"))", [jsonRequest objectForKey: @"date"]];
|
||||
searchQualifier = [EOQualifier qualifierWithQualifierFormat: searchString];
|
||||
isRecursive = [[jsonRequest objectForKey: @"applyToSubfolders"] boolValue];
|
||||
useTrashFolder = ![[jsonRequest objectForKey: @"permanentlyDelete"] boolValue];
|
||||
counter = 0;
|
||||
exception = nil;
|
||||
|
||||
if ([[self clientObject] isKindOfClass: [SOGoMailFolder class]]) {
|
||||
folder = [self clientObject];
|
||||
[self cleanFolderWithFolder: folder
|
||||
withQualifier: searchQualifier
|
||||
recursive: isRecursive
|
||||
withTrashFolder: useTrashFolder
|
||||
exception: &exception
|
||||
counter: &counter];
|
||||
} else if ([[self clientObject] isKindOfClass: [SOGoMailAccount class]]) {
|
||||
account = [self clientObject];
|
||||
folderNames = [account allFolderPaths: SOGoMailStandardListing onlyRoot: YES];
|
||||
for (i = 0 ; i < [folderNames count] ; i ++) {
|
||||
folderName = [folderNames objectAtIndex: i];
|
||||
if ([folderName hasPrefix:@"/"]) {
|
||||
folderName = [folderName substringFromIndex:1];
|
||||
}
|
||||
folder = [account folderWithTraversal: folderName andClassName: nil];
|
||||
// Disable clean for trash folder
|
||||
if (![folderName isEqualToString: [account trashFolderNameInContext: [self context]]]
|
||||
&& ![folderName isEqualToString: [account templatesFolderNameInContext: [self context]]])
|
||||
[self cleanFolderWithFolder: folder
|
||||
withQualifier: searchQualifier
|
||||
recursive: isRecursive
|
||||
withTrashFolder: useTrashFolder
|
||||
exception: &exception
|
||||
counter: &counter];
|
||||
}
|
||||
|
||||
[[account imap4Connection] flushMailCaches];
|
||||
}
|
||||
|
||||
if (exception) {
|
||||
return [self responseWithStatus: 500];
|
||||
}
|
||||
|
||||
jsonResponse = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: counter]
|
||||
forKey: @"nbMessageDeleted"];
|
||||
return [self responseWithStatus: 200 andJSONRepresentation: jsonResponse];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -466,6 +466,11 @@
|
||||
return sort;
|
||||
}
|
||||
|
||||
- (NSString *)sanitizeFilterString:(NSString *)str
|
||||
{
|
||||
return [str stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""];
|
||||
}
|
||||
|
||||
- (EOQualifier *) searchQualifier
|
||||
{
|
||||
EOQualifier *qualifier, *notDeleted, *searchQualifier;
|
||||
@@ -498,8 +503,8 @@
|
||||
for (i = 0; i < max; i++)
|
||||
{
|
||||
filter = [filters objectAtIndex:i];
|
||||
searchBy = [filter objectForKey: @"searchBy"];
|
||||
searchInput = [filter objectForKey: @"searchInput"];
|
||||
searchBy = [self sanitizeFilterString: [filter objectForKey: @"searchBy"]];
|
||||
searchInput = [self sanitizeFilterString:[filter objectForKey: @"searchInput"]];
|
||||
|
||||
if (searchBy && searchInput)
|
||||
{
|
||||
|
||||
@@ -611,6 +611,17 @@
|
||||
return result;
|
||||
}
|
||||
|
||||
- (BOOL) isCleanMailboxEnabled {
|
||||
BOOL result;
|
||||
SOGoSystemDefaults *sd;
|
||||
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
|
||||
result = [sd enableMailCleaning];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@end /* UIxMailMainFrame */
|
||||
|
||||
@interface UIxMailFolderTemplate : UIxComponent
|
||||
|
||||
@@ -49,6 +49,11 @@
|
||||
actionClass = "UIxMailFolderActions";
|
||||
actionName = "expunge";
|
||||
};
|
||||
cleanMailbox = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailFolderActions";
|
||||
actionName = "cleanMailbox";
|
||||
};
|
||||
createFolder = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailFolderActions";
|
||||
@@ -417,6 +422,11 @@
|
||||
protectedBy = "View";
|
||||
pageName = "UIxMailUserDelegationEditor";
|
||||
};
|
||||
cleanMailbox = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailFolderActions";
|
||||
actionName = "cleanMailbox";
|
||||
};
|
||||
addDelegate = {
|
||||
protectedBy = "View";
|
||||
actionClass = "UIxMailAccountActions";
|
||||
|
||||
@@ -88,6 +88,7 @@ See <a href=\"http://www.sogo.nu/en/support/community.html\">this page</a> for v
|
||||
"Change your Password" = "Change your Password";
|
||||
"The password was changed successfully." = "The password was changed successfully.";
|
||||
"Your password has expired, please enter a new one below" = "Your password has expired, please enter a new one below";
|
||||
"Your password is too weak. Please choose a stronger password to enhance your security" = "Your password is too weak. Please choose a stronger password to enhance your security";
|
||||
"Password must not be empty." = "Password must not be empty.";
|
||||
"The passwords do not match. Please try again." = "The passwords do not match. Please try again.";
|
||||
"Password Grace Period" = "Password Grace Period";
|
||||
@@ -130,4 +131,4 @@ See <a href=\"http://www.sogo.nu/en/support/community.html\">this page</a> for v
|
||||
"Invalid configuration for email password recovery" = "Invalid configuration for email password recovery";
|
||||
"Password recovery email in error" = "Password recovery email in error";
|
||||
"Password reset" = "Password reset";
|
||||
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}";
|
||||
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}";
|
||||
@@ -85,6 +85,7 @@
|
||||
"Change your Password" = "Changez votre mot de passe";
|
||||
"The password was changed successfully." = "Votre mot de passe a bien été changé.";
|
||||
"Your password has expired, please enter a new one below" = "Votre mot de passe est expiré, veuillez entrer un nouveau mot de passe";
|
||||
"Your password is too weak. Please choose a stronger password to enhance your security" = "Votre mot de passe est trop faible. Veuillez choisir un mot de passe plus sécurisé pour renforcer votre protection";
|
||||
"Password must not be empty." = "Le mot de passe ne doit pas être vide.";
|
||||
"The passwords do not match. Please try again." = "Les mots de passe ne sont pas identiques. Essayez de nouveau.";
|
||||
"Password Grace Period" = "Période de grâce pour le mot de passe";
|
||||
@@ -127,4 +128,4 @@
|
||||
"Invalid configuration for email password recovery" = "Configuration invalide pour la récupération de mot de passe par e-mail";
|
||||
"Password recovery email in error" = "Erreur lors de l'envoi de l'email de récupération";
|
||||
"Password reset" = "Réinitialisation de mot de passe";
|
||||
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Bonjour %{0},\nUne demande de changement de mot de passe a été initiée.\n\nSi vous n'êtes pas à l'origine de cet e-mail, n'en tenez pas compte.\n\nSi vous en êtes bien à l'origine, veuillez cliquer sur le lien ci-dessous pour modifier votre mot de passe: %{1}";
|
||||
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Bonjour %{0},\nUne demande de changement de mot de passe a été initiée.\n\nSi vous n'êtes pas à l'origine de cet e-mail, n'en tenez pas compte.\n\nSi vous en êtes bien à l'origine, veuillez cliquer sur le lien ci-dessous pour modifier votre mot de passe: %{1}";
|
||||
+51
-12
@@ -53,6 +53,7 @@
|
||||
#import <SOGo/SOGoEmptyAuthenticator.h>
|
||||
#import <SOGo/SOGoMailer.h>
|
||||
#import <SOGo/SOGoAdmin.h>
|
||||
#import <SOGo/SOGoPasswordPolicy.h>
|
||||
|
||||
#if defined(MFA_CONFIG)
|
||||
#include <liboath/oath.h>
|
||||
@@ -194,14 +195,23 @@ static const NSString *kJwtKey = @"jwt";
|
||||
//
|
||||
//
|
||||
//
|
||||
- (WOResponse *) _responseWithLDAPPolicyError: (int) error
|
||||
- (WOResponse *) _responseWithLDAPPolicyError: (int) error additionalInfos: (NSDictionary *) additionalInfos
|
||||
{
|
||||
NSDictionary *jsonError;
|
||||
|
||||
jsonError = [NSDictionary dictionaryWithObject: [NSNumber numberWithInt: error]
|
||||
forKey: @"LDAPPasswordPolicyError"];
|
||||
return [self responseWithStatus: 403
|
||||
andJSONRepresentation: jsonError];
|
||||
if (additionalInfos) {
|
||||
jsonError = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithInt:error], @"LDAPPasswordPolicyError",
|
||||
additionalInfos, @"additionalInfos",
|
||||
nil];
|
||||
} else {
|
||||
jsonError = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[NSNumber numberWithInt:error], @"LDAPPasswordPolicyError",
|
||||
nil];
|
||||
}
|
||||
|
||||
return [self responseWithStatus:403
|
||||
andJSONRepresentation:jsonError];
|
||||
}
|
||||
|
||||
- (void) _checkAutoReloadWebCalendars: (SOGoUser *) loggedInUser
|
||||
@@ -224,6 +234,27 @@ static const NSString *kJwtKey = @"jwt";
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
- (void)translateAdditionalLoginInformations:(NSMutableDictionary **)additionalLoginInformations
|
||||
{
|
||||
NSDictionary *policy;
|
||||
NSMutableDictionary *translations;
|
||||
|
||||
if (additionalLoginInformations && *additionalLoginInformations) {
|
||||
if ([*additionalLoginInformations objectForKey:@"userPolicies"]) {
|
||||
translations = [[NSMutableDictionary alloc] init];
|
||||
for (policy in [*additionalLoginInformations objectForKey:@"userPolicies"]) {
|
||||
[translations setObject:[self commonLabelForKey: [policy objectForKey:@"label"]] forKey: [policy objectForKey:@"label"]];
|
||||
}
|
||||
[*additionalLoginInformations setObject:[SOGoPasswordPolicy createPasswordPolicyLabels: [*additionalLoginInformations objectForKey:@"userPolicies"] withTranslations: translations]
|
||||
forKey:@"userPolicies"];
|
||||
[translations release];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
@@ -237,6 +268,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
SOGoUserSettings *us;
|
||||
SOGoUser *loggedInUser;
|
||||
NSDictionary *params;
|
||||
NSMutableDictionary *additionalLoginInformations;
|
||||
NSString *username, *password, *language, *domain, *remoteHost;
|
||||
NSArray *supportedLanguages, *creds;
|
||||
|
||||
@@ -250,6 +282,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
auth = [[WOApplication application] authenticatorInContext: context];
|
||||
request = [context request];
|
||||
params = [[request contentAsString] objectFromJSONString];
|
||||
additionalLoginInformations = [[NSMutableDictionary alloc] init];
|
||||
|
||||
username = [params objectForKey: @"userName"];
|
||||
password = [params objectForKey: @"password"];
|
||||
@@ -259,9 +292,11 @@ static const NSString *kJwtKey = @"jwt";
|
||||
/* this will always be set to something more or less useful by
|
||||
* [WOHttpTransaction applyAdaptorHeadersWithHttpRequest] */
|
||||
remoteHost = [request headerForKey:@"x-webobjects-remote-host"];
|
||||
b = [auth checkLogin: username password: password domain: &domain
|
||||
perr: &err expire: &expire grace: &grace additionalInfo: &additionalLoginInformations useCache: NO];
|
||||
[self translateAdditionalLoginInformations: &additionalLoginInformations];
|
||||
|
||||
if ((b = [auth checkLogin: username password: password domain: &domain
|
||||
perr: &err expire: &expire grace: &grace useCache: NO])
|
||||
if (b
|
||||
&& (err == PolicyNoError)
|
||||
// no password policy
|
||||
&& ((expire < 0 && grace < 0) // no password policy or everything is alright
|
||||
@@ -361,7 +396,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
#endif
|
||||
|
||||
if ([us objectForKey: @"ForceResetPassword"]) {
|
||||
response = [self _responseWithLDAPPolicyError: PolicyPasswordExpired];
|
||||
response = [self _responseWithLDAPPolicyError: PolicyPasswordExpired additionalInfos: additionalLoginInformations];
|
||||
} else {
|
||||
[self _checkAutoReloadWebCalendars: loggedInUser];
|
||||
|
||||
@@ -404,7 +439,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
[self logWithFormat: @"Login from '%@' for user '%@' might not have worked - password policy: %d grace: %d expire: %d bound: %d",
|
||||
remoteHost, username, err, grace, expire, b];
|
||||
|
||||
response = [self _responseWithLDAPPolicyError: err];
|
||||
response = [self _responseWithLDAPPolicyError: err additionalInfos: additionalLoginInformations];
|
||||
}
|
||||
|
||||
if (rememberLogin)
|
||||
@@ -412,6 +447,8 @@ static const NSString *kJwtKey = @"jwt";
|
||||
else
|
||||
[response addCookie: [self _cookieWithUsername: nil]];
|
||||
|
||||
[additionalLoginInformations release];
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -1164,7 +1201,7 @@ static const NSString *kJwtKey = @"jwt";
|
||||
}
|
||||
}
|
||||
else
|
||||
response = [self _responseWithLDAPPolicyError: error];
|
||||
response = [self _responseWithLDAPPolicyError: error additionalInfos: nil];
|
||||
}
|
||||
|
||||
return response;
|
||||
@@ -1417,8 +1454,9 @@ static const NSString *kJwtKey = @"jwt";
|
||||
|
||||
- (BOOL) hasUrlCreateAccount
|
||||
{
|
||||
return ([[SOGoSystemDefaults sharedSystemDefaults]
|
||||
urlCreateAccount] != nil);
|
||||
NSString *url;
|
||||
url = [[SOGoSystemDefaults sharedSystemDefaults] urlCreateAccount];
|
||||
return (url != nil && [url length] > 0);
|
||||
}
|
||||
|
||||
- (NSString *) urlCreateAccount
|
||||
@@ -1427,4 +1465,5 @@ static const NSString *kJwtKey = @"jwt";
|
||||
urlCreateAccount];
|
||||
}
|
||||
|
||||
|
||||
@end /* SOGoRootPage */
|
||||
@@ -274,11 +274,6 @@
|
||||
"Confirmation" = "Confirmation";
|
||||
"Change" = "Change";
|
||||
"Passwords don't match" = "Passwords don't match";
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
|
||||
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
|
||||
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
|
||||
|
||||
|
||||
/* Event+task classifications */
|
||||
|
||||
@@ -274,11 +274,7 @@
|
||||
"Confirmation" = "Confirmation";
|
||||
"Change" = "Changer";
|
||||
"Passwords don't match" = "Les mots de passe ne correspondent pas";
|
||||
"POLICY_MIN_LOWERCASE_LETTER" = "Au moins %{0} lettre(s) minuscule(s)";
|
||||
"POLICY_MIN_UPPERCASE_LETTER" = "Au moins %{0} lettre(s) majuscule(s)";
|
||||
"POLICY_MIN_DIGIT" = "Au moins %{0} chiffre(s)";
|
||||
"POLICY_MIN_SPECIAL_SYMBOLS" = "Au moins %{0} caractère(s) special(aux)";
|
||||
"POLICY_MIN_LENGTH" = "Longueur d'au moins %{0} caractère(s)";
|
||||
|
||||
|
||||
|
||||
/* Event+task classifications */
|
||||
|
||||
@@ -147,6 +147,7 @@ static SoProduct *preferencesProduct = nil;
|
||||
NSMutableDictionary *values, *account, *vacation;
|
||||
SOGoUserDefaults *defaults;
|
||||
SOGoDomainDefaults *domainDefaults;
|
||||
SOGoSystemDefaults *sd;
|
||||
NSMutableArray *accounts;
|
||||
NSDictionary *calendarCategoryLabels, *contactsCategoriesLabels, *vacationOptions;
|
||||
|
||||
@@ -333,6 +334,13 @@ static SoProduct *preferencesProduct = nil;
|
||||
[defaults setCalendarCategoriesColors: colors];
|
||||
}
|
||||
}
|
||||
// Add the jisti link if needed
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
if([sd isCalendarJitsiLinkEnabled])
|
||||
{
|
||||
if (![[defaults source] objectForKey: @"SOGoCalendarJitsiBaseUrl"])
|
||||
[[defaults source] setObject: [domainDefaults calendarJistiBaseUrl] forKey: @"SOGoCalendarJitsiBaseUrl"];
|
||||
}
|
||||
|
||||
//
|
||||
// Default Contacts preferences
|
||||
|
||||
@@ -278,7 +278,7 @@ static NSArray *reminderValues = nil;
|
||||
userSource = [user authenticationSource];
|
||||
|
||||
for(policy in [userSource userPasswordPolicy]) {
|
||||
[translations setObject:[self labelForKey:[policy objectForKey:@"label"]]
|
||||
[translations setObject:[self commonLabelForKey:[policy objectForKey:@"label"]]
|
||||
forKey: [policy objectForKey:@"label"]];
|
||||
}
|
||||
translatedUserPolicy = [SOGoPasswordPolicy createPasswordPolicyLabels: [userSource userPasswordPolicy]
|
||||
@@ -1000,12 +1000,16 @@ static NSArray *reminderValues = nil;
|
||||
//
|
||||
- (NSArray *) daysBetweenResponsesList
|
||||
{
|
||||
static NSArray *daysBetweenResponses = nil;
|
||||
static NSMutableArray *daysBetweenResponses = nil;
|
||||
|
||||
if (!daysBetweenResponses)
|
||||
{
|
||||
daysBetweenResponses = [NSArray arrayWithObjects: @"1", @"2", @"3",
|
||||
daysBetweenResponses = [NSMutableArray arrayWithObjects: @"1", @"2", @"3",
|
||||
@"5", @"7", @"14", @"21", @"30", nil];
|
||||
if ([[user domainDefaults] vacationAllowZeroDays])
|
||||
{
|
||||
[daysBetweenResponses insertObject:@"0" atIndex:0];
|
||||
}
|
||||
[daysBetweenResponses retain];
|
||||
}
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@
|
||||
"Save and Close" = "Save and Close";
|
||||
"Close" = "Close";
|
||||
"Invite Attendees" = "Invite Attendees";
|
||||
"Create Jitsi Meeting" = "Create Jitsi Meeting";
|
||||
"Attach" = "Attach";
|
||||
"Update" = "Update";
|
||||
"Cancel" = "Cancel";
|
||||
|
||||
@@ -117,6 +117,7 @@
|
||||
"Save and Close" = "Enregistrer et fermer";
|
||||
"Close" = "Fermer";
|
||||
"Invite Attendees" = "Participants";
|
||||
"Create Jitsi Meeting" = "Créer Une Réunion Jitsi";
|
||||
"Attach" = "Joindre";
|
||||
"Update" = "Mettre à jour";
|
||||
"Cancel" = "Annuler";
|
||||
|
||||
@@ -350,6 +350,7 @@ static NSArray *tasksFields = nil;
|
||||
//NSLog(@"***[UIxCalListingActions _fixDates:] %@ = %@ (%i)", aDateField, aDate, daylightOffset);
|
||||
if (daylightOffset)
|
||||
{
|
||||
[self logWithFormat: @"Changing date (aDate '%@'), (startDate '%@'), (daylightOffset %d)", aDate, startDate, daylightOffset];
|
||||
// If it is the end date and allday, we need to remove the offset
|
||||
if ([fields[count * 2] isEqualToString: @"endDate"] && [[theRecord objectForKey: @"c_isallday"] boolValue] && daylightOffset > 0)
|
||||
aDate = [aDate dateByAddingYears: 0 months: 0 days: 0 hours: 0
|
||||
|
||||
@@ -517,7 +517,15 @@
|
||||
@interface UIxAppointmentEditorTemplate : UIxComponentEditorTemplate
|
||||
@end
|
||||
|
||||
|
||||
@implementation UIxAppointmentEditorTemplate
|
||||
|
||||
- (BOOL) showJitsiLinkCreation
|
||||
{
|
||||
SOGoSystemDefaults *sd;
|
||||
sd = [SOGoSystemDefaults sharedSystemDefaults];
|
||||
return [sd isCalendarJitsiLinkEnabled];
|
||||
}
|
||||
@end
|
||||
|
||||
/* Task Editor */
|
||||
|
||||
@@ -495,7 +495,7 @@
|
||||
</md-autocomplete>
|
||||
<md-chip-template>
|
||||
<div class="sg-tile-content">
|
||||
{{$chip.c_cn}}
|
||||
{{$chip.c_cn || $chip.email}}
|
||||
</div>
|
||||
</md-chip-template>
|
||||
</md-chips>
|
||||
|
||||
@@ -87,11 +87,16 @@
|
||||
<md-icon label:aria-label="Subject">{{ mailbox.sortedBy('subject') ? 'check' : null }}</md-icon> <var:string label:value="Subject"/>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
<md-menu-item>
|
||||
<md-menu-item ng-if="!mailbox.selectedFolder.isSentFolder">
|
||||
<md-button ng-click="mailbox.sort('from')">
|
||||
<md-icon label:aria-label="From">{{ mailbox.sortedBy('from') ? 'check' : null }}</md-icon> <var:string label:value="From"/>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
<md-menu-item ng-if="mailbox.selectedFolder.isSentFolder">
|
||||
<md-button ng-click="mailbox.sort('to')">
|
||||
<md-icon label:aria-label="To">{{ mailbox.sortedBy('to') ? 'check' : null }}</md-icon> <var:string label:value="To"/>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
<md-menu-item>
|
||||
<md-button ng-click="mailbox.sort('date')">
|
||||
<md-icon label:aria-label="Date">{{ mailbox.sortedBy('date') ? 'check' : null }}</md-icon> <var:string label:value="Date"/>
|
||||
@@ -143,7 +148,8 @@
|
||||
</md-input-container>
|
||||
<md-input-container flex="25">
|
||||
<md-select label:aria-label="Search scope">
|
||||
<md-option value="subject_or_from" selected="selected"><var:string label:value="Subject or Sender"/></md-option>
|
||||
<md-option value="subject_or_from" selected="selected" ng-if="!mailbox.selectedFolder.isSentFolder"><var:string label:value="Subject or Sender"/></md-option>
|
||||
<md-option value="subject_or_to" selected="selected" ng-if="mailbox.selectedFolder.isSentFolder"><var:string label:value="Subject or Recipient"/></md-option>
|
||||
<md-option value="subject"><var:string label:value="Subject"/></md-option>
|
||||
<md-option value="from"><var:string label:value="Sender"/></md-option>
|
||||
<md-option value="to_or_cc"><var:string label:value="To or Cc"/></md-option>
|
||||
@@ -265,7 +271,7 @@
|
||||
<md-button class="sg-no-wrap"
|
||||
aria-label="{{folder.$displayName}}"
|
||||
ng-disabled="::(mailbox.service.selectedFolder.id == folder.id)"
|
||||
ng-click="mailbox.moveSelectedMessages(folder.id)">
|
||||
ng-click="mailbox.moveSelectedMessages(folder.id, null)">
|
||||
<span ng-class="::('sg-child-level-' + folder.level)"
|
||||
ng-bind="folder.$displayName"><!-- mailbox name --></span>
|
||||
</md-button>
|
||||
@@ -632,4 +638,87 @@
|
||||
</md-dialog-actions>
|
||||
</md-dialog>
|
||||
</script>
|
||||
<!-- Remove old emails -->
|
||||
<script type="text/ng-template" id="cleanMailbox">
|
||||
<md-dialog flex="50" flex-sm="80" flex-xs="100">
|
||||
<!-- Toolbar -->
|
||||
<md-toolbar>
|
||||
<div class="md-toolbar-tools">
|
||||
<md-icon class="material-icons sg-icon-toolbar-bg">delete</md-icon>
|
||||
<div class="pseudo-input-container md-flex" ng-if="::!dialogCtrl.isMailbox">
|
||||
<var:string label:value="Clean folder"/>
|
||||
</div>
|
||||
<div class="pseudo-input-container md-flex" ng-if="::dialogCtrl.isMailbox">
|
||||
<var:string label:value="Clean mailbox"/>
|
||||
</div>
|
||||
<md-button class="md-icon-button" ng-click="dialogCtrl.closeDialog()">
|
||||
<md-icon aria-label="Close dialog">close</md-icon>
|
||||
</md-button>
|
||||
</div>
|
||||
</md-toolbar>
|
||||
|
||||
<!-- Dialog Content -->
|
||||
<md-dialog-content class="md-dialog-content">
|
||||
<div class="md-dialog-content">
|
||||
<h4>
|
||||
{{ dialogCtrl.name }}
|
||||
</h4>
|
||||
|
||||
<md-input-container class="md-block">
|
||||
<md-checkbox ng-model="dialogCtrl.form.permanentlyDelete" label:aria-label="Delete permanently (do not use trash)">
|
||||
<var:string label:value="Delete permanently (do not use trash)"/>
|
||||
</md-checkbox>
|
||||
</md-input-container>
|
||||
|
||||
<md-input-container class="md-block">
|
||||
<md-checkbox ng-model="dialogCtrl.form.applyToSubfolders" label:aria-label="Apply to subfolders">
|
||||
<var:string label:value="Apply to subfolders"/>
|
||||
</md-checkbox>
|
||||
</md-input-container>
|
||||
|
||||
<md-input-container class="md-block">
|
||||
<label><var:string label:value="Delete e-mails older than"/></label>
|
||||
<md-select ng-model="dialogCtrl.form.filterDuration">
|
||||
<md-option value="3m"><var:string label:value="3 months"/></md-option>
|
||||
<md-option value="6m"><var:string label:value="6 months"/></md-option>
|
||||
<md-option value="9m"><var:string label:value="9 months"/></md-option>
|
||||
<md-option value="1y"><var:string label:value="1 year"/></md-option>
|
||||
<md-option value="custom"><var:string label:value="Custom"/></md-option>
|
||||
</md-select>
|
||||
</md-input-container>
|
||||
|
||||
<md-input-container class="md-block" ng-show="['custom'].indexOf(dialogCtrl.form.filterDuration) != -1">
|
||||
<label><var:string label:value="Date"/></label>
|
||||
<md-datepicker class="md-text"
|
||||
ng-model="dialogCtrl.form.filterDurationDate"
|
||||
md-hide-icons="calendar"
|
||||
md-max-date="dialogCtrl.maxDate"
|
||||
ng-change="dialogCtrl.mainController.changeDate()">
|
||||
</md-datepicker>
|
||||
</md-input-container>
|
||||
|
||||
<md-input-container class="md-block" ng-show="dialogCtrl.isWarningDisplayed()">
|
||||
<md-checkbox ng-model="dialogCtrl.form.confirmDelete" label:aria-label="You are about to permanently delete some messages. Are you sure you want to proceed with this action?">
|
||||
<span class="clean-mailbox-warn"><var:string label:value="You are about to permanently delete some messages. Are you sure you want to proceed with this action?" /></span>
|
||||
</md-checkbox>
|
||||
</md-input-container>
|
||||
</div>
|
||||
</md-dialog-content>
|
||||
|
||||
<!-- Dialog Actions -->
|
||||
<md-dialog-actions>
|
||||
<md-button class="md-warn" ng-click="dialogCtrl.closeDialog()">
|
||||
<var:string label:value="Cancel" />
|
||||
</md-button>
|
||||
<div class="sg-progress-linear-bottom"
|
||||
ng-show="dialogCtrl.isLoading()">
|
||||
<md-progress-linear class="md-accent"
|
||||
md-mode="indeterminate"><!-- progress --></md-progress-linear>
|
||||
</div>
|
||||
<md-button class="md-primary" ng-disabled="dialogCtrl.isApplyDisabled()" ng-click="dialogCtrl.apply()">
|
||||
<var:string label:value="Apply" />
|
||||
</md-button>
|
||||
</md-dialog-actions>
|
||||
</md-dialog>
|
||||
</script>
|
||||
</container>
|
||||
@@ -69,6 +69,13 @@
|
||||
<var:string label:value="New Folder..."/>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
<var:if condition="isCleanMailboxEnabled">
|
||||
<md-menu-item>
|
||||
<md-button type="button" ng-click="app.showCleanMailboxPanel(null, account)">
|
||||
<var:string label:value="Clean mailbox"/>...
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
</var:if>
|
||||
<md-menu-item ng-show="::account.id == 0">
|
||||
<md-button
|
||||
label:aria-label="Search"
|
||||
@@ -179,6 +186,13 @@
|
||||
<var:string label:value="Compact"/>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
<var:if condition="isCleanMailboxEnabled">
|
||||
<md-menu-item ng-show="::($menuCtrl.folder.type != 'trash')">
|
||||
<md-button type="button" ng-click="$menuCtrl.cleanMailbox()">
|
||||
<var:string label:value="Clean folder"/>...
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
</var:if>
|
||||
<md-menu-item ng-show="::$menuCtrl.folder.$isEditable">
|
||||
<md-button type="button" ng-click="$menuCtrl.confirmDelete()">
|
||||
<var:string label:value="Delete"/>
|
||||
|
||||
@@ -75,6 +75,53 @@
|
||||
<md-tooltip md-direction="bottom"><var:string label:value="Delete selected message or folder"/></md-tooltip>
|
||||
<md-icon>delete</md-icon>
|
||||
</md-button>
|
||||
|
||||
<md-menu>
|
||||
<md-button class="sg-icon-button" label:aria-label="Move To"
|
||||
ng-click="$mdMenu.open($event)">
|
||||
<md-tooltip md-direction="bottom"><var:string label:value="Move To"/></md-tooltip>
|
||||
<md-icon>call_split</md-icon>
|
||||
</md-button>
|
||||
<md-menu-content width="4">
|
||||
<md-menu-item>
|
||||
<md-menu>
|
||||
<md-button label:aria-label="Move To" ng-click="$mdMenu.open($event)">
|
||||
<var:string label:value="Move To"/>
|
||||
</md-button>
|
||||
<md-menu-content width="4">
|
||||
<div ng-repeat="account in ::mailbox.accounts track by account.id">
|
||||
<md-menu-item>
|
||||
<md-menu>
|
||||
<md-button class="md-primary"
|
||||
aria-label="{{ ::account.name }}"
|
||||
ng-click="$mdMenu.open($event)"
|
||||
ng-bind="::account.name"><!-- account name --></md-button>
|
||||
<md-menu-content class="md-dense" width="4">
|
||||
<div ng-repeat="folder in
|
||||
account.$flattenMailboxes({ all: true })
|
||||
track by folder.path">
|
||||
<md-menu-item>
|
||||
<md-button class="sg-no-wrap"
|
||||
aria-label="{{folder.$displayName}}"
|
||||
ng-disabled="::(mailbox.service.selectedFolder.id == folder.id)"
|
||||
ng-click="mailbox.moveSelectedMessages(folder.id, viewer.message)">
|
||||
<span ng-class="::('sg-child-level-' + folder.level)"
|
||||
ng-bind="folder.$displayName"><!-- mailbox name --></span>
|
||||
</md-button>
|
||||
</md-menu-item>
|
||||
</div>
|
||||
</md-menu-content>
|
||||
</md-menu>
|
||||
</md-menu-item>
|
||||
</div>
|
||||
</md-menu-content>
|
||||
</md-menu>
|
||||
</md-menu-item>
|
||||
</md-menu-content>
|
||||
</md-menu>
|
||||
|
||||
|
||||
|
||||
<md-button class="sg-icon-button hide show-gt-md" label:aria-label="'Open in New Mail Window'.asSafeJSString"
|
||||
ng-hide="::isPopup"
|
||||
ng-click="viewer.openInPopup()">
|
||||
|
||||
@@ -161,100 +161,108 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<var:if condition="isTotpEnabled">
|
||||
<!-- TOTP Code -->
|
||||
<div layout="row" layout-align="center center" layout-fill="layout-fill"
|
||||
ng-switch-when="totpcode">
|
||||
<div flex="80" flex-sm="50" flex-gt-sm="40">
|
||||
<md-input-container class="md-block">
|
||||
<label><var:string label:value="Verification Code"/></label>
|
||||
<md-icon>lock</md-icon>
|
||||
<input type="text"
|
||||
ng-pattern="app.verificationCodePattern"
|
||||
ng-model="app.creds.verificationCode"
|
||||
ng-required="app.loginState == 'totpcode'"
|
||||
sg-focus-on="totpcode"/>
|
||||
<div class="sg-hint"><var:string label:value="Enter the 6-digit verification code from your TOTP application."/></div>
|
||||
</md-input-container>
|
||||
<div layout="row" layout-align="space-between center">
|
||||
<md-button class="md-icon-button"
|
||||
label:aria-label="Cancel"
|
||||
ng-click="app.restoreLogin()"
|
||||
sg-ripple-click="loginContent">
|
||||
<md-icon>arrow_backward</md-icon>
|
||||
</md-button>
|
||||
<md-button class="md-fab md-accent md-hue-2" type="submit"
|
||||
label:aria-label="Connect"
|
||||
ng-if="app.loginState == 'totpcode'"
|
||||
ng-disabled="loginForm.$invalid"
|
||||
ng-click="app.login()">
|
||||
<md-icon>arrow_forward</md-icon>
|
||||
</md-button>
|
||||
</div>
|
||||
<var:if condition="isTotpEnabled">
|
||||
<!-- TOTP Code -->
|
||||
<div layout="row" layout-align="center center" layout-fill="layout-fill"
|
||||
ng-switch-when="totpcode">
|
||||
<div flex="80" flex-sm="50" flex-gt-sm="40">
|
||||
<md-input-container class="md-block">
|
||||
<label><var:string label:value="Verification Code"/></label>
|
||||
<md-icon>lock</md-icon>
|
||||
<input type="text" inputmode="numeric" autocomplete="off"
|
||||
ng-pattern="app.verificationCodePattern"
|
||||
ng-model="app.creds.verificationCode"
|
||||
ng-required="app.loginState == 'totpcode'"
|
||||
sg-focus-on="totpcode"/>
|
||||
<div class="sg-hint"><var:string label:value="Enter the 6-digit verification code from your TOTP application."/></div>
|
||||
</md-input-container>
|
||||
<div layout="row" layout-align="space-between center">
|
||||
<md-button class="md-icon-button"
|
||||
label:aria-label="Cancel"
|
||||
ng-click="app.restoreLogin()"
|
||||
sg-ripple-click="loginContent">
|
||||
<md-icon>arrow_backward</md-icon>
|
||||
</md-button>
|
||||
<md-button class="md-fab md-accent md-hue-2" type="submit"
|
||||
label:aria-label="Connect"
|
||||
ng-if="app.loginState == 'totpcode'"
|
||||
ng-disabled="loginForm.$invalid"
|
||||
ng-click="app.login()">
|
||||
<md-icon>arrow_forward</md-icon>
|
||||
</md-button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- TOTP has been disabled -->
|
||||
<div layout="row" layout-align="center center" layout-fill="layout-fill"
|
||||
ng-switch-when="totpdisabled">
|
||||
<div layout="column" layout-align="center center" flex-xs="flex-xs" flex-gt-xs="50">
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large">warning</md-icon>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.cn">
|
||||
<var:string label:value="Welcome"/> {{app.cn}}
|
||||
</div>
|
||||
<div class="md-padding" layout="row" layout-align="start center">
|
||||
<md-icon>priority_high</md-icon>
|
||||
<div class="md-padding">
|
||||
<var:string label:value="Two-factor authentication has been disabled. Visit the Preferences module to restore two-factor authentication and reconfigure your TOTP application."/>
|
||||
</div>
|
||||
</div>
|
||||
<div layout="row" layout-align="end center">
|
||||
<md-button
|
||||
ng-click="app.continueLogin()"
|
||||
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
|
||||
</div>
|
||||
<!-- TOTP has been disabled -->
|
||||
<div layout="row" layout-align="center center" layout-fill="layout-fill"
|
||||
ng-switch-when="totpdisabled">
|
||||
<div layout="column" layout-align="center center" flex-xs="flex-xs" flex-gt-xs="50">
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large">warning</md-icon>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.cn">
|
||||
<var:string label:value="Welcome"/> {{app.cn}}
|
||||
</div>
|
||||
<div class="md-padding" layout="row" layout-align="start center">
|
||||
<md-icon>priority_high</md-icon>
|
||||
<div class="md-padding">
|
||||
<var:string label:value="Two-factor authentication has been disabled. Visit the Preferences module to restore two-factor authentication and reconfigure your TOTP application."/>
|
||||
</div>
|
||||
</div>
|
||||
<div layout="row" layout-align="end center">
|
||||
<md-button
|
||||
ng-click="app.continueLogin()"
|
||||
sg-ripple-click="loginContent"><var:string label:value="Continue"/></md-button>
|
||||
</div>
|
||||
</div>
|
||||
</var:if>
|
||||
</div>
|
||||
</var:if>
|
||||
|
||||
<!-- Password policy: Password is expired / password recovery-->
|
||||
<div layout="column" layout-align="center center"
|
||||
ng-switch-when="passwordchange">
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large" ng-if="!app.isInPasswordRecoveryMode()">watch_later</md-icon>
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large" ng-if="app.isInPasswordRecoveryMode()">vpn_key</md-icon>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="!app.isInPasswordRecoveryMode()">
|
||||
<var:string label:value="Your password has expired, please enter a new one below"/>
|
||||
<!-- Password policy: Password is expired / password recovery-->
|
||||
<div layout="column" layout-align="center center"
|
||||
ng-switch-when="passwordchange">
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large" ng-if="!(app.isInPasswordRecoveryMode() || app.isPasswordExpiredSecurity())">watch_later</md-icon>
|
||||
<md-icon class="md-accent md-hue-1 sg-icon--large" ng-if="app.isInPasswordRecoveryMode() || app.isPasswordExpiredSecurity()">vpn_key</md-icon>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="!app.isInPasswordRecoveryMode()">
|
||||
<span ng-if="!app.isPasswordExpiredSecurity()"><var:string label:value="Your password has expired, please enter a new one below"/></span>
|
||||
<span ng-if="app.isPasswordExpiredSecurity()"><var:string label:value="Your password is too weak. Please choose a stronger password to enhance your security"/></span>
|
||||
</div>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.isInPasswordRecoveryMode()">
|
||||
<var:string label:value="Please enter a new password below"/>
|
||||
</div>
|
||||
<div flex="100">
|
||||
<div layout="row" layout-xs="column">
|
||||
<md-input-container class="md-block" flex="flex" ng-if="!(app.isInPasswordRecoveryMode())">
|
||||
<label><var:string label:value="Current password"/>
|
||||
</label>
|
||||
<input type="password" sg-no-dirty-check="true" ng-model="app.passwords.oldPassword"/>
|
||||
</md-input-container>
|
||||
<md-input-container class="md-block" flex="flex">
|
||||
<label><var:string label:value="New password"/>
|
||||
</label>
|
||||
<input type="password" sg-no-dirty-check="true" ng-model="app.passwords.newPassword"/>
|
||||
<div class="sg-hint">
|
||||
<ul class="sg-padded">
|
||||
<li ng-repeat="item in app.passwordPolicy">
|
||||
{{ item.label }}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</md-input-container>
|
||||
<md-input-container class="md-block" flex="flex">
|
||||
<label><var:string label:value="Confirmation"/>
|
||||
</label>
|
||||
<input type="password" name="newPasswordConfirmation" sg-no-dirty-check="true" ng-model="app.passwords.newPasswordConfirmation"/>
|
||||
<div ng-messages="loginForm.newPasswordConfirmation.$error">
|
||||
<div ng-message="newPasswordMismatch"><var:string label:value="Passwords don't match"/></div>
|
||||
</div>
|
||||
</md-input-container>
|
||||
</div>
|
||||
<div class="md-default-theme md-accent md-hue-1 md-fg md-padding" ng-if="app.isInPasswordRecoveryMode()">
|
||||
<var:string label:value="Please enter a new password below"/>
|
||||
</div>
|
||||
<div flex="100">
|
||||
<div layout="row" layout-xs="column">
|
||||
<md-input-container class="md-block" flex="flex" ng-if="!app.isInPasswordRecoveryMode()">
|
||||
<label><var:string label:value="Current password"/>
|
||||
</label>
|
||||
<input type="password" sg-no-dirty-check="true" ng-model="app.passwords.oldPassword"/>
|
||||
</md-input-container>
|
||||
<md-input-container class="md-block" flex="flex">
|
||||
<label><var:string label:value="New password"/>
|
||||
</label>
|
||||
<input type="password" sg-no-dirty-check="true" ng-model="app.passwords.newPassword"/>
|
||||
</md-input-container>
|
||||
<md-input-container class="md-block" flex="flex">
|
||||
<label><var:string label:value="Confirmation"/>
|
||||
</label>
|
||||
<input type="password" name="newPasswordConfirmation" sg-no-dirty-check="true" ng-model="app.passwords.newPasswordConfirmation"/>
|
||||
<div ng-messages="loginForm.newPasswordConfirmation.$error">
|
||||
<div ng-message="newPasswordMismatch"><var:string label:value="Passwords don't match"/></div>
|
||||
</div>
|
||||
</md-input-container>
|
||||
</div>
|
||||
<div layout="row" layout-align="end center">
|
||||
<md-button ng-click="app.changePassword()" type="button" ng-disabled="!app.canChangePassword(loginForm)">
|
||||
<var:string label:value="Change"/>
|
||||
</md-button>
|
||||
</div>
|
||||
<div layout="row" layout-align="end center">
|
||||
<md-button ng-click="app.changePassword()" type="button" ng-disabled="!app.canChangePassword(loginForm)">
|
||||
<var:string label:value="Change"/>
|
||||
</md-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Password policy: Grace period -->
|
||||
<div layout="row" layout-align="center center" layout-fill="layout-fill"
|
||||
|
||||
@@ -1175,7 +1175,12 @@
|
||||
ng-model="app.preferences.defaults.Vacation.daysBetweenResponse">
|
||||
<var:foreach list="daysBetweenResponsesList" item="item">
|
||||
<md-option var:value="item">
|
||||
<var:string value="item"/>
|
||||
<var:if condition="item" const:value="0">
|
||||
<i><var:string label:value="Always send vacation message response"/></i>
|
||||
</var:if>
|
||||
<var:if condition="item" const:value="0" const:negate="YES">
|
||||
<var:string value="item"/>
|
||||
</var:if>
|
||||
</md-option>
|
||||
</var:foreach>
|
||||
</md-select>
|
||||
@@ -1499,4 +1504,4 @@
|
||||
</script>
|
||||
|
||||
|
||||
</var:component>
|
||||
</var:component>
|
||||
@@ -120,6 +120,19 @@
|
||||
label:aria-label="Send Appointment Notifications">
|
||||
<var:string label:value="Send Appointment Notifications"/>
|
||||
</md-checkbox>
|
||||
<!-- create jitsi link-->
|
||||
<var:if condition="showJitsiLinkCreation">
|
||||
<div layout="row" ng-if="!editor.component.hasJitsiUrl()" layout-align="start center">
|
||||
<md-button class="md-icon-button" type="button" ng-click="editor.addJitsiUrl($event)">
|
||||
<md-icon>add_circle</md-icon>
|
||||
</md-button>
|
||||
<label class="button-label">
|
||||
<var:string label:value="Create Jitsi meeting"/>
|
||||
</label>
|
||||
</div>
|
||||
</var:if>
|
||||
|
||||
|
||||
<!-- attach urls -->
|
||||
<div ng-repeat="attach in editor.component.attachUrls">
|
||||
<div layout="row" layout-align="start center">
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
@charset "UTF-8";.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.sg-hide{opacity:0}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:100%;height:100%}}[flex-order]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="-20"]{-webkit-box-ordinal-group:-19;-webkit-order:-20;order:-20}[flex-order="-19"]{-webkit-box-ordinal-group:-18;-webkit-order:-19;order:-19}[flex-order="-18"]{-webkit-box-ordinal-group:-17;-webkit-order:-18;order:-18}[flex-order="-17"]{-webkit-box-ordinal-group:-16;-webkit-order:-17;order:-17}[flex-order="-16"]{-webkit-box-ordinal-group:-15;-webkit-order:-16;order:-16}[flex-order="-15"]{-webkit-box-ordinal-group:-14;-webkit-order:-15;order:-15}[flex-order="-14"]{-webkit-box-ordinal-group:-13;-webkit-order:-14;order:-14}[flex-order="-13"]{-webkit-box-ordinal-group:-12;-webkit-order:-13;order:-13}[flex-order="-12"]{-webkit-box-ordinal-group:-11;-webkit-order:-12;order:-12}[flex-order="-11"]{-webkit-box-ordinal-group:-10;-webkit-order:-11;order:-11}[flex-order="-10"]{-webkit-box-ordinal-group:-9;-webkit-order:-10;order:-10}[flex-order="-9"]{-webkit-box-ordinal-group:-8;-webkit-order:-9;order:-9}[flex-order="-8"]{-webkit-box-ordinal-group:-7;-webkit-order:-8;order:-8}[flex-order="-7"]{-webkit-box-ordinal-group:-6;-webkit-order:-7;order:-7}[flex-order="-6"]{-webkit-box-ordinal-group:-5;-webkit-order:-6;order:-6}[flex-order="-5"]{-webkit-box-ordinal-group:-4;-webkit-order:-5;order:-5}[flex-order="-4"]{-webkit-box-ordinal-group:-3;-webkit-order:-4;order:-4}[flex-order="-3"]{-webkit-box-ordinal-group:-2;-webkit-order:-3;order:-3}[flex-order="-2"]{-webkit-box-ordinal-group:-1;-webkit-order:-2;order:-2}[flex-order="-1"]{-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}[flex-order="0"]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="1"]{-webkit-box-ordinal-group:2;-webkit-order:1;order:1}[flex-order="2"]{-webkit-box-ordinal-group:3;-webkit-order:2;order:2}[flex-order="3"]{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}[flex-order="4"]{-webkit-box-ordinal-group:5;-webkit-order:4;order:4}[flex-order="5"]{-webkit-box-ordinal-group:6;-webkit-order:5;order:5}[flex-order="6"]{-webkit-box-ordinal-group:7;-webkit-order:6;order:6}[flex-order="7"]{-webkit-box-ordinal-group:8;-webkit-order:7;order:7}[flex-order="8"]{-webkit-box-ordinal-group:9;-webkit-order:8;order:8}[flex-order="9"]{-webkit-box-ordinal-group:10;-webkit-order:9;order:9}[flex-order="10"]{-webkit-box-ordinal-group:11;-webkit-order:10;order:10}[flex-order="11"]{-webkit-box-ordinal-group:12;-webkit-order:11;order:11}[flex-order="12"]{-webkit-box-ordinal-group:13;-webkit-order:12;order:12}[flex-order="13"]{-webkit-box-ordinal-group:14;-webkit-order:13;order:13}[flex-order="14"]{-webkit-box-ordinal-group:15;-webkit-order:14;order:14}[flex-order="15"]{-webkit-box-ordinal-group:16;-webkit-order:15;order:15}[flex-order="16"]{-webkit-box-ordinal-group:17;-webkit-order:16;order:16}[flex-order="17"]{-webkit-box-ordinal-group:18;-webkit-order:17;order:17}[flex-order="18"]{-webkit-box-ordinal-group:19;-webkit-order:18;order:18}[flex-order="19"]{-webkit-box-ordinal-group:20;-webkit-order:19;order:19}[flex-order="20"]{-webkit-box-ordinal-group:21;-webkit-order:20;order:20}[flex-offset="0"]{margin-left:0}[flex-offset="5"]{margin-left:5%}[flex-offset="10"]{margin-left:10%}[flex-offset="15"]{margin-left:15%}[flex-offset="20"]{margin-left:20%}[flex-offset="25"]{margin-left:25%}[flex-offset="30"]{margin-left:30%}[flex-offset="35"]{margin-left:35%}[flex-offset="40"]{margin-left:40%}[flex-offset="45"]{margin-left:45%}[flex-offset="50"]{margin-left:50%}[flex-offset="55"]{margin-left:55%}[flex-offset="60"]{margin-left:60%}[flex-offset="65"]{margin-left:65%}[flex-offset="70"]{margin-left:70%}[flex-offset="75"]{margin-left:75%}[flex-offset="80"]{margin-left:80%}[flex-offset="85"]{margin-left:85%}[flex-offset="90"]{margin-left:90%}[flex-offset="95"]{margin-left:95%}[flex-offset="33"]{margin-left:33.3333333333%}[flex-offset="66"]{margin-left:66.6666666667%}[layout-align="start stretch"],[layout-align]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch}[layout-align="start center"],[layout-align="start end"],[layout-align="start start"],[layout-align="start stretch"],[layout-align=start]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}[layout-align="center center"],[layout-align="center end"],[layout-align="center start"],[layout-align="center stretch"],[layout-align=center]{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}[layout-align="end center"],[layout-align="end end"],[layout-align="end start"],[layout-align="end stretch"],[layout-align=end]{-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}[layout-align="spacLine truncated
|
||||
@charset "UTF-8";.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}.sg-hide{opacity:0}@-moz-document url-prefix(){[layout-fill]{margin:0;width:100%;min-height:100%;height:100%}}[flex-order]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="-20"]{-webkit-box-ordinal-group:-19;-webkit-order:-20;order:-20}[flex-order="-19"]{-webkit-box-ordinal-group:-18;-webkit-order:-19;order:-19}[flex-order="-18"]{-webkit-box-ordinal-group:-17;-webkit-order:-18;order:-18}[flex-order="-17"]{-webkit-box-ordinal-group:-16;-webkit-order:-17;order:-17}[flex-order="-16"]{-webkit-box-ordinal-group:-15;-webkit-order:-16;order:-16}[flex-order="-15"]{-webkit-box-ordinal-group:-14;-webkit-order:-15;order:-15}[flex-order="-14"]{-webkit-box-ordinal-group:-13;-webkit-order:-14;order:-14}[flex-order="-13"]{-webkit-box-ordinal-group:-12;-webkit-order:-13;order:-13}[flex-order="-12"]{-webkit-box-ordinal-group:-11;-webkit-order:-12;order:-12}[flex-order="-11"]{-webkit-box-ordinal-group:-10;-webkit-order:-11;order:-11}[flex-order="-10"]{-webkit-box-ordinal-group:-9;-webkit-order:-10;order:-10}[flex-order="-9"]{-webkit-box-ordinal-group:-8;-webkit-order:-9;order:-9}[flex-order="-8"]{-webkit-box-ordinal-group:-7;-webkit-order:-8;order:-8}[flex-order="-7"]{-webkit-box-ordinal-group:-6;-webkit-order:-7;order:-7}[flex-order="-6"]{-webkit-box-ordinal-group:-5;-webkit-order:-6;order:-6}[flex-order="-5"]{-webkit-box-ordinal-group:-4;-webkit-order:-5;order:-5}[flex-order="-4"]{-webkit-box-ordinal-group:-3;-webkit-order:-4;order:-4}[flex-order="-3"]{-webkit-box-ordinal-group:-2;-webkit-order:-3;order:-3}[flex-order="-2"]{-webkit-box-ordinal-group:-1;-webkit-order:-2;order:-2}[flex-order="-1"]{-webkit-box-ordinal-group:0;-webkit-order:-1;order:-1}[flex-order="0"]{-webkit-box-ordinal-group:1;-webkit-order:0;order:0}[flex-order="1"]{-webkit-box-ordinal-group:2;-webkit-order:1;order:1}[flex-order="2"]{-webkit-box-ordinal-group:3;-webkit-order:2;order:2}[flex-order="3"]{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}[flex-order="4"]{-webkit-box-ordinal-group:5;-webkit-order:4;order:4}[flex-order="5"]{-webkit-box-ordinal-group:6;-webkit-order:5;order:5}[flex-order="6"]{-webkit-box-ordinal-group:7;-webkit-order:6;order:6}[flex-order="7"]{-webkit-box-ordinal-group:8;-webkit-order:7;order:7}[flex-order="8"]{-webkit-box-ordinal-group:9;-webkit-order:8;order:8}[flex-order="9"]{-webkit-box-ordinal-group:10;-webkit-order:9;order:9}[flex-order="10"]{-webkit-box-ordinal-group:11;-webkit-order:10;order:10}[flex-order="11"]{-webkit-box-ordinal-group:12;-webkit-order:11;order:11}[flex-order="12"]{-webkit-box-ordinal-group:13;-webkit-order:12;order:12}[flex-order="13"]{-webkit-box-ordinal-group:14;-webkit-order:13;order:13}[flex-order="14"]{-webkit-box-ordinal-group:15;-webkit-order:14;order:14}[flex-order="15"]{-webkit-box-ordinal-group:16;-webkit-order:15;order:15}[flex-order="16"]{-webkit-box-ordinal-group:17;-webkit-order:16;order:16}[flex-order="17"]{-webkit-box-ordinal-group:18;-webkit-order:17;order:17}[flex-order="18"]{-webkit-box-ordinal-group:19;-webkit-order:18;order:18}[flex-order="19"]{-webkit-box-ordinal-group:20;-webkit-order:19;order:19}[flex-order="20"]{-webkit-box-ordinal-group:21;-webkit-order:20;order:20}[flex-offset="0"]{margin-left:0}[flex-offset="5"]{margin-left:5%}[flex-offset="10"]{margin-left:10%}[flex-offset="15"]{margin-left:15%}[flex-offset="20"]{margin-left:20%}[flex-offset="25"]{margin-left:25%}[flex-offset="30"]{margin-left:30%}[flex-offset="35"]{margin-left:35%}[flex-offset="40"]{margin-left:40%}[flex-offset="45"]{margin-left:45%}[flex-offset="50"]{margin-left:50%}[flex-offset="55"]{margin-left:55%}[flex-offset="60"]{margin-left:60%}[flex-offset="65"]{margin-left:65%}[flex-offset="70"]{margin-left:70%}[flex-offset="75"]{margin-left:75%}[flex-offset="80"]{margin-left:80%}[flex-offset="85"]{margin-left:85%}[flex-offset="90"]{margin-left:90%}[flex-offset="95"]{margin-left:95%}[flex-offset="33"]{margin-left:33.3333333333%}[flex-offset="66"]{margin-left:66.6666666667%}[layout-align="start stretch"],[layout-align]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-box-align:stretch;-webkit-align-items:stretch;align-items:stretch}[layout-align="start center"],[layout-align="start end"],[layout-align="start start"],[layout-align="start stretch"],[layout-align=start]{-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}[layout-align="center center"],[layout-align="center end"],[layout-align="center start"],[layout-align="center stretch"],[layout-align=center]{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}[layout-align="end center"],[layout-align="end end"],[layout-align="end start"],[layout-align="end stretch"],[layout-align=end]{-webkit-box-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}[layout-align="spacLine truncated
|
||||
/*# sourceMappingURL=styles.css.map */
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"sources":["css/styles.css"],"names":[],"mappings":"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 truncated
|
||||
{"version":3,"sources":["css/styles.css"],"names":[],"mappings":"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 truncated
|
||||
@@ -1,2 +1,2 @@
|
||||
function l(){var n,e,t=arguments[0],o=t,r=arguments;for(labels[t]?o=labels[t]:clabels[t]&&(o=clabels[t]),n=1,e=0;n<r.length;n++,e++)o=o.replace("%{"+e+"}",r[n]);return o=(n=1)<r.length?o.replace(/%((%)|s|d)/g,function(e){var t=null;return e[2]?t=e[2]:(t=r[n],"%d"===e&&(t=parseFloat(t),isNaN(t))&&(t=0),n++),t}):o}function hexToRgb(e){e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null}function contrast(e){var t=1,e=hexToRgb(e);if(e){for(var n=[e.r/255,e.g/255,e.b/255],o=0;o<n.length;++o)n[o]=n[o]<=.03928?n[o]/12.92:Math.pow((n[o]+.055)/1.055,2.4);t=.2126*n[0]+.7152*n[1]+.0722*n[2]}return.179<t?"black":"white"}function guid(){function e(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return(e()+e()+"-"+e()+"-4"+e().substr(0,3)+"-"+e()+"-"+e()+e()+e()).toLowerCase()}!function(){"use strict";function e(e,t,n,o,r,i,s){e.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/),r.definePalette("sogo-green",{50:"eaf5e9",100:"cbe5c8",200:"aad6a5",300:"88c781",400:"66b86a",500:"56b04c",600:"4da143",700:"388e3c",800:"367d2e",900:"225e1b",A100:"fafafa",A200:"69f0ae",A400:"00e676",A700:"00c853",contrastDefaultColor:"dark",contrastLightColors:["300","400","500","600","700","800","900"]}),r.definePalette("sogo-blue",{50:"f0faf9",100:"e1f5f3",200:"ceebe8",300:"bfe0dd",400:"b2d6d3",500:"a1ccc8",600:"8ebfbb",700:"7db3b0",800:"639997",900:"4d8080",A100:"d4f7fa",A200:"c3f5fa",A400:"53e3f0",A700:"00b0c0",contrastDefaultColor:"light",contrastDarkColors:["50","100","200"]});e=r.extendPalette("grey",{1e3:"baa870"});r.definePalette("sogo-grey",e),r.theme("default").primaryPalette("sogo-blue",{default:"900","hue-1":"400","hue-2":"800","hue-3":"A700"}).accentPalette("sogo-green",{default:"500","hue-1":"A100","hue-2":"300","hue-3":"A700"}).backgroundPalette("sogo-grey"),r.registerStyles(["md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent,","md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent md-input-container[md-no-float] .md-input {"," background-color: '{{accent-hue-1}}';"," color: '{{foreground-1}}';","}","md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent md-icon {"," color: '{{foreground-1}}';"," fill: '{{foreground-1}}';","}"].join("")),r.registerStyles([".md-autocomplete-suggestions.md-3-line li p {"," color: '{{foreground-2}}';","}"].join("")),r.registerStyles([".sg-time-selection-indicator.sg-time-selected,",".sg-time-selection-indicator:hover.sg-time-selected,",".sg-time-selection-indicator.md-focus.sg-time-selected {"," background: '{{primary-500}}';","}",".sg-timepicker-open .sg-timepicker-icon {"," color: '{{primary-900}}';","}",".sg-timepicker-time,",".sg-timepicker-open .sg-timepicker-input-container {"," background: '{{background-hue-1}}';","}",".sg-timepicker-input-mask-opaque {"," box-shadow: 0 0 0 9999px '{{background-hue-1}}';","}"].join("")),r.registerStyles(["[ui-view=calendars] .hours {"," color: '{{primary-700}}';","}",".attendees .busy {"," background-color: '{{background-1000}}';","}",".attendees .event {"," background-color: '{{primary-300}}';","}"].join("")),r.registerStyles([".sg-message-thread {"," background-color: '{{primary-100}}';","}",".sg-message-thread-first {"," background-color: '{{primary-200}}';","}"].join("")),window.DebugEnabled||(t.debugEnabled(!1),n.debugInfoEnabled(!1),i.disableWarnings(),s.errorOnUnhandledRejections(!1),r.generateThemesOnDemand(!0)),o.interceptors.push("AuthInterceptor"),o.interceptors.push("ErrorInterceptor")}function a(t,e,n,o,r){var i=e.defer(),s=angular.element('<iframe class="ng-hide" src="'+t.UserFolderURL+'recover"></iframe>');return s.on("load",function(){var e=o.get("$state");2<r.config.attempt?(angular.element(t).off("beforeunload"),t.location.href=t.ApplicationBaseURL+e.href(e.current),i.reject()):n(function(){var e=o.get("$http");r.config.attempt?r.config.attempt++:r.config.attempt=1,e(r.config).then(function(e){i.resolve(e)},function(e){i.reject(e)}).finally(function(){n(s.remove,1e3)})},2e3)}),document.body.appendChild(s[0]),i.promise}function t(n,o,r,i){return{response:function(e){var t;return e&&/^application\/json/.test(e.config.headers.Accept)&&/^[\n\r\t ]*<!DOCTYPE html/.test(e.data)?n.usesCASAuthentication||n.usesSAML2Authentication?a(n,o,r,i,e):(t=i.get("$state"),angular.element(n).off("beforeunload"),t.href(t.current)?n.location.href=n.ApplicationBaseURL+t.href(t.current):n.location.href=n.ApplicationBaseURL,o.reject()):e}}}function n(n,o,r,i,s){return{responseError:function(e){var t;if(/^application\/json/.test(e.config.headers.Accept)){if((o.usesCASAuthentication||o.usesSAML2Authentication)&&(-1==e.status||500==e.status&&-1!==document.cookie.indexOf("cas-location")))return a(o,r,i,s,e);o.usesSAML2Authentication&&401==e.status&&!o.recovered?(t=s.get("$state"),angular.element(o).off("beforeunload"),o.recovered=!0,o.location.href=o.ApplicationBaseURL+t.href(t.current)):e.data&&e.data.quiet||n.$broadcast("http:Error",e)}return r.reject(e)}}}angular.Line truncated
|
||||
function l(){var n,e,t=arguments[0],o=t,i=arguments;for(labels[t]?o=labels[t]:clabels[t]&&(o=clabels[t]),n=1,e=0;n<i.length;n++,e++)o=o.replace("%{"+e+"}",i[n]);return o=(n=1)<i.length?o.replace(/%((%)|s|d)/g,function(e){var t=null;return e[2]?t=e[2]:(t=i[n],"%d"===e&&(t=parseFloat(t),isNaN(t))&&(t=0),n++),t}):o}function hexToRgb(e){e=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return e?{r:parseInt(e[1],16),g:parseInt(e[2],16),b:parseInt(e[3],16)}:null}function contrast(e){var t=1,e=hexToRgb(e);if(e){for(var n=[e.r/255,e.g/255,e.b/255],o=0;o<n.length;++o)n[o]=n[o]<=.03928?n[o]/12.92:Math.pow((n[o]+.055)/1.055,2.4);t=.2126*n[0]+.7152*n[1]+.0722*n[2]}return.179<t?"black":"white"}function guid(){function e(){return(65536*(1+Math.random())|0).toString(16).substring(1)}return(e()+e()+"-"+e()+"-4"+e().substr(0,3)+"-"+e()+"-"+e()+e()+e()).toLowerCase()}!function(){"use strict";function e(e,t,n,o,i,r,s){e.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/),i.definePalette("sogo-green",{50:"eaf5e9",100:"cbe5c8",200:"aad6a5",300:"88c781",400:"66b86a",500:"56b04c",600:"4da143",700:"388e3c",800:"367d2e",900:"225e1b",A100:"fafafa",A200:"69f0ae",A400:"00e676",A700:"00c853",contrastDefaultColor:"dark",contrastLightColors:["300","400","500","600","700","800","900"]}),i.definePalette("sogo-blue",{50:"f0faf9",100:"e1f5f3",200:"ceebe8",300:"bfe0dd",400:"b2d6d3",500:"a1ccc8",600:"8ebfbb",700:"7db3b0",800:"639997",900:"4d8080",A100:"d4f7fa",A200:"c3f5fa",A400:"53e3f0",A700:"00b0c0",contrastDefaultColor:"light",contrastDarkColors:["50","100","200"]});e=i.extendPalette("grey",{1e3:"baa870"});i.definePalette("sogo-grey",e),i.theme("default").primaryPalette("sogo-blue",{default:"900","hue-1":"400","hue-2":"800","hue-3":"A700"}).accentPalette("sogo-green",{default:"500","hue-1":"A100","hue-2":"300","hue-3":"A700"}).backgroundPalette("sogo-grey"),i.registerStyles(["md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent,","md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent md-input-container[md-no-float] .md-input {"," background-color: '{{accent-hue-1}}';"," color: '{{foreground-1}}';","}","md-toolbar.md-hue-1:not(.md-menu-toolbar).md-accent md-icon {"," color: '{{foreground-1}}';"," fill: '{{foreground-1}}';","}"].join("")),i.registerStyles([".md-autocomplete-suggestions.md-3-line li p {"," color: '{{foreground-2}}';","}"].join("")),i.registerStyles([".sg-time-selection-indicator.sg-time-selected,",".sg-time-selection-indicator:hover.sg-time-selected,",".sg-time-selection-indicator.md-focus.sg-time-selected {"," background: '{{primary-500}}';","}",".sg-timepicker-open .sg-timepicker-icon {"," color: '{{primary-900}}';","}",".sg-timepicker-time,",".sg-timepicker-open .sg-timepicker-input-container {"," background: '{{background-hue-1}}';","}",".sg-timepicker-input-mask-opaque {"," box-shadow: 0 0 0 9999px '{{background-hue-1}}';","}"].join("")),i.registerStyles(["[ui-view=calendars] .hours {"," color: '{{primary-700}}';","}",".attendees .busy {"," background-color: '{{background-1000}}';","}",".attendees .event {"," background-color: '{{primary-300}}';","}"].join("")),i.registerStyles([".sg-message-thread {"," background-color: '{{primary-100}}';","}",".sg-message-thread-first {"," background-color: '{{primary-200}}';","}"].join("")),window.DebugEnabled||(t.debugEnabled(!1),n.debugInfoEnabled(!1),r.disableWarnings(),s.errorOnUnhandledRejections(!1),i.generateThemesOnDemand(!0)),o.interceptors.push("AuthInterceptor"),o.interceptors.push("ErrorInterceptor")}function a(t,e,n,o,i){var r=e.defer(),s=angular.element('<iframe class="ng-hide" src="'+t.UserFolderURL+'recover"></iframe>');return s.on("load",function(){var e=o.get("$state");2<i.config.attempt?(angular.element(t).off("beforeunload"),t.location.href=t.ApplicationBaseURL+e.href(e.current),r.reject()):n(function(){var e=o.get("$http");i.config.attempt?i.config.attempt++:i.config.attempt=1,e(i.config).then(function(e){r.resolve(e)},function(e){r.reject(e)}).finally(function(){n(s.remove,1e3)})},2e3)}),document.body.appendChild(s[0]),r.promise}function t(n,o,i,r){return{response:function(e){var t;return e&&/^application\/json/.test(e.config.headers.Accept)&&/^[\n\r\t ]*<!DOCTYPE html/.test(e.data)?n.usesCASAuthentication||n.usesSAML2Authentication?a(n,o,i,r,e):(t=r.get("$state"),angular.element(n).off("beforeunload"),t.href(t.current)?n.location.href=n.ApplicationBaseURL+t.href(t.current):n.location.href=n.ApplicationBaseURL,o.reject()):e}}}function n(n,o,i,r,s){return{responseError:function(e){var t;if(/^application\/json/.test(e.config.headers.Accept)){if((o.usesCASAuthentication||o.usesSAML2Authentication)&&(-1==e.status||500==e.status&&-1!==document.cookie.indexOf("cas-location")))return a(o,i,r,s,e);o.usesSAML2Authentication&&401==e.status&&!o.recovered?(t=s.get("$state"),angular.element(o).off("beforeunload"),o.recovered=!0,o.location.href=o.ApplicationBaseURL+t.href(t.current)):e.data&&e.data.quiet||n.$broadcast("http:Error",e)}return i.reject(e)}}}angular.Line truncated
|
||||
//# sourceMappingURL=Common.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"Common.js","sources":["Common/utils.js","Common/Common.app.js","Common/mdColors.app.js","Common/cssescape.filter.js","Common/decodeUri.filter.js","Common/encodeUri.filter.js","Common/ensureTarget.filter.js","Common/loc.filter.js","Common/range.filter.js","Common/txt2html.filter.js","Common/AclController.js","Common/navController.js","Common/Acl.service.js","Common/Authentication.service.js","Common/Dialog.service.js","Common/Gravatar.service.js","Common/Resource.service.js","Common/sgFocus.service.js","Common/sgHotkeys.service.js","Common/sgRippleClick.service.js","Common/User.service.js","Common/sgAutogrow.directive.js","Common/sgAvatarImage.directive.js","Common/sgBlockToggle.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgDatepickerReadonlyInput.directive.js","Common/sgDraggable.directive.js","Common/sgDroppable.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgLabels.directive.js","Common/sgNoDirtyCheck.directive.js","Common/sgPlaceholder.directive.js","Common/sgQrCode.directive.js","Common/sgResetOnDisabled.directive.js","Common/sgRippleClick.directive.js","Common/sgSearch.directive.js","Common/sgSelectOnly.directive.js","Common/sgSubscribe.directive.js","Common/sgTimepicker.directive.js","Common/sgToggleGrid.directive.js"],"names":["l","i","j","key","arguments","value","args","labels","clabels","length","replace","m","val","parseFloat","isNaN","hexToRgb","hex","result","exec","r","parseInt","g","b","contrast","color","c","Math","pow","guid","S4","random","toString","substring","substr","toLowerCase","configure","$animateProvider","$logProvider","$compileProvider","$httpProvider","$mdThemingProvider","$mdAriaProvider","$qProvider","classNameFilter","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastLightColors","contrastDarkColors","greyMap","extendPalette","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","backgroundPalette","registerStyles","join","window","DebugEnabled","debugEnabled","debugInfoEnabled","disableWarnings","errorOnUnhandledRejections","generateThemesOnDemand","interceptors","push","renewTicket","$window","$q","$timeout","$injector","response","deferred","defer","iframe","angular","element","UserFolderURL","on","$state","get","config","attempt","off","location","href","ApplicationBaseURL","current","reject","$http","then","resolve","finally","remove","document","body","appendChild","promise","AuthInterceptor","test","headers","Accept","data","usesCASAuthentication","usesSAML2Authentication","ErrorInterceptor","$rootScope","responseError","rejection","status","cookie","indexOf","recovered","quiet","$broadcast","module","isPopup","classList","contains","baseURL","resourcesURL","ResourcesURL","activeUser","param","settings","login","UserLogin","identification","UserIdentification","email","UserEmail","language","UserLanguage","folderURL","isSuperUser","IsSuperUser","path","calendar","UserCalendarPath","contacts","UserContactsPath","mail","UserMailPath","preferences","UserPreferencesPath","administration","UserAdministrationPath","help","HelpURL","logoff","UserLogoffPath","minimumSearchLength","isNumber","constant","selection","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","print","toastPosition","factory","$inject","_$mdThemingProvider","runBlock","$interpolate","$document","$log","buildCssSelectors","selectors","fgDefault","bgDefault","bdrDefault","fgDefaultHue","bgDefaultHue","fgColor","bgColor","bdrColor","fgHue","bgHue","customSheet","style","head","querySelector","createElement","title","createTextNode","sheet","index","cssRules","deleteRule","addRule","fgInterpolate","bgInterpolate","themeName","paletteName","colorArray","hueName","context","palette","hue","insertRule","addBorderRule","bdrInterpolate","colorValue","forEach","_THEMES","_PALETTES","colors","primary","name","hues","run","cssEscape","CSS","escape","filter","decodeUri","decodeURIComponent","encodeUri","encodeURIComponent","ensureTarget","$sce","tree","find","attr","trustAs","html","n","res","txt2html","linkyFilter","text","String","rel","undefined","AclController","$mdDialog","Dialog","usersWithACL","User","folder","vm","this","selectUser","user","$event","target","parentNode","selectedUid","uid","selectedUser","inactive","$rights","users","userToAdd","searchText","folderClassName","isFunction","getClassName","templateName","getElementById","$isAnonymous","userFilter","$query","$filter","$acl","dry","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","alert","confirmChange","confirmation","$confirmRights","showing","message","removeUser","$removeUser","addUser","$addUser","toggleAllRights","$toggleAllRights","hasNoRight","$hasNoRight","showRights","controller","navController",Line truncated
|
||||
{"version":3,"file":"Common.js","sources":["Common/utils.js","Common/Common.app.js","Common/mdColors.app.js","Common/cssescape.filter.js","Common/decodeUri.filter.js","Common/encodeUri.filter.js","Common/ensureTarget.filter.js","Common/loc.filter.js","Common/range.filter.js","Common/txt2html.filter.js","Common/AclController.js","Common/navController.js","Common/Acl.service.js","Common/Authentication.service.js","Common/Dialog.service.js","Common/Gravatar.service.js","Common/Resource.service.js","Common/sgFocus.service.js","Common/sgHotkeys.service.js","Common/sgRippleClick.service.js","Common/User.service.js","Common/sgAutogrow.directive.js","Common/sgAvatarImage.directive.js","Common/sgBlockToggle.directive.js","Common/sgCheckmark.directive.js","Common/sgColorPicker.directive.js","Common/sgCompile.directive.js","Common/sgDatepickerReadonlyInput.directive.js","Common/sgDraggable.directive.js","Common/sgDroppable.directive.js","Common/sgEnter.directive.js","Common/sgEscape.directive.js","Common/sgFocus.directive.js","Common/sgFolderStylesheet.directive.js","Common/sgLabels.directive.js","Common/sgNoDirtyCheck.directive.js","Common/sgPlaceholder.directive.js","Common/sgQrCode.directive.js","Common/sgResetOnDisabled.directive.js","Common/sgRippleClick.directive.js","Common/sgSearch.directive.js","Common/sgSelectOnly.directive.js","Common/sgSubscribe.directive.js","Common/sgTimepicker.directive.js","Common/sgToggleGrid.directive.js"],"names":["l","i","j","key","arguments","value","args","labels","clabels","length","replace","m","val","parseFloat","isNaN","hexToRgb","hex","result","exec","r","parseInt","g","b","contrast","color","c","Math","pow","guid","S4","random","toString","substring","substr","toLowerCase","configure","$animateProvider","$logProvider","$compileProvider","$httpProvider","$mdThemingProvider","$mdAriaProvider","$qProvider","classNameFilter","definePalette","50","100","200","300","400","500","600","700","800","900","A100","A200","A400","A700","contrastDefaultColor","contrastLightColors","contrastDarkColors","greyMap","extendPalette","1000","theme","primaryPalette","default","hue-1","hue-2","hue-3","accentPalette","backgroundPalette","registerStyles","join","window","DebugEnabled","debugEnabled","debugInfoEnabled","disableWarnings","errorOnUnhandledRejections","generateThemesOnDemand","interceptors","push","renewTicket","$window","$q","$timeout","$injector","response","deferred","defer","iframe","angular","element","UserFolderURL","on","$state","get","config","attempt","off","location","href","ApplicationBaseURL","current","reject","$http","then","resolve","finally","remove","document","body","appendChild","promise","AuthInterceptor","test","headers","Accept","data","usesCASAuthentication","usesSAML2Authentication","ErrorInterceptor","$rootScope","responseError","rejection","status","cookie","indexOf","recovered","quiet","$broadcast","module","isPopup","classList","contains","baseURL","resourcesURL","ResourcesURL","activeUser","param","settings","login","UserLogin","identification","UserIdentification","email","UserEmail","language","UserLanguage","folderURL","isSuperUser","IsSuperUser","path","calendar","UserCalendarPath","contacts","UserContactsPath","mail","UserMailPath","preferences","UserPreferencesPath","administration","UserAdministrationPath","help","HelpURL","logoff","UserLogoffPath","minimumSearchLength","isNumber","constant","selection","xs","gt-xs","sm","gt-sm","md","gt-md","lg","gt-lg","xl","print","toastPosition","factory","$inject","_$mdThemingProvider","runBlock","$interpolate","$document","$log","buildCssSelectors","selectors","fgDefault","bgDefault","bdrDefault","fgDefaultHue","bgDefaultHue","fgColor","bgColor","bdrColor","fgHue","bgHue","customSheet","style","head","querySelector","createElement","title","createTextNode","sheet","index","cssRules","deleteRule","addRule","fgInterpolate","bgInterpolate","themeName","paletteName","colorArray","hueName","context","palette","hue","insertRule","addBorderRule","bdrInterpolate","colorValue","forEach","_THEMES","_PALETTES","colors","primary","name","hues","run","cssEscape","CSS","escape","filter","decodeUri","decodeURIComponent","encodeUri","encodeURIComponent","ensureTarget","$sce","tree","find","attr","trustAs","html","n","res","txt2html","linkyFilter","text","String","rel","undefined","AclController","$mdDialog","Dialog","usersWithACL","User","folder","vm","this","selectUser","user","$event","target","parentNode","selectedUid","uid","selectedUser","inactive","$rights","users","userToAdd","searchText","folderClassName","isFunction","getClassName","templateName","getElementById","$isAnonymous","userFilter","$query","$filter","$acl","dry","closeModal","$resetUsersRights","hide","saveModal","$saveUsersRights","alert","confirmChange","confirmation","$confirmRights","showing","message","removeUser","$removeUser","addUser","$addUser","toggleAllRights","$toggleAllRights","hasNoRight","$hasNoRight","showRights","controller","navController",Line truncated
|
||||
@@ -149,12 +149,20 @@
|
||||
perr == passwordPolicyConfig.PolicyChangeAfterReset) {
|
||||
response = {
|
||||
passwordexpired: 1,
|
||||
userPolicies: data.additionalInfos.userPolicies,
|
||||
url: redirectUrl(username, domain)
|
||||
};
|
||||
}
|
||||
else if (perr == passwordPolicyConfig.PolicyChangeAfterReset) {
|
||||
response = {
|
||||
passwordexpired: 1,
|
||||
userPolicies: data.additionalInfos.userPolicies,
|
||||
url: redirectUrl(username, domain)
|
||||
};
|
||||
} else if (perr == passwordPolicyConfig.PolicyInsufficientPasswordQuality) {
|
||||
response = {
|
||||
passwordexpired: 2,
|
||||
userPolicies: data.additionalInfos.userPolicies,
|
||||
url: redirectUrl(username, domain)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -230,6 +230,7 @@
|
||||
};
|
||||
|
||||
config = vm.config ? angular.merge(sgCkeditorConfig.config, vm.config) : sgCkeditorConfig.config;
|
||||
config.licenseKey = "GPL";
|
||||
|
||||
if (!config.toolbar) {
|
||||
config.toolbar = {
|
||||
@@ -257,6 +258,27 @@
|
||||
}
|
||||
]
|
||||
};
|
||||
config.fontFamily = {
|
||||
supportAllValues: true,
|
||||
style: {
|
||||
element: 'span',
|
||||
attributes: {
|
||||
style: 'font-family'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
config.fontSize = {
|
||||
options: ['10px', '12px', '14px', '16px', '18px', '20px', '24px'],
|
||||
supportAllValues: true,
|
||||
style: {
|
||||
element: 'span',
|
||||
attributes: {
|
||||
style: 'font-size'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
config.htmlEmbed = {
|
||||
showPreviews: true
|
||||
};
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
!function(){"use strict";function c(e){var t=this;"function"!=typeof e.then&&(angular.extend(this,e),_.forEach(this.identities,function(e){var t;e.fullName&&e.email?e.full=e.fullName+" <"+e.email+">":e.email?e.full="<"+e.email+">":e.full="",e.signature&&(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim())}),this.$mailboxes)&&c.$Mailbox.$unwrapCollection(this,c.$q.when({mailboxes:this.$mailboxes})).then(function(e){t.$mailboxes=e})}c.$factory=["$q","$timeout","$log","sgSettings","Resource","Preferences","Mailbox","Message",function(e,t,s,n,i,a,o,r){return angular.extend(c,{$q:e,$timeout:t,$log:s,$$resource:new i(n.activeUser("folderURL")+"Mail",n.activeUser()),$Preferences:a,$Mailbox:o,$Message:r}),c}];try{angular.module("SOGo.MailerUI")}catch(e){angular.module("SOGo.MailerUI",["SOGo.Common"])}angular.module("SOGo.MailerUI").factory("Account",c.$factory),c.$findAll=function(e){return e?c.$unwrapCollection(e):c.$accounts?c.$q.when(c.$accounts):c.$$resource.fetch("","mailAccounts").then(function(e){return c.$unwrapCollection(e)})},c.$unwrapCollection=function(e){var s=[];return angular.forEach(e,function(e,t){e.id=t,s[t]=new c(e)}),c.$accounts=s},c.refreshUnseenCount=function(e){var t,s=1===c.$Preferences.defaults.SOGoMailFetchAllUnseenCountFolders,n=c.$Preferences.defaults.SOGoRefreshViewCheck;if(s)t=[];else{if(!e)throw Error("SOGoMailFetchAllUnseenCountFolders is disabled and no folders list provided");t=e}_.forEach(c.$accounts,function(e){s?_.forEach(e.$$flattenMailboxes,function(e){t.push(e.id)}):(_.includes(t,e.id+"/folderINBOX")||t.push(e.id+"/folderINBOX"),_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(e.unseenCount)&&!_.includes(t,e.id)&&t.push(e.id)}))}),c.$$resource.post("","unseenCount",{mailboxes:t}).then(function(t){_.forEach(c.$accounts,function(e){_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(t[e.id])&&(e.unseenCount=t[e.id])})})}),n&&"manually"!=n&&(c.$refreshUnseenCount&&c.$timeout.cancel(c.$refreshUnseenCount),c.$refreshUnseenCount=c.$timeout(angular.bind(this,c.refreshUnseenCount,e),1e3*n.timeInterval()))},c.prototype.getLength=function(){return this.$expanded?this.$flattenMailboxes().length:0},c.prototype.getItemAtIndex=function(e){var t=this.$flattenMailboxes();return 0<=e&&e<t.length?t[e]:null},c.prototype.$getMailboxes=function(e){var a=this,t=e&&e.reload;return this.$mailboxes&&!t?c.$q.when(this.$mailboxes):(!t&&this.$futureMailboxesData||(this.$futureMailboxesData=c.$Mailbox.$find(this,e).then(function(e){function s(e){_.forEach(e,function(e){var t=_.find(n,["id",e.id]);t&&(e.unseenCount=t.unseenCount),e.children&&0<e.children.length&&s(e.children)})}var n=a.$flattenMailboxes({all:!0});a.$mailboxes=e,a.$expanded=!1;s(a.$mailboxes);function t(e){_.forEach(e,function(e){e.$expanded=0<=i.indexOf("/"+e.id),e.children&&0<e.children.length&&t(e.children)})}var i;if(c.$Preferences.settings.Mail.ExpandedFolders){if(angular.isString(c.$Preferences.settings.Mail.ExpandedFolders))try{i=angular.fromJson(c.$Preferences.settings.Mail.ExpandedFolders)}catch(e){c.$log.warn("Can't parse list of expanded folders. String was: "+c.$Preferences.settings.Mail.ExpandedFolders),i=[]}else i=c.$Preferences.settings.Mail.ExpandedFolders;a.$expanded=0<=i.indexOf("/"+a.id),0<i.length&&t(a.$mailboxes)}return c.$accounts&&(a.$expanded|=1==c.$accounts.length),a.$flattenMailboxes({reload:!0}),a.$mailboxes})),this.$futureMailboxesData)},c.prototype.$flattenMailboxes=function(t){function s(e){_.forEach(e,function(e){n.push(e),(t&&t.all||e.$expanded)&&e.children&&0<e.children.length&&s(e.children)})}var n=[],i=[];return!this.$$flattenMailboxes||t&&(t.reload||t.all)?(s(this.$mailboxes),t&&t.all||(this.$$flattenMailboxes=n,t&&t.saveState&&(_.forEach(c.$accounts,function(e){e.$expanded&&i.push("/"+e.id),_.reduce(e.$$flattenMailboxes,function(e,t){return t.$expanded&&e.push("/"+t.id),e},i)}),c.$$resource.post(null,"saveFoldersState",i)))):n=this.$$flattenMailboxes,n},c.prototype.$getMailboxByType=function(s){function n(e){var t=_.find(e,function(e){return e.type==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}return n(this.$mailboxes)},c.prototype.$getMailboxByPath=function(s){function n(e){var t=_.find(e,function(e){return e.path==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}var e;if(null==(e=n(this.$mailboxes)))throw Error("No mailbox found matching path "+s);return e},c.prototype.$newMailbox=function(e,t){var s=this;return c.$$resource.post(e.toString(),"createFolder",{name:t}).then(function(){s.$getMailboxes({reload:!0})})},c.prototype.getTextSignature=function(e){var t;return e.signature?(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim()):e.textSignature="",e.textSignature},c.prototype.$hasCertificate=function(){return this.security&&this.security.hasCLine truncated
|
||||
!function(){"use strict";function c(e){var t=this;"function"!=typeof e.then&&(angular.extend(this,e),_.forEach(this.identities,function(e){var t;e.fullName&&e.email?e.full=e.fullName+" <"+e.email+">":e.email?e.full="<"+e.email+">":e.full="",e.signature&&(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim())}),this.$mailboxes)&&c.$Mailbox.$unwrapCollection(this,c.$q.when({mailboxes:this.$mailboxes})).then(function(e){t.$mailboxes=e})}c.$factory=["$q","$timeout","$log","sgSettings","Resource","Preferences","Mailbox","Message",function(e,t,s,n,i,a,o,r){return angular.extend(c,{$q:e,$timeout:t,$log:s,$$resource:new i(n.activeUser("folderURL")+"Mail",n.activeUser()),$Preferences:a,$Mailbox:o,$Message:r}),c}];try{angular.module("SOGo.MailerUI")}catch(e){angular.module("SOGo.MailerUI",["SOGo.Common"])}angular.module("SOGo.MailerUI").factory("Account",c.$factory),c.$findAll=function(e){return e?c.$unwrapCollection(e):c.$accounts?c.$q.when(c.$accounts):c.$$resource.fetch("","mailAccounts").then(function(e){return c.$unwrapCollection(e)})},c.$unwrapCollection=function(e){var s=[];return angular.forEach(e,function(e,t){e.id=t,s[t]=new c(e)}),c.$accounts=s},c.refreshUnseenCount=function(e){var t,s=1===c.$Preferences.defaults.SOGoMailFetchAllUnseenCountFolders,n=c.$Preferences.defaults.SOGoRefreshViewCheck;if(s)t=[];else{if(!e)throw Error("SOGoMailFetchAllUnseenCountFolders is disabled and no folders list provided");t=e}_.forEach(c.$accounts,function(e){s?_.forEach(e.$$flattenMailboxes,function(e){t.push(e.id)}):(_.includes(t,e.id+"/folderINBOX")||t.push(e.id+"/folderINBOX"),_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(e.unseenCount)&&!_.includes(t,e.id)&&t.push(e.id)}))}),c.$$resource.post("","unseenCount",{mailboxes:t}).then(function(t){_.forEach(c.$accounts,function(e){_.forEach(e.$$flattenMailboxes,function(e){angular.isDefined(t[e.id])&&(e.unseenCount=t[e.id])})})}),n&&"manually"!=n&&(c.$refreshUnseenCount&&c.$timeout.cancel(c.$refreshUnseenCount),c.$refreshUnseenCount=c.$timeout(angular.bind(this,c.refreshUnseenCount,e),1e3*n.timeInterval()))},c.prototype.getLength=function(){return this.$expanded?this.$flattenMailboxes().length:0},c.prototype.getItemAtIndex=function(e){var t=this.$flattenMailboxes();return 0<=e&&e<t.length?t[e]:null},c.prototype.$getMailboxes=function(e){var a=this,t=e&&e.reload;return this.$mailboxes&&!t?c.$q.when(this.$mailboxes):(!t&&this.$futureMailboxesData||(this.$futureMailboxesData=c.$Mailbox.$find(this,e).then(function(e){function s(e){_.forEach(e,function(e){var t=_.find(n,["id",e.id]);t&&(e.unseenCount=t.unseenCount),e.children&&0<e.children.length&&s(e.children)})}var n=a.$flattenMailboxes({all:!0});a.$mailboxes=e,a.$expanded=!1;s(a.$mailboxes);function t(e){_.forEach(e,function(e){e.$expanded=0<=i.indexOf("/"+e.id),e.children&&0<e.children.length&&t(e.children)})}var i;if(c.$Preferences.settings.Mail.ExpandedFolders){if(angular.isString(c.$Preferences.settings.Mail.ExpandedFolders))try{i=angular.fromJson(c.$Preferences.settings.Mail.ExpandedFolders)}catch(e){c.$log.warn("Can't parse list of expanded folders. String was: "+c.$Preferences.settings.Mail.ExpandedFolders),i=[]}else i=c.$Preferences.settings.Mail.ExpandedFolders;a.$expanded=0<=i.indexOf("/"+a.id),0<i.length&&t(a.$mailboxes)}return c.$accounts&&(a.$expanded|=1==c.$accounts.length),a.$flattenMailboxes({reload:!0}),a.$mailboxes})),this.$futureMailboxesData)},c.prototype.$flattenMailboxes=function(t){function s(e){_.forEach(e,function(e){n.push(e),(t&&t.all||e.$expanded)&&e.children&&0<e.children.length&&s(e.children)})}var n=[],i=[];return!this.$$flattenMailboxes||t&&(t.reload||t.all)?(s(this.$mailboxes),t&&t.all||(this.$$flattenMailboxes=n,t&&t.saveState&&(_.forEach(c.$accounts,function(e){e.$expanded&&i.push("/"+e.id),_.reduce(e.$$flattenMailboxes,function(e,t){return t.$expanded&&e.push("/"+t.id),e},i)}),c.$$resource.post(null,"saveFoldersState",i)))):n=this.$$flattenMailboxes,n},c.prototype.$getMailboxByType=function(s){function n(e){var t=_.find(e,function(e){return e.type==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}return n(this.$mailboxes)},c.prototype.$getMailboxByPath=function(s){function n(e){var t=_.find(e,function(e){return e.path==s});return t||angular.forEach(e,function(e){!t&&e.children&&0<e.children.length&&(t=n(e.children))}),t}var e;if(null==(e=n(this.$mailboxes)))throw Error("No mailbox found matching path "+s);return e},c.prototype.$newMailbox=function(e,t){var s=this;return c.$$resource.post(e.toString(),"createFolder",{name:t}).then(function(){s.$getMailboxes({reload:!0})})},c.prototype.getTextSignature=function(e){var t;return e.signature?(t=angular.element("<div>"+e.signature+"</div>"),e.textSignature=_.map(t.contents(),"textContent").join(" ").trim()):e.textSignature="",e.textSignature},c.prototype.$hasCertificate=function(){return this.security&&this.security.hasCLine truncated
|
||||
//# sourceMappingURL=Mailer.services.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","$rootScope","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","$searchMode","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$highlightWords","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","setSearchMode","searchMode","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchBy","searchInput","word","cleanedWord","toLowerCase","match","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","Object","assign","childrenArray","collapsedThread","msg","first","collapsed","$broadcast","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","jLine truncated
|
||||
{"version":3,"file":"Mailer.services.js","sources":["Mailer/Account.service.js","Mailer/Mailbox.service.js","Mailer/Message.service.js","Mailer/sgImageGallery.service.js","Mailer/VirtualMailbox.service.js","Mailer/MailboxController.js","Mailer/MailboxesController.js","Mailer/MessageController.js","Mailer/MessageEditorController.js","Mailer/sgAccountSection.directive.js","Mailer/sgIMIP.directive.js","Mailer/sgMailboxListItem.directive.js","Mailer/sgMessageListItem.directive.js","Mailer/sgMessageListItemMain.directive.js","Mailer/sgZoomableImage.directive.js"],"names":["Account","futureAccountData","_this","this","then","angular","extend","_","forEach","identities","identity","element","fullName","email","full","signature","textSignature","map","contents","join","trim","$mailboxes","$Mailbox","$unwrapCollection","$q","when","mailboxes","collection","$factory","$timeout","$log","Settings","Resource","Preferences","Mailbox","Message","$$resource","activeUser","$Preferences","$Message","module","e","factory","$findAll","data","$accounts","fetch","o","i","id","refreshUnseenCount","folders","unseenCountFolders","fetchAllUnseenCountFolders","defaults","SOGoMailFetchAllUnseenCountFolders","refreshViewCheck","SOGoRefreshViewCheck","Error","account","$$flattenMailboxes","mailbox","push","includes","isDefined","unseenCount","post","$refreshUnseenCount","cancel","bind","timeInterval","prototype","getLength","$expanded","$flattenMailboxes","length","getItemAtIndex","index","expandedMailboxes","$getMailboxes","options","reload","$futureMailboxesData","$find","_visitForUnseencount","previousMailbox","find","previousMailboxes","children","all","_visitForExpanded","expandedFolders","indexOf","settings","Mail","ExpandedFolders","isString","fromJson","warn","_visit","allMailboxes","saveState","reduce","$getMailboxByType","type","_find","$getMailboxByPath","path","$newMailbox","name","toString","getTextSignature","$hasCertificate","security","hasCertificate","$certificate","$$certificate","reject","$removeCertificate","updateQuota","percent","description","maxQuota","Math","round","usedSpace","l","formatted","maxMessages","messagesCount","$quota","$newMessage","debug","JSON","stringify","undefined","accountId","mailboxPath","message","$absolutePath","asDraft","accountDefaults","AuxiliaryMailAccounts","alwaysSign","sign","alwaysEncrypt","encrypt","editable","isNew","mailto","isObject","$parseMailto","$addDelegate","user","deferred","defer","param","uid","delegates","resolve","users","status","promise","$removeDelegate","splice","$omit","deep","defaultIdentity","value","key","copy","isReadOnly","pick","isDefault","forceDefaultIdentity","futureMailboxData","$account","init","newMailboxData","create","$unwrap","$rootScope","Acl","PRELOAD","BATCH_DELETE_LIMIT","$$Acl","$query","sort","asc","selectedFolder","$refreshTimeout","$virtualMode","$virtualPath","$searchMode","SortingState","parseInt","constant","LOOKAHEAD","SIZE","createMailboxes","level","isSentFolder","isDraftsFolder","quotas","split","component","asCSSIdentifier","isUndefined","uidsMap","headers","$isLoading","$messages","$visibleMessages","$selectedMessages","$highlightWords","$id","$acl","threaded","$collapsedThreads","threadsCollapsed","$displayName","$isEditable","isEditable","$isSpecial","$icon","$isNoInferiors","isNoInferiors","$shadowData","selectFolder","setSearchMode","searchMode","$lastVisibleIndex","max","$loadMessage","selectedMessages","updateCache","filter","selected","selectedCount","$unselectMessages","isSelectedMessage","messageId","$selectedMessage","selectedMessage","$selectedMessageIndex","hasSelectedMessage","$filter","sortingAttributes","filters","action","labels","searchBy","searchInput","word","cleanedWord","toLowerCase","match","secondFilter","$flaggedOnly","$unseenOnly","$syncToken","syncToken","unseenOnly","flaggedOnly","keys","$filteredLabels","k","f","endIndex","uids","startIndex","loaded","subject","min","loading","futureHeadersData","$unwrapHeaders","flags","isNoSelect","isWritable","getClassName","base","$rename","findParent","parent","parentMailbox","$save","_updateChildren","child","replace","pathRE","oldPath","sibling","localeCompare","RegExp","$compact","$canFolderAs","$setFolderAs","$empty","capitalize","substring","$markAsRead","isread","getLabels","$labels","filteredByLabel","$flagMessages","messages","operation","msgUIDs","forwardMessages","saveSelectedMessages","selectedUIDs","download","exportFolder","filename","open","$delete","$_deleteMessages","firstIndex","forEachRight","selectedIndex","findIndex","updateVisibleMessages","$deleteMessages","batchSize","_deleteMessages","start","end","currentUids","slice","$markOrUnMarkMessagesAsJunk","method","$copyMessages","folder","$moveMessages","$move","parentPath","finally","save","response","error","$reset","Object","assign","childrenArray","collapsedThread","msg","first","collapsed","$broadcast","$futureMailboxData","headersFields","msgObject","hasNewMessages","$topIndex","deleted","jLine truncated
|
||||
@@ -405,6 +405,7 @@
|
||||
this.$highlightWords = [];
|
||||
filters.forEach(filter => {
|
||||
if ("subject_or_from" == filter.searchBy
|
||||
|| "subject_or_to" == filter.searchBy
|
||||
|| "contains" == filter.searchBy
|
||||
|| "body" == filter.searchBy
|
||||
|| "from" == filter.searchBy
|
||||
@@ -1043,6 +1044,7 @@
|
||||
this.account = account;
|
||||
if (options && options.unseenCount) {
|
||||
this.unseenCount = options.unseenCount;
|
||||
delete options["unseenCount"];
|
||||
}
|
||||
if (options && options.filter) {
|
||||
this.$messages = [];
|
||||
@@ -1312,4 +1314,21 @@
|
||||
Mailbox.prototype.getHighlightWords = function () {
|
||||
return this.$highlightWords;
|
||||
};
|
||||
|
||||
/**
|
||||
* @function cleanMailbox
|
||||
* @memberof Mailbox.prototype
|
||||
* @desc Cleans up the mailbox by applying the specified parameters.
|
||||
* This can include operations such as moving emails to trash,
|
||||
* filtering emails based on a duration, and applying actions to subfolders.
|
||||
* @param {Object} parameters - An object containing the parameters for cleaning the mailbox.
|
||||
* @param {boolean} [parameters.applyToSubfolders=false] - Whether to apply the cleaning operation to subfolders.
|
||||
* @param {boolean} [parameters.moveToTrash=false] - Whether to move the emails to the trash folder.
|
||||
* @param {string|null} [parameters.filterDuration=null] - A duration filter (e.g., "3m", "6m") to select emails older than the specified duration.
|
||||
* @returns {Promise} A promise that resolves when the cleaning operation is completed, or rejects with an error if the operation fails.
|
||||
*/
|
||||
Mailbox.prototype.cleanMailbox = function (parameters) {
|
||||
return parameters.folders.length > 0 ? Mailbox.$$resource.post(this.id.split("/")[0], 'cleanMailbox', parameters) : Mailbox.$$resource.post(this.id, 'cleanMailbox', parameters);
|
||||
};
|
||||
|
||||
})();
|
||||
@@ -587,9 +587,12 @@
|
||||
});
|
||||
};
|
||||
|
||||
this.moveSelectedMessages = function(dstFolder) {
|
||||
this.moveSelectedMessages = function(dstFolder, message) {
|
||||
var moveSelectedMessage = vm.selectedFolder.hasSelectedMessage();
|
||||
var selectedMessages = vm.selectedFolder.selectedMessages();
|
||||
if (message) {
|
||||
selectedMessages.push(message);
|
||||
}
|
||||
var count = vm.selectedFolder.selectedCount();
|
||||
if (_.size(selectedMessages) > 0)
|
||||
vm.selectedFolder.$moveMessages(selectedMessages, '/' + dstFolder).then(function(index) {
|
||||
|
||||
@@ -53,6 +53,10 @@
|
||||
$rootScope.$on('resetMailAdvancedSearchPanel', function () {
|
||||
vm.reset();
|
||||
});
|
||||
|
||||
$rootScope.$on('showCleanMailboxPanel', function (e, d) {
|
||||
vm.showCleanMailboxPanel(d.folder, d.account);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -447,6 +451,128 @@
|
||||
});
|
||||
};
|
||||
|
||||
this.showCleanMailboxPanel = function (folder, account) {
|
||||
// Close sidenav on small devices
|
||||
if (!$mdMedia(sgConstant['gt-md']))
|
||||
$mdSidenav('left').close();
|
||||
|
||||
$mdDialog.show({
|
||||
template: document.getElementById('cleanMailbox').innerHTML,
|
||||
parent: angular.element(document.body),
|
||||
controller: function () {
|
||||
var dialogCtrl = this;
|
||||
|
||||
this.$onInit = function () {
|
||||
this.mainController = vm;
|
||||
this.folder = folder;
|
||||
this.isMailbox = (folder ? false : true);
|
||||
this.name = folder ? folder.$displayName : account.name;
|
||||
this.loading = false;
|
||||
this.date = null;
|
||||
this.form = {
|
||||
filterDuration: "3m",
|
||||
permanentlyDelete: false,
|
||||
confirmDelete: false,
|
||||
filterDurationDate: null
|
||||
};
|
||||
|
||||
var today = new Date();
|
||||
var maxDate = new Date(today);
|
||||
maxDate.setMonth(today.getMonth() - 3);
|
||||
this.maxDate = maxDate;
|
||||
};
|
||||
|
||||
dialogCtrl.closeDialog = function () {
|
||||
$mdDialog.hide();
|
||||
};
|
||||
|
||||
dialogCtrl.isLoading = function () {
|
||||
return this.loading;
|
||||
}
|
||||
|
||||
dialogCtrl.isWarningDisplayed = function () {
|
||||
return (this.form && this.form.permanentlyDelete);
|
||||
}
|
||||
|
||||
dialogCtrl.isApplyDisabled = function () {
|
||||
return !(!this.loading
|
||||
&& (!this.form.permanentlyDelete || (this.form.permanentlyDelete && this.form.confirmDelete))
|
||||
&& (this.form.filterDuration != 'custom' || (this.form.filterDuration == 'custom' && this.form.filterDurationDate))
|
||||
);
|
||||
}
|
||||
|
||||
dialogCtrl.apply = function () {
|
||||
var folders = [];
|
||||
var i;
|
||||
if (account) {
|
||||
for (i = 0; i < account.$mailboxes.length ; i++) {
|
||||
folders.push(account.$mailboxes[i].id);
|
||||
}
|
||||
this.folder = account.$mailboxes[0];
|
||||
}
|
||||
var date = '';
|
||||
var durationMonth = 12;
|
||||
var date = new Date();
|
||||
switch (this.form.filterDuration) {
|
||||
case '3m':
|
||||
durationMonth = 3;
|
||||
date.setMonth(date.getMonth() - durationMonth);
|
||||
break;
|
||||
case '6m':
|
||||
durationMonth = 6;
|
||||
date.setMonth(date.getMonth() - durationMonth);
|
||||
break;
|
||||
case '9m':
|
||||
durationMonth = 9;
|
||||
date.setMonth(date.getMonth() - durationMonth);
|
||||
break;
|
||||
case '1y':
|
||||
durationMonth = 12;
|
||||
date.setMonth(date.getMonth() - durationMonth);
|
||||
break;
|
||||
case 'custom':
|
||||
date = this.form.filterDurationDate;
|
||||
break;
|
||||
}
|
||||
var year = date.getFullYear();
|
||||
var month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
var day = String(date.getDate()).padStart(2, '0');
|
||||
this.date = `${year}-${month}-${day}`;
|
||||
this.folder.cleanMailbox({
|
||||
'applyToSubfolders': (this.form && this.form.applyToSubfolders) ? this.form.applyToSubfolders : false,
|
||||
'permanentlyDelete': (this.form && this.form.permanentlyDelete) ? this.form.permanentlyDelete : false,
|
||||
'date': this.date,
|
||||
'folders': folders
|
||||
}).then(function (data) {
|
||||
dialogCtrl.loading = true;
|
||||
Mailbox.selectedFolder.$filter({
|
||||
"sort": "date",
|
||||
"asc": false,
|
||||
"match": "OR"
|
||||
}).then(function () {
|
||||
$state.go('mail.account.mailbox', { accountId: vm.accounts[0].id, mailboxId: encodeUriFilter(Mailbox.selectedFolder.path) });
|
||||
dialogCtrl.loading = false;
|
||||
$mdDialog.hide();
|
||||
|
||||
$mdToast.show(
|
||||
$mdToast.simple()
|
||||
.textContent(l('%{0} message(s) deleted', data.nbMessageDeleted))
|
||||
.position(sgConstant.toastPosition)
|
||||
.hideDelay(2000));
|
||||
});
|
||||
}).catch(function () {
|
||||
dialogCtrl.loading = false;
|
||||
$mdDialog.hide();
|
||||
});
|
||||
};
|
||||
},
|
||||
controllerAs: 'dialogCtrl',
|
||||
clickOutsideToClose: false,
|
||||
escapeToClose: false,
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
this.delegate = function(account) {
|
||||
$mdDialog.show({
|
||||
templateUrl: account.id + '/delegation', // UI/Templates/MailerUI/UIxMailUserDelegation.wox
|
||||
|
||||
@@ -271,6 +271,14 @@
|
||||
});
|
||||
};
|
||||
|
||||
this.cleanMailbox = function () {
|
||||
// Close sidenav on small devices
|
||||
if (!$mdMedia(sgConstant['gt-md']))
|
||||
$mdSidenav('left').close();
|
||||
|
||||
$rootScope.$broadcast('showCleanMailboxPanel', {folder: this.folder, account: null}); // Show remove old emails panel (broadcast event to MailboxesController)
|
||||
};
|
||||
|
||||
this.emptyJunkFolder = function() {
|
||||
return this.emptyFolder(l('Junk folder emptied'));
|
||||
};
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
!function(){"use strict";angular.module("SOGo.MainUI",["SOGo.Common","SOGo.Authentication"]);function e(e,o,s,r,a,n,i,t){var d=this;this.$onInit=function(){this.creds={username:o.cookieUsername,password:null,domain:null,rememberLogin:angular.isDefined(o.cookieUsername)&&0<o.cookieUsername.length},o.loginHint&&(this.creds.username=o.loginHint),/\blanguage=/.test(o.location.search)&&(this.creds.language=o.language),this.loginState=!1,this.verificationCodePattern="\\d{6}",this.passwords={newPassword:null,newPasswordConfirmation:null,oldPassword:null,visible:!1},this.passwordRecovery={passwordRecoveryEnabled:!1,passwordRecoveryQuestionKey:null,passwordRecoveryQuestion:null,passwordRecoveryMode:null,passwordRecoveryQuestionAnswer:null,passwordRecoveryToken:null,passwordRecoveryLinkTimer:null,passwordRecoverySecondaryEmailText:null,passwordRecoveryMailDomain:null,showLoader:!1},this.showLogin=!1,s(function(){d.showLogin=!0;var e=window.location.search;let o=new URLSearchParams(e).get("token");0<window.location.pathname.indexOf("passwordRecoveryEmail")&&o?3===(e=(o=o.replace(/\//g,"")).split(".")).length&&(d.passwordRecovery.passwordRecoveryToken=o,e=JSON.parse(atob(e[1])),d.creds.username=e.username,d.creds.domain=e.domain,d.passwordRecovery.passwordRecoveryToken=o,d.passwordRecovery.passwordRecoveryMode="SecondaryEmail",d.passwordRecovery.passwordRecoveryEnabled=!0,d.loginState="passwordchange",d.showLogin=!1,t("loginContent")):d.retrievePasswordRecoveryEnabled(),0<document.querySelectorAll("*:autofill").length&&document.querySelectorAll("*:autofill").forEach(e=>{e.parentElement.classList.add("md-input-has-value")})},100)},this.login=function(){return d.loginState="authenticating",n.login(d.creds).then(function(e){e.totpmissingkey?(d.loginState="totpcode",i("totpcode")):e.totpdisabled?(d.loginState="totpdisabled",d.cn=e.cn,d.url=e.url):(d.loginState="logged",d.cn=e.cn,d.url=e.url,s(function(){d.continueLogin()},1e3))},function(e){var o,s;d.loginState="error",e.error?d.errorMessage=e.error:0<e.grace?(d.loginState="passwordwillexpire",d.cn=e.cn,d.url=e.url,d.errorMessage=l("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.",e.grace)):0<e.expire?(s=86400<e.expire?(o=Math.round(e.expire/86400),l("days")):3600<e.expire?(o=Math.round(e.expire/3600),l("hours")):60<e.expire?(o=Math.round(e.expire/60),l("minutes")):(o=e.expire,l("seconds")),d.loginState="passwordwillexpire",d.cn=e.cn,d.url=e.url,d.errorMessage=l("Your password is going to expire in %{0} %{1}.",o,s)):e.passwordexpired&&(d.loginState="passwordchange",d.url=e.url)}),!1},this.loginName=function(){return d.loginState="authenticating",n.loginName(d.creds).then(function(e){d.loginState="logged",d.cn=e.cn,d.url=e.url,s(function(){d.continueLogin()},1e3)},function(e){var o,s;d.loginState="error",e.error?d.errorMessage=e.error:0<e.grace?(d.loginState="passwordwillexpire",d.cn=e.cn,d.url=e.url,d.errorMessage=l("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.",e.grace)):0<e.expire?(s=86400<e.expire?(o=Math.round(e.expire/86400),l("days")):3600<e.expire?(o=Math.round(e.expire/3600),l("hours")):60<e.expire?(o=Math.round(e.expire/60),l("minutes")):(o=e.expire,l("seconds")),d.loginState="passwordwillexpire",d.cn=e.cn,d.url=e.url,d.errorMessage=l("Your password is going to expire in %{0} %{1}.",o,s)):e.passwordexpired&&(d.loginState="passwordchange",d.url=e.url)}),!1},this.restoreLogin=function(){d.showLogin=!1,"SecretQuestion"===d.passwordRecovery.passwordRecoveryMode?(t("loginContent"),d.passwordRecoveryInfo()):(delete d.creds.verificationCode,d.passwordRecoveryAbort())},this.continueLogin=function(){o.location.href===d.url?o.location.reload(!0):o.location.href=d.url},this.showAbout=function(e){function o(e){this.closeDialog=function(){e.hide()}}a.show({targetEvent:e,templateUrl:"aboutBox.html",controller:o,controllerAs:"about"}),o.$inject=["$mdDialog"]},this.changeLanguage=function(e){o.location.href=ApplicationBaseURL+"login?language="+this.creds.language},this.hello=function(e){return!1},this.canChangePassword=function(e){return this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword!=this.passwords.newPasswordConfirmation?(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!1),!1):(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!0),!!(this.passwords.newPassword&&0<this.passwords.newPassword.length&&this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword==this.passwords.newPasswordConfirmation&&(this.isInPasswordRecoveryMode()||!this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length||"passwordchange"==this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length)))},this.changePassword=function(){n.changePassword(this.creds.username,this.creds.domain,tLine truncated
|
||||
!function(){"use strict";angular.module("SOGo.MainUI",["SOGo.Common","SOGo.Authentication"]);function e(e,s,o,r,a,i,n,t,d,c){var w=this;this.$onInit=function(){this.creds={username:s.cookieUsername,password:null,domain:null,rememberLogin:angular.isDefined(s.cookieUsername)&&0<s.cookieUsername.length},/\blanguage=/.test(s.location.search)&&(this.creds.language=s.language),this.loginState=!1,this.verificationCodePattern="\\d{6}",this.passwords={newPassword:null,newPasswordConfirmation:null,oldPassword:null,visible:!1},this.passwordRecovery={passwordRecoveryEnabled:!1,passwordRecoveryQuestionKey:null,passwordRecoveryQuestion:null,passwordRecoveryMode:null,passwordRecoveryQuestionAnswer:null,passwordRecoveryToken:null,passwordRecoveryLinkTimer:null,passwordRecoverySecondaryEmailText:null,passwordRecoveryMailDomain:null,showLoader:!1},this.showLogin=!1,o(function(){w.showLogin=!0;var e=window.location.search;let s=new URLSearchParams(e).get("token");0<window.location.pathname.indexOf("passwordRecoveryEmail")&&s?3===(e=(s=s.replace(/\//g,"")).split(".")).length&&(w.passwordRecovery.passwordRecoveryToken=s,e=JSON.parse(atob(e[1])),w.creds.username=e.username,w.creds.domain=e.domain,w.passwordRecovery.passwordRecoveryToken=s,w.passwordRecovery.passwordRecoveryMode="SecondaryEmail",w.passwordRecovery.passwordRecoveryEnabled=!0,w.loginState="passwordchange",t("loginContent")):w.retrievePasswordRecoveryEnabled(),0<document.querySelectorAll("*:autofill").length&&document.querySelectorAll("*:autofill").forEach(e=>{e.parentElement.classList.add("md-input-has-value")})},100)},this.login=function(){return w.loginState="authenticating",i.login(w.creds).then(function(e){e.totpmissingkey?(w.loginState="totpcode",n("totpcode")):e.totpdisabled?(w.loginState="totpdisabled",w.cn=e.cn,w.url=e.url):(w.loginState="logged",w.cn=e.cn,w.url=e.url,o(function(){w.continueLogin()},1e3))},function(e){var s,o;w.loginState="error",e.error?w.errorMessage=e.error:0<e.grace?(w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.passwordPolicy=e.userPolicies||[],w.errorMessage=l("You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.",e.grace)):0<e.expire?(o=86400<e.expire?(s=Math.round(e.expire/86400),l("days")):3600<e.expire?(s=Math.round(e.expire/3600),l("hours")):60<e.expire?(s=Math.round(e.expire/60),l("minutes")):(s=e.expire,l("seconds")),w.loginState="passwordwillexpire",w.cn=e.cn,w.url=e.url,w.errorMessage=l("Your password is going to expire in %{0} %{1}.",s,o)):(e.passwordexpired&&2==e.passwordexpired||e.passwordexpired)&&(w.loginState="passwordchange",w.passwordPolicy=e.userPolicies||[],w.url=e.url,w.passwordexpired=e.passwordexpired)}),!1},this.restoreLogin=function(){"SecretQuestion"===w.passwordRecovery.passwordRecoveryMode?t("loginContent"):delete w.creds.verificationCode,w.passwordRecoveryAbort()},this.continueLogin=function(){s.location.href===w.url?s.location.reload(!0):s.location.href=w.url},this.showAbout=function(e){function s(e){this.closeDialog=function(){e.hide()}}a.show({targetEvent:e,templateUrl:"aboutBox.html",controller:s,controllerAs:"about"}),s.$inject=["$mdDialog"]},this.changeLanguage=function(e){s.location.href=ApplicationBaseURL+"changeLanguage?language="+this.creds.language},this.canChangePassword=function(e){return this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword!=this.passwords.newPasswordConfirmation?(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!1),!1):(e.newPasswordConfirmation.$setValidity("newPasswordMismatch",!0),!!(this.passwords.newPassword&&0<this.passwords.newPassword.length&&this.passwords.newPasswordConfirmation&&this.passwords.newPasswordConfirmation.length&&this.passwords.newPassword==this.passwords.newPasswordConfirmation&&(this.isInPasswordRecoveryMode()||!this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length||"passwordchange"==this.loginState&&this.passwords.oldPassword&&0<this.passwords.oldPassword.length)))},this.changePassword=function(){i.changePassword(this.creds.username,this.creds.domain,this.passwords.newPassword,this.passwords.oldPassword,this.passwordRecovery.passwordRecoveryToken).then(function(e){w.loginState="message",w.url=e.url,w.errorMessage=l("The password was changed successfully.")},function(e){c.show(c.simple().textContent(e).position(d.toastPosition).hideDelay(2e3))})},this.passwordRecoveryInfo=function(){w.loginState="passwordrecovery",w.passwordRecovery.showLoader=!0,i.passwordRecovery(this.creds.username,this.creds.domain).then(function(e){w.passwordRecovery.passwordRecoveryMode=e.mode,"SecretQuestion"===e.mode?(w.passwordRecovery.passwordRecoveryQuestion=e.secretQuestionLabel,w.passwordRecovery.passwordRecoveryQuestionKey=e.secretQuestion):"SecondaryEmail"===e.mode?w.passwordRecovery.passwordRecoverySecondaryEmailText=l("A link will be sent to %{0}",e.obfuscatedRecoveryEmail):"Disabled"===e.mode&&(Line truncated
|
||||
//# sourceMappingURL=Main.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["angular","module","LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","rippleDo","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","isDefined","length","loginHint","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","visible","passwordRecovery","passwordRecoveryEnabled","passwordRecoveryQuestionKey","passwordRecoveryQuestion","passwordRecoveryMode","passwordRecoveryQuestionAnswer","passwordRecoveryToken","passwordRecoveryLinkTimer","passwordRecoverySecondaryEmailText","passwordRecoveryMailDomain","showLoader","showLogin","queryString","window","let","token","URLSearchParams","get","pathname","indexOf","tokenArray","replace","split","info","JSON","parse","atob","retrievePasswordRecoveryEnabled","document","querySelectorAll","forEach","el","parentElement","classList","add","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","l","expire","Math","round","passwordexpired","loginName","restoreLogin","passwordRecoveryInfo","verificationCode","passwordRecoveryAbort","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","hello","form","canChangePassword","$setValidity","isInPasswordRecoveryMode","changePassword","mode","secretQuestionLabel","secretQuestion","obfuscatedRecoveryEmail","passwordRecoveryEmail","passwordRecoveryCheck","usernameChanged","clearTimeout","setTimeout","mailDomain","changePasswordVisibility","field","getElementById","type","innerHTML"],"mappings":"AAEA,CAAA,WACE,aAEAA,QAAQC,OAAO,cAAe,CAAC,cAAe,sBAAsB,EAOpE,SAASC,EAAgBC,EAAQC,EAASC,EAAUC,EAAQC,EAAWC,EAAgBC,EAAOC,GAC5F,IAAIC,EAAKC,KAETA,KAAKC,QAAU,WACbD,KAAKE,MAAQ,CACXC,SAAUX,EAAQY,eAClBC,SAAU,KACVC,OAAQ,KACRC,cAAenB,QAAQoB,UAAUhB,EAAQY,cAAc,GAAqC,EAAhCZ,EAAQY,eAAeK,MACrF,EACGjB,EAAQkB,YACTV,KAAKE,MAAMC,SAAWX,EAAQkB,WAE5B,cAAcC,KAAKnB,EAAQoB,SAASC,MAAM,IAC5Cb,KAAKE,MAAMY,SAAWtB,EAAQsB,UAChCd,KAAKe,WAAa,CAAA,EAGlBf,KAAKgB,wBAA0B,SAG/BhB,KAAKiB,UAAY,CAAEC,YAAa,KAAMC,wBAAyB,KAAMC,YAAa,KAAMC,QAAS,CAAA,CAAM,EAGvGrB,KAAKsB,iBAAmB,CACtBC,wBAAyB,CAAA,EACzBC,4BAA6B,KAC7BC,yBAA0B,KAC1BC,qBAAsB,KACtBC,+BAAgC,KAChCC,sBAAuB,KACvBC,0BAA2B,KAC3BC,mCAAoC,KACpCC,2BAA4B,KAC5BC,WAAY,CAAA,CACd,EAGAhC,KAAKiC,UAAY,CAAA,EACjBxC,EAAS,WACPM,EAAGkC,UAAY,CAAA,EAEf,IAAMC,EAAcC,OAAOvB,SAASC,OAEpCuB,IAAIC,EADc,IAAIC,gBAAgBJ,CAAW,EAC3BK,IAAI,OAAO,EAE7B,EAAIJ,OAAOvB,SAAS4B,SAASC,QAAQ,uBAAuB,GAAKJ,EAK/D,KAHEK,GADNL,EAAQA,EAAMM,QAAQ,MAAO,EAAE,GACNC,MAAM,GAAG,GAGbnC,SACnBV,EAAGuB,iBAAiBM,sBAAwBS,EACtCQ,EAAOC,KAAKC,MAAMC,KAAKN,EAAW,EAAE,CAAC,EAC3C3C,EAAGG,MAAMC,SAAW0C,EAAK1C,SACzBJ,EAAGG,MAAMI,OAASuC,EAAKvC,OACvBP,EAAGuB,iBAAiBM,sBAAwBS,EAC5CtC,EAAGuB,iBAAiBI,qBAAuB,iBAC3C3B,EAAGuB,iBAAiBC,wBAA0B,CAAA,EAE9CxB,EAAGgB,WAAa,iBAChBhB,EAAGkC,UAAY,CAAA,EACfnC,EAAS,cAAc,GAIzBC,EAAGkD,gCAAgC,EAIgB,EAAjDC,SAASC,iBAAiB,YAAY,EAAE1C,QAC1CyC,SAASC,iBAAiB,YAAY,EAAEC,QAAQ,IAC9CC,EAAGC,cAAcC,UAAUC,IAAI,oBAAoB,CACrD,CAAC,CAEJ,EAAG,GAAG,CAET,EAEAxD,KAAKyD,MAAQ,WAmEX,OAlEA1D,EAAGgB,WAAa,iBAChBnB,EAAe6D,MAAM1D,EAAGG,KAAK,EAC1BwD,KAAK,SAASC,GAETA,EAAKC,gBACP7D,EAAGgB,WAAa,WAChBlB,EAAM,UAAU,GAET8D,EAAKE,cACZ9D,EAAGgB,WAAa,eAChBhB,EAAG+D,GAAKH,EAAKG,GACb/D,EAAGgE,IAAMJ,EAAKI,MAGdhE,EAAGgB,WAAa,SAChBhB,EAAG+D,GAAKH,EAAKG,GACb/D,EAAGgE,IAAMJ,EAAKI,IAGdtE,EAAS,WACPM,EAAGiE,cAAc,CACnB,EAAG,GAAI,EAEX,EAAG,SAASC,GAGV,IAYMC,EAGFC,EAjBJpE,EAAGgB,WAAa,QAEZkD,EAAIG,MACNrE,EAAGsE,aAAeJ,EAAIG,MAEH,EAAZH,EAAIK,OAEXvE,EAAGgB,WAAa,qBAChBhB,EAAG+D,GAAKG,EAAIH,GACZ/D,EAAGgE,IAAME,EAAIF,IACbhE,EAAGsE,aAAeE,EAAE,sHAAuHN,EAAIK,KAAK,GAEhI,EAAbL,EAAIO,QAKTL,EAFe,MAAbF,EAAIO,QACNN,EAAQO,KAAKC,MAAMT,EAAIO,OAAO,KAAK,EAC1BD,EAAE,MAAM,GAEG,KAAbN,EAAIO,QACXN,EAAQO,KAAKC,MAAMT,EAAIO,OAAO,IAAI,EACzBD,EAAE,OAAO,GAEE,GAAbN,EAAIO,QACXN,EAAQO,KAAKC,MAAMT,EAAIO,OAAO,EAAE,EACvBD,EAAE,SAAS,IAGpBL,EAAQD,EAAIO,OACHD,EAAE,SAAS,GAEtBxE,EAAGgB,WAAa,qBAChBhB,EAAG+D,GAAKG,EAAIH,GACZ/D,EAAGgE,IAAME,EAAIF,IACbhE,EAAGsE,aAAeE,EAAE,iDAAkDL,EAAOC,CAAM,GAE5EF,EAAIU,kBACX5E,EAAGgB,WAAa,iBAChBhB,EAAGgE,IAAME,EAAIF,IAGjB,CAAC,EACI,CAAA,CACT,EAEA/D,KAAK4E,UAAY,WAuDf,OAtDA7E,EAAGgB,WAAa,iBAChBnB,EAAegF,UAAU7E,EAAGG,KAAK,EAC9BwD,KAAK,SAASC,GACX5D,EAAGgB,WAAa,SAChBhB,EAAG+D,GAAKH,EAAKG,GACb/D,EAAGgE,IAAMJ,EAAKI,IAGdtE,EAAS,WACPM,EAAGiE,cAAc,CACnB,EAAG,GAAI,CACX,EAAG,SAASC,GAGV,IAYMC,EAGFC,EAjBJpE,EAAGgB,WAAa,QAEZkD,EAAIG,MACNrE,EAAGsE,aAAeJ,EAAIG,MAEH,EAAZH,EAAIK,OAEXvE,EAAGgB,WAAa,qBAChBhB,EAAG+D,GAAKG,EAAIH,GACZ/D,EAAGgE,IAAME,EAAIF,IACbhE,EAAGsE,aAAeE,EAAE,sHAAuHN,EAAIK,KAAK,GAEhI,EAAbL,EAAIO,QAKTL,EAFe,MAAbF,EAAIO,QACNN,EAAQO,KAAKC,MAAMT,EAAIO,OAAO,KAAK,EAC1BD,EAAE,MAAM,GAEG,KAAbN,EAAIO,QACXN,EAAQO,KAAKC,MAAMT,EAAIO,OAAO,IAAI,EACzBD,EAAE,OAAO,GAEE,GAAbN,EAAIO,QACXN,EAAQO,KAAKC,MAAMT,EAAIO,OAAOLine truncated
|
||||
{"version":3,"file":"Main.js","sources":["Main/Main.app.js"],"names":["angular","module","LoginController","$scope","$window","$timeout","Dialog","$mdDialog","Authentication","focus","rippleDo","sgConstant","$mdToast","vm","this","$onInit","creds","username","cookieUsername","password","domain","rememberLogin","isDefined","length","test","location","search","language","loginState","verificationCodePattern","passwords","newPassword","newPasswordConfirmation","oldPassword","visible","passwordRecovery","passwordRecoveryEnabled","passwordRecoveryQuestionKey","passwordRecoveryQuestion","passwordRecoveryMode","passwordRecoveryQuestionAnswer","passwordRecoveryToken","passwordRecoveryLinkTimer","passwordRecoverySecondaryEmailText","passwordRecoveryMailDomain","showLoader","showLogin","queryString","window","let","token","URLSearchParams","get","pathname","indexOf","tokenArray","replace","split","info","JSON","parse","atob","retrievePasswordRecoveryEnabled","document","querySelectorAll","forEach","el","parentElement","classList","add","login","then","data","totpmissingkey","totpdisabled","cn","url","continueLogin","msg","value","string","error","errorMessage","grace","passwordPolicy","userPolicies","l","expire","Math","round","passwordexpired","restoreLogin","verificationCode","passwordRecoveryAbort","href","reload","showAbout","$event","AboutDialogController","closeDialog","hide","show","targetEvent","templateUrl","controller","controllerAs","$inject","changeLanguage","ApplicationBaseURL","canChangePassword","form","$setValidity","isInPasswordRecoveryMode","changePassword","simple","textContent","position","toastPosition","hideDelay","passwordRecoveryInfo","mode","secretQuestionLabel","secretQuestion","obfuscatedRecoveryEmail","passwordRecoveryEmail","passwordRecoveryCheck","isPasswordExpiredSecurity","usernameChanged","clearTimeout","setTimeout","mailDomain","changePasswordVisibility","field","getElementById","type","innerHTML"],"mappings":"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 truncated
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode: javascript; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* JavaScript for MainUI (SOGoRootPage) */
|
||||
(function() {
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
angular.module('SOGo.MainUI', ['SOGo.Common', 'SOGo.Authentication']);
|
||||
@@ -9,8 +9,8 @@
|
||||
/**
|
||||
* @ngInject
|
||||
*/
|
||||
LoginController.$inject = ['$scope', '$window', '$timeout', 'Dialog', '$mdDialog', 'Authentication', 'sgFocus', 'sgRippleClick'];
|
||||
function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication, focus, rippleDo) {
|
||||
LoginController.$inject = ['$scope', '$window', '$timeout', 'Dialog', '$mdDialog', 'Authentication', 'sgFocus', 'sgRippleClick', 'sgConstant', '$mdToast'];
|
||||
function LoginController($scope, $window, $timeout, Dialog, $mdDialog, Authentication, focus, rippleDo, sgConstant, $mdToast) {
|
||||
var vm = this;
|
||||
|
||||
this.$onInit = function () {
|
||||
@@ -71,10 +71,9 @@
|
||||
vm.passwordRecovery.passwordRecoveryEnabled = true;
|
||||
|
||||
vm.loginState = 'passwordchange';
|
||||
vm.showLogin = false;
|
||||
rippleDo('loginContent');
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
vm.retrievePasswordRecoveryEnabled();
|
||||
}
|
||||
@@ -85,14 +84,14 @@
|
||||
el.parentElement.classList.add("md-input-has-value");
|
||||
});
|
||||
}
|
||||
}, 100);
|
||||
|
||||
}, 100);
|
||||
|
||||
};
|
||||
|
||||
this.login = function() {
|
||||
this.login = function () {
|
||||
vm.loginState = 'authenticating';
|
||||
Authentication.login(vm.creds)
|
||||
.then(function(data) {
|
||||
.then(function (data) {
|
||||
|
||||
if (data.totpmissingkey) {
|
||||
vm.loginState = 'totpcode';
|
||||
@@ -109,11 +108,11 @@
|
||||
vm.url = data.url;
|
||||
|
||||
// Let the user see the succesfull message before reloading the page
|
||||
$timeout(function() {
|
||||
$timeout(function () {
|
||||
vm.continueLogin();
|
||||
}, 1000);
|
||||
}
|
||||
}, function(msg) {
|
||||
}, function (msg) {
|
||||
vm.loginState = 'error';
|
||||
|
||||
if (msg.error) {
|
||||
@@ -124,21 +123,22 @@
|
||||
vm.loginState = 'passwordwillexpire';
|
||||
vm.cn = msg.cn;
|
||||
vm.url = msg.url;
|
||||
vm.passwordPolicy = msg.userPolicies ? msg.userPolicies : [];
|
||||
vm.errorMessage = l('You have %{0} logins remaining before your account is locked. Please change your password in the preference dialog.', msg.grace);
|
||||
}
|
||||
else if (msg.expire > 0) {
|
||||
// Password will soon expire
|
||||
var value, string;
|
||||
if (msg.expire > 86400) {
|
||||
value = Math.round(msg.expire/86400);
|
||||
value = Math.round(msg.expire / 86400);
|
||||
string = l("days");
|
||||
}
|
||||
else if (msg.expire > 3600) {
|
||||
value = Math.round(msg.expire/3600);
|
||||
value = Math.round(msg.expire / 3600);
|
||||
string = l("hours");
|
||||
}
|
||||
else if (msg.expire > 60) {
|
||||
value = Math.round(msg.expire/60);
|
||||
value = Math.round(msg.expire / 60);
|
||||
string = l("minutes");
|
||||
}
|
||||
else {
|
||||
@@ -150,9 +150,16 @@
|
||||
vm.url = msg.url;
|
||||
vm.errorMessage = l('Your password is going to expire in %{0} %{1}.', value, string);
|
||||
}
|
||||
else if (msg.passwordexpired) {
|
||||
else if (msg.passwordexpired && msg.passwordexpired == 2) {
|
||||
vm.loginState = 'passwordchange';
|
||||
vm.passwordPolicy = msg.userPolicies ? msg.userPolicies : [];
|
||||
vm.url = msg.url;
|
||||
vm.passwordexpired = msg.passwordexpired;
|
||||
} else if (msg.passwordexpired) {
|
||||
vm.loginState = 'passwordchange';
|
||||
vm.passwordPolicy = msg.userPolicies ? msg.userPolicies : [];
|
||||
vm.url = msg.url;
|
||||
vm.passwordexpired = msg.passwordexpired;
|
||||
}
|
||||
|
||||
});
|
||||
@@ -217,25 +224,24 @@
|
||||
return false;
|
||||
};
|
||||
|
||||
this.restoreLogin = function() {
|
||||
vm.showLogin = false;
|
||||
this.restoreLogin = function () {
|
||||
if ('SecretQuestion' === vm.passwordRecovery.passwordRecoveryMode) {
|
||||
rippleDo('loginContent');
|
||||
vm.passwordRecoveryInfo();
|
||||
vm.passwordRecoveryAbort();
|
||||
} else {
|
||||
delete vm.creds.verificationCode;
|
||||
vm.passwordRecoveryAbort();
|
||||
}
|
||||
};
|
||||
|
||||
this.continueLogin = function() {
|
||||
this.continueLogin = function () {
|
||||
if ($window.location.href === vm.url)
|
||||
$window.location.reload(true);
|
||||
else
|
||||
$window.location.href = vm.url;
|
||||
};
|
||||
|
||||
this.showAbout = function($event) {
|
||||
this.showAbout = function ($event) {
|
||||
$mdDialog.show({
|
||||
targetEvent: $event,
|
||||
templateUrl: 'aboutBox.html',
|
||||
@@ -244,24 +250,20 @@
|
||||
});
|
||||
AboutDialogController.$inject = ['$mdDialog'];
|
||||
function AboutDialogController($mdDialog) {
|
||||
this.closeDialog = function() {
|
||||
this.closeDialog = function () {
|
||||
$mdDialog.hide();
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
this.changeLanguage = function($event) {
|
||||
this.changeLanguage = function ($event) {
|
||||
// Reload page
|
||||
$window.location.href = ApplicationBaseURL + 'login?language=' + this.creds.language;
|
||||
$window.location.href = ApplicationBaseURL + 'changeLanguage?language=' + this.creds.language;
|
||||
};
|
||||
|
||||
this.hello = function (form) {
|
||||
return !true;
|
||||
}
|
||||
|
||||
this.canChangePassword = function(form) {
|
||||
this.canChangePassword = function (form) {
|
||||
if (this.passwords.newPasswordConfirmation && this.passwords.newPasswordConfirmation.length &&
|
||||
this.passwords.newPassword != this.passwords.newPasswordConfirmation) {
|
||||
this.passwords.newPassword != this.passwords.newPasswordConfirmation) {
|
||||
form.newPasswordConfirmation.$setValidity('newPasswordMismatch', false);
|
||||
return false;
|
||||
}
|
||||
@@ -269,25 +271,29 @@
|
||||
form.newPasswordConfirmation.$setValidity('newPasswordMismatch', true);
|
||||
}
|
||||
if (this.passwords.newPassword && this.passwords.newPassword.length > 0 &&
|
||||
this.passwords.newPasswordConfirmation && this.passwords.newPasswordConfirmation.length &&
|
||||
this.passwords.newPassword == this.passwords.newPasswordConfirmation &&
|
||||
((this.isInPasswordRecoveryMode()) ||
|
||||
(!this.loginState && this.passwords.oldPassword && this.passwords.oldPassword.length > 0) ||
|
||||
this.passwords.newPasswordConfirmation && this.passwords.newPasswordConfirmation.length &&
|
||||
this.passwords.newPassword == this.passwords.newPasswordConfirmation &&
|
||||
((this.isInPasswordRecoveryMode()) ||
|
||||
(!this.loginState && this.passwords.oldPassword && this.passwords.oldPassword.length > 0) ||
|
||||
('passwordchange' == this.loginState && this.passwords.oldPassword && this.passwords.oldPassword.length > 0)
|
||||
))
|
||||
))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
this.changePassword = function() {
|
||||
Authentication.changePassword(this.creds.username, this.creds.domain, this.passwords.newPassword, this.passwords.oldPassword, this.passwordRecovery.passwordRecoveryToken).then(function(data) {
|
||||
this.changePassword = function () {
|
||||
Authentication.changePassword(this.creds.username, this.creds.domain, this.passwords.newPassword, this.passwords.oldPassword, this.passwordRecovery.passwordRecoveryToken).then(function (data) {
|
||||
vm.loginState = 'message';
|
||||
vm.url = data.url;
|
||||
vm.errorMessage = l('The password was changed successfully.');
|
||||
}, function(msg) {
|
||||
vm.loginState = 'error';
|
||||
vm.errorMessage = msg;
|
||||
}, function (msg) {
|
||||
$mdToast.show(
|
||||
$mdToast.simple()
|
||||
.textContent(msg)
|
||||
.position(sgConstant.toastPosition)
|
||||
.hideDelay(2000)
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -320,38 +326,42 @@
|
||||
, this.passwordRecovery.passwordRecoveryMailDomain).then(function () {
|
||||
vm.loginState = 'sendrecoverymail';
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
}, function (msg) {
|
||||
vm.loginState = 'error';
|
||||
vm.errorMessage = msg;
|
||||
}, function (msg) {
|
||||
vm.loginState = 'error';
|
||||
vm.errorMessage = msg;
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
this.passwordRecoveryCheck = function () {
|
||||
vm.passwordRecovery.showLoader = true;
|
||||
Authentication.passwordRecoveryCheck(this.creds.username, this.creds.domain
|
||||
, this.passwordRecovery.passwordRecoveryMode
|
||||
, this.passwordRecovery.passwordRecoveryQuestionKey
|
||||
, this.passwordRecovery.passwordRecoveryQuestionAnswer
|
||||
, this.passwordRecovery.passwordRecoveryMailDomain).then(function (token) {
|
||||
if ("SecretQuestion" == vm.passwordRecovery.passwordRecoveryMode) {
|
||||
vm.passwordRecovery.passwordRecoveryToken = token;
|
||||
vm.loginState = 'passwordchange';
|
||||
} else if ("SecondaryEmail" == vm.passwordRecovery.passwordRecoveryMode) {
|
||||
vm.loginState = 'sendrecoverymail';
|
||||
}
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
}, function (msg) {
|
||||
vm.loginState = 'error';
|
||||
vm.errorMessage = msg;
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
});
|
||||
, this.passwordRecovery.passwordRecoveryMode
|
||||
, this.passwordRecovery.passwordRecoveryQuestionKey
|
||||
, this.passwordRecovery.passwordRecoveryQuestionAnswer
|
||||
, this.passwordRecovery.passwordRecoveryMailDomain).then(function (token) {
|
||||
if ("SecretQuestion" == vm.passwordRecovery.passwordRecoveryMode) {
|
||||
vm.passwordRecovery.passwordRecoveryToken = token;
|
||||
vm.loginState = 'passwordchange';
|
||||
} else if ("SecondaryEmail" == vm.passwordRecovery.passwordRecoveryMode) {
|
||||
vm.loginState = 'sendrecoverymail';
|
||||
}
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
}, function (msg) {
|
||||
vm.loginState = 'error';
|
||||
vm.errorMessage = msg;
|
||||
vm.passwordRecovery.showLoader = false;
|
||||
});
|
||||
};
|
||||
|
||||
this.isPasswordExpiredSecurity = function () {
|
||||
return (this.passwordexpired && 2 === this.passwordexpired);
|
||||
};
|
||||
|
||||
this.isInPasswordRecoveryMode = function () {
|
||||
return (("SecretQuestion" == this.passwordRecovery.passwordRecoveryMode ||
|
||||
"SecondaryEmail" == this.passwordRecovery.passwordRecoveryMode) &&
|
||||
this.passwordRecovery.passwordRecoveryToken) ? true : false;
|
||||
return (("SecretQuestion" == this.passwordRecovery.passwordRecoveryMode) ||
|
||||
("SecondaryEmail" == this.passwordRecovery.passwordRecoveryMode &&
|
||||
this.passwordRecovery.passwordRecoveryToken)) ? true : false;
|
||||
};
|
||||
|
||||
this.passwordRecoveryAbort = function () {
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
!function(){"use strict";function d(e){this.component=e,this.component.attendees&&_.forEach(this.component.attendees,function(e){e.image=d.$gravatar(e.email,32)}),this.workDaysOnly=!0,this.slotStartTimeLimit=new Date,this.slotStartTimeLimit.setMinutes(0),this.slotStartTimeLimit.setHours(d.dayStartHour),this.slotEndTimeLimit=new Date,this.slotEndTimeLimit.setMinutes(0),this.slotEndTimeLimit.setHours(d.dayEndHour),this.$days=[],this.$futureFreebusyData={},this.updateFreeBusyCoverage(),this.updateFreeBusy(),0==this.$days.length&&this.getDays()}d.$factory=["$q","$timeout","$log","sgSettings","Attendees_ROLES","Preferences","User","Card","Gravatar","Resource",function(e,t,n,i,a,o,r,s,c,l){return angular.extend(d,{$q:e,$timeout:t,$log:n,$settings:i,$User:r,$Preferences:o,$Card:s,$gravatar:c,$$resource:new l(i.activeUser("folderURL")+"Calendar",i.activeUser()),ROLES:a}),d.dayStartHour=parseInt(o.defaults.SOGoDayStartTime.split(":")[0]),d.dayEndHour=parseInt(o.defaults.SOGoDayEndTime.split(":")[0]),d}];try{angular.module("SOGo.SchedulerUI")}catch(e){angular.module("SOGo.SchedulerUI",["SOGo.Common"])}angular.module("SOGo.SchedulerUI").constant("Attendees_ROLES",{REQ_PARTICIPANT:"req-participant",OPT_PARTICIPANT:"opt-participant",NON_PARTICIPANT:"non-participant",CHAIR:"chair"}).factory("Attendees",d.$factory),d.timeToQuarters=function(e){return 4*e.getHours()+Math.ceil(e.getMinutes()/15)},d.prototype.getLength=function(){return this.component.attendees?this.component.attendees.length:0},d.prototype.initOrganizer=function(e){var t=this,e=e&&e.isSubscription?d.$User.$filter(e.owner).then(function(e){e=e[0];t.component.organizer={uid:e.uid,name:e.cn,email:e.c_email}}):(this.component.organizer||(this.component.organizer={uid:d.$settings.activeUser("login"),name:d.$settings.activeUser("identification"),email:d.$settings.activeUser("email")}),d.$q.when());e.then(function(){t.updateFreeBusyAttendee(t.component.organizer)})},d.prototype.add=function(e,t){var n,i,a=this,o=d.$q.when();return e&&((!this.component.attendees||t&&t.organizerCalendar)&&this.initOrganizer(t?t.organizerCalendar:null),e.$isList({expandable:!0})?o=(i=d.$Card.$find(e.container,e.c_name)).$id().then(function(e){_.forEach(i.refs,function(e){n={name:e.c_cn,email:e.$preferredEmail(t?t.partial:null),role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",uid:e.c_uid,$avatarIcon:"person"},_.find(a.component.attendees,function(e){return e.email==n.email})||(n.image=d.$gravatar(n.email,32),a.component.attendees?a.component.attendees.push(n):a.component.attendees=[n],a.updateFreeBusyAttendee(n))})}):(n={uid:e.c_uid,domain:e.c_domain,isMSExchange:e.ismsexchange,isGroup:e.$isList(),isExpandableGroup:!1,isResource:e.isresource,name:e.c_cn,email:e.$$email,role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",$avatarIcon:e.$avatarIcon},_.find(this.attendees,function(e){return e.email==n.email})||(e.$isList()&&d.$Preferences.defaults.SOGoLDAPGroupExpansionEnabled&&(o=e.$members().then(function(e){n.members=e,n.isExpandableGroup=!0})),n.image=d.$gravatar(n.email,32),this.component.attendees?_.findIndex(this.component.attendees,{email:n.email})<0&&this.component.attendees.push(n):this.component.attendees=[n],this.updateFreeBusyAttendee(n)))),o},d.prototype.nextRole=function(t){var e=_.values(d.ROLES),n=_.findIndex(e,function(e){return t.role===e});t.role=e[++n%4]},d.prototype.hasAttendee=function(e){var t=_.find(this.component.attendees,function(t){return _.find(e.emails,function(e){return e.value==t.email})});return angular.isDefined(t)},d.prototype.remove=function(t){var e=_.findIndex(this.component.attendees,function(e){return e.email==t.email});-1<e&&this.component.attendees.splice(e,1),delete this.$futureFreebusyData[t.uid]},d.prototype.updateFreeBusyCoverage=function(){var o,r,s,e,c={};this.component.start&&this.component.end&&(o=new Date(this.component.start.getTime()),r=new Date(this.component.end.getTime()),this.component.isAllDay?(o.setHours(d.dayStartHour),o.setMinutes(0),r.setHours(d.dayEndHour),r.setMinutes(0),s=e=0):(s=parseInt(o.getMinutes()/15+.5),e=parseInt(r.getMinutes()/15+.5)),o.setMinutes(15*s),r.setMinutes(15*e),_.forEach(o.beginOfDay().daysUpTo(r.beginOfDay()),function(e,t){var n,i=(e=e<o?new Date(o.getTime()):e).getDate(),a=e.getDayString();if(a===o.getDayString())for(n=e.getHours().toString(),c[a]={},c[a][n]=[];0<s;)c[a][n].push(0),s--;else e=e.beginOfDay(),c[a]={};for(;e.getTime()<r.getTime()&&e.getDate()==i;)n=e.getHours().toString(),angular.isUndefined(c[a][n])&&(c[a][n]=[]),c[a][n].push(1),e.addMinutes(15)}),this.freebusy=c)},d.prototype.coversFreeBusy=function(e,t,n){return this.freebusy&&angular.isDefined(this.freebusy[e])&&angular.isDefined(this.freebusy[e][t])&&1==this.freebusy[e][t][n]},d.prototype.getDays=function(e){var t,n,i,a=this;return e?(t=e,(n=new Date(e.getTime())).addMinutes(this.component.delta)):(t=this.component.start,n=this.component.end),(0===this.$days.length||_.findIndex(this.$days,["getDayString",t.getDayString()])<0||_Line truncated
|
||||
!function(){"use strict";function d(e){this.component=e,this.component.attendees&&_.forEach(this.component.attendees,function(e){e.image=d.$gravatar(e.email,32)}),this.workDaysOnly=!0,this.slotStartTimeLimit=new Date,this.slotStartTimeLimit.setMinutes(0),this.slotStartTimeLimit.setHours(d.dayStartHour),this.slotEndTimeLimit=new Date,this.slotEndTimeLimit.setMinutes(0),this.slotEndTimeLimit.setHours(d.dayEndHour),this.$days=[],this.$futureFreebusyData={},this.updateFreeBusyCoverage(),this.updateFreeBusy(),0==this.$days.length&&this.getDays()}d.$factory=["$q","$timeout","$log","sgSettings","Attendees_ROLES","Preferences","User","Card","Gravatar","Resource",function(e,t,n,i,a,o,r,s,c,l){return angular.extend(d,{$q:e,$timeout:t,$log:n,$settings:i,$User:r,$Preferences:o,$Card:s,$gravatar:c,$$resource:new l(i.activeUser("folderURL")+"Calendar",i.activeUser()),ROLES:a}),d.dayStartHour=parseInt(o.defaults.SOGoDayStartTime.split(":")[0]),d.dayEndHour=parseInt(o.defaults.SOGoDayEndTime.split(":")[0]),d}];try{angular.module("SOGo.SchedulerUI")}catch(e){angular.module("SOGo.SchedulerUI",["SOGo.Common"])}angular.module("SOGo.SchedulerUI").constant("Attendees_ROLES",{REQ_PARTICIPANT:"req-participant",OPT_PARTICIPANT:"opt-participant",NON_PARTICIPANT:"non-participant",CHAIR:"chair"}).factory("Attendees",d.$factory),d.timeToQuarters=function(e){return 4*e.getHours()+Math.ceil(e.getMinutes()/15)},d.prototype.getLength=function(){return this.component.attendees?this.component.attendees.length:0},d.prototype.initOrganizer=function(e){var t=this,e=e&&e.isSubscription?d.$User.$filter(e.owner).then(function(e){e=e[0];t.component.organizer={uid:e.uid,name:e.cn,email:e.c_email}}):(this.component.organizer||(this.component.organizer={uid:d.$settings.activeUser("login"),name:d.$settings.activeUser("identification"),email:d.$settings.activeUser("email")}),d.$q.when());e.then(function(){t.updateFreeBusyAttendee(t.component.organizer)})},d.prototype.add=function(e,t){var n,i,a=this,o=d.$q.when();return e&&((!this.component.attendees||t&&t.organizerCalendar)&&this.initOrganizer(t?t.organizerCalendar:null),e.$isList({expandable:!0})?o=(i=d.$Card.$find(e.container,e.c_name)).$id().then(function(e){_.forEach(i.refs,function(e){n={name:e.c_cn,email:e.$preferredEmail(t?t.partial:null),role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",uid:e.c_uid,$avatarIcon:"person"},_.find(a.component.attendees,function(e){return e.email==n.email})||(n.image=d.$gravatar(n.email,32),a.component.attendees?a.component.attendees.push(n):a.component.attendees=[n],a.updateFreeBusyAttendee(n))})}):(n={uid:e.c_uid,domain:e.c_domain,isMSExchange:e.ismsexchange,isGroup:e.$isList(),isExpandableGroup:!1,isResource:e.isresource,name:e.c_cn,email:e.$$email,role:d.ROLES.REQ_PARTICIPANT,partstat:"needs-action",$avatarIcon:e.$avatarIcon},_.find(this.attendees,function(e){return e.email==n.email})||(e.$isList()&&d.$Preferences.defaults.SOGoLDAPGroupExpansionEnabled&&(o=e.$members().then(function(e){n.members=e,n.isExpandableGroup=!0})),n.image=d.$gravatar(n.email,32),this.component.attendees?_.findIndex(this.component.attendees,{email:n.email})<0&&this.component.attendees.push(n):this.component.attendees=[n],this.updateFreeBusyAttendee(n)))),o},d.prototype.nextRole=function(t){var e=_.values(d.ROLES),n=_.findIndex(e,function(e){return t.role===e});t.role=e[++n%4]},d.prototype.hasAttendee=function(e){var t=_.find(this.component.attendees,function(t){return _.find(e.emails,function(e){return e.value==t.email})});return angular.isDefined(t)},d.prototype.remove=function(t){var e=_.findIndex(this.component.attendees,function(e){return e.email==t.email});-1<e&&this.component.attendees.splice(e,1),delete this.$futureFreebusyData[t.uid]},d.prototype.updateFreeBusyCoverage=function(){var o,r,s,e,c={};this.component.start&&this.component.end&&(o=new Date(this.component.start.getTime()),r=new Date(this.component.end.getTime()),this.component.isAllDay?(o.setHours(d.dayStartHour),o.setMinutes(0),r.setHours(d.dayEndHour),r.setMinutes(0),s=e=0):(s=parseInt(o.getMinutes()/15+.5),e=parseInt(r.getMinutes()/15+.5)),o.setMinutes(15*s),r.setMinutes(15*e),_.forEach(o.beginOfDay().daysUpTo(r.beginOfDay()),function(e,t){var n,i=(e=e<o?new Date(o.getTime()):e).getDate(),a=e.getDayString();if(a===o.getDayString())for(n=e.getHours().toString(),c[a]={},c[a][n]=[];0<s;)c[a][n].push(0),s--;else e=e.beginOfDay(),c[a]={};for(;e.getTime()<r.getTime()&&e.getDate()==i;)n=e.getHours().toString(),angular.isUndefined(c[a][n])&&(c[a][n]=[]),c[a][n].push(1),e.addMinutes(15)}),this.freebusy=c)},d.prototype.coversFreeBusy=function(e,t,n){return this.freebusy&&angular.isDefined(this.freebusy[e])&&angular.isDefined(this.freebusy[e][t])&&1==this.freebusy[e][t][n]},d.prototype.getDays=function(e){var t,n,i,a=this;return e?(t=e,(n=new Date(e.getTime())).addMinutes(this.component.delta)):(t=this.component.start,n=this.component.end),(0===this.$days.length||_.findIndex(this.$days,["getDayString",t.getDayString()])<0||_Line truncated
|
||||
//# sourceMappingURL=Scheduler.services.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"Scheduler.services.js","sources":["Scheduler/Attendees.service.js","Scheduler/Calendar.service.js","Scheduler/Component.service.js","Scheduler/CalendarController.js","Scheduler/CalendarListController.js","Scheduler/CalendarsController.js","Scheduler/ComponentController.js","Scheduler/sgCalendarDay.directive.js","Scheduler/sgCalendarDayBlock.directive.js","Scheduler/sgCalendarDayTable.directive.js","Scheduler/sgCalendarGhost.directive.js","Scheduler/sgCalendarListEvent.directive.js","Scheduler/sgCalendarListItem.directive.js","Scheduler/sgCalendarMonthDay.directive.js","Scheduler/sgCalendarMonthEvent.directive.js","Scheduler/sgCalendarPrintStylesheet.directive.js","Scheduler/sgCalendarScrollView.directive.js","Scheduler/sgCategoryStylesheet.directive.js","Scheduler/sgDraggableCalendarBlock.directive.js","Scheduler/sgFreebusy.directive.js","Scheduler/sgFreebusyDay.directive.js","Scheduler/sgNowLine.directive.js"],"names":["Attendees","component","this","attendees","_","forEach","attendee","image","$gravatar","email","workDaysOnly","slotStartTimeLimit","Date","setMinutes","setHours","dayStartHour","slotEndTimeLimit","dayEndHour","$days","$futureFreebusyData","updateFreeBusyCoverage","updateFreeBusy","length","getDays","$factory","$q","$timeout","$log","Settings","ROLES","Preferences","User","Card","Gravatar","Resource","angular","extend","$settings","$User","$Preferences","$Card","$$resource","activeUser","parseInt","defaults","SOGoDayStartTime","split","SOGoDayEndTime","module","e","constant","REQ_PARTICIPANT","OPT_PARTICIPANT","NON_PARTICIPANT","CHAIR","factory","timeToQuarters","dateTime","getHours","Math","ceil","getMinutes","prototype","getLength","initOrganizer","calendar","_this","promise","isSubscription","$filter","owner","then","results","organizer","uid","name","cn","c_email","when","updateFreeBusyAttendee","add","card","options","list","organizerCalendar","$isList","expandable","$find","container","c_name","$id","listId","refs","ref","c_cn","$preferredEmail","partial","role","partstat","c_uid","$avatarIcon","find","o","push","domain","c_domain","isMSExchange","ismsexchange","isGroup","isExpandableGroup","isResource","isresource","$$email","SOGoLDAPGroupExpansionEnabled","$members","members","findIndex","nextRole","roles","values","index","hasAttendee","emails","value","isDefined","remove","currentAttendee","splice","roundedStart","roundedEnd","startQuarter","endQuarter","freebusy","start","end","getTime","isAllDay","beginOfDay","daysUpTo","date","hourKey","currentDay","getDate","dayKey","getDayString","toString","isUndefined","addMinutes","coversFreeBusy","day","hour","quarter","refDate","sd","ed","formatFcn","delta","addDays","$mdDateLocaleProvider","formatDate","$dateFormat","SOGoLongDateFormat","stringWithSeparator","promises","filter","all","resource","days","params","sday","map","eday","userResource","intersection","keys","fetch","data","i","forwardFindDate","currentStart","foundDate","maxOffset","endLimit","duration","offset","firstStep","floor","currentEntries","indexOf","startLimit","foundTime","testDuration","setTime","forwardAdjustCurrentStart","getDay","backwardFindDate","lastIndexOf","testOffset","debug","backwardAdjustCurrentStart","findSlot","direction","findDate","adjustCurrentStart","clone","setSeconds","step","catch","err","mergeFreebusy","startDay","j","attendeeEntries","flatMap","count","reject","l","Calendar","futureCalendarData","init","id","newCalendarData","create","$unwrap","Component","Acl","$Component","$$Acl","$view","EventDragDayLength","EventDragHorizontalOffset","ConflictHTTPErrorCode","$defaultCalendar","SOGoDefaultCalendar","$findAll","active","$add","isWebCalendar","$webcalendars","$subscriptions","$calendars","sibling","localeCompare","settings","FoldersOrder","saveFoldersOrder","$reloadAll","writable","contextId","calendars","union","isOwned","acls","objectCreator","calendarData","group","login","$get","$getIndex","$subscribe","path","$addWebCalendar","url","d","defer","urls","webCalendarURL","post","isEditable","isRemote","JSON","stringify","undefined","resolve","response","status","reloadWebCalendars","$error","statusText","$deleteComponents","components","pid","uids","saveFoldersActivation","ids","request","folders","color","$acl","isSuperUser","$shadowData","$omit","$futureCalendarData","getClassName","base","$rename","$save","$delete","$reset","key","save","setCredentials","username","password","export","realOwnerId","type","filename","webDavICSURL","ownerPaths","substring","join","open","downloadProvisioningProfile","$setActivation","$getComponent","componentId","recurrenceId","isError","isObject","copy","futureComponentData","newComponentData","newguid","isNew","$rootScope","Component_STATUS","STATUS","$Attendees","timeFormat","$query","search","$queryEvents","sort","asc","filterpopup","$queryTasks","$refreshTimeout","$ghost","EventsFilterState","TasksFilterState","EventsSortingState","TasksSortingState","show_completed","ShowCompletedLine truncated
|
||||
{"version":3,"file":"Scheduler.services.js","sources":["Scheduler/Attendees.service.js","Scheduler/Calendar.service.js","Scheduler/Component.service.js","Scheduler/CalendarController.js","Scheduler/CalendarListController.js","Scheduler/CalendarsController.js","Scheduler/ComponentController.js","Scheduler/sgCalendarDay.directive.js","Scheduler/sgCalendarDayBlock.directive.js","Scheduler/sgCalendarDayTable.directive.js","Scheduler/sgCalendarGhost.directive.js","Scheduler/sgCalendarListEvent.directive.js","Scheduler/sgCalendarListItem.directive.js","Scheduler/sgCalendarMonthDay.directive.js","Scheduler/sgCalendarMonthEvent.directive.js","Scheduler/sgCalendarPrintStylesheet.directive.js","Scheduler/sgCalendarScrollView.directive.js","Scheduler/sgCategoryStylesheet.directive.js","Scheduler/sgDraggableCalendarBlock.directive.js","Scheduler/sgFreebusy.directive.js","Scheduler/sgFreebusyDay.directive.js","Scheduler/sgNowLine.directive.js"],"names":["Attendees","component","this","attendees","_","forEach","attendee","image","$gravatar","email","workDaysOnly","slotStartTimeLimit","Date","setMinutes","setHours","dayStartHour","slotEndTimeLimit","dayEndHour","$days","$futureFreebusyData","updateFreeBusyCoverage","updateFreeBusy","length","getDays","$factory","$q","$timeout","$log","Settings","ROLES","Preferences","User","Card","Gravatar","Resource","angular","extend","$settings","$User","$Preferences","$Card","$$resource","activeUser","parseInt","defaults","SOGoDayStartTime","split","SOGoDayEndTime","module","e","constant","REQ_PARTICIPANT","OPT_PARTICIPANT","NON_PARTICIPANT","CHAIR","factory","timeToQuarters","dateTime","getHours","Math","ceil","getMinutes","prototype","getLength","initOrganizer","calendar","_this","promise","isSubscription","$filter","owner","then","results","organizer","uid","name","cn","c_email","when","updateFreeBusyAttendee","add","card","options","list","organizerCalendar","$isList","expandable","$find","container","c_name","$id","listId","refs","ref","c_cn","$preferredEmail","partial","role","partstat","c_uid","$avatarIcon","find","o","push","domain","c_domain","isMSExchange","ismsexchange","isGroup","isExpandableGroup","isResource","isresource","$$email","SOGoLDAPGroupExpansionEnabled","$members","members","findIndex","nextRole","roles","values","index","hasAttendee","emails","value","isDefined","remove","currentAttendee","splice","roundedStart","roundedEnd","startQuarter","endQuarter","freebusy","start","end","getTime","isAllDay","beginOfDay","daysUpTo","date","hourKey","currentDay","getDate","dayKey","getDayString","toString","isUndefined","addMinutes","coversFreeBusy","day","hour","quarter","refDate","sd","ed","formatFcn","delta","addDays","$mdDateLocaleProvider","formatDate","$dateFormat","SOGoLongDateFormat","stringWithSeparator","promises","filter","all","resource","days","params","sday","map","eday","userResource","intersection","keys","fetch","data","i","forwardFindDate","currentStart","foundDate","maxOffset","endLimit","duration","offset","firstStep","floor","currentEntries","indexOf","startLimit","foundTime","testDuration","setTime","forwardAdjustCurrentStart","getDay","backwardFindDate","lastIndexOf","testOffset","debug","backwardAdjustCurrentStart","findSlot","direction","findDate","adjustCurrentStart","clone","setSeconds","step","catch","err","mergeFreebusy","startDay","j","attendeeEntries","flatMap","count","reject","l","Calendar","futureCalendarData","init","id","newCalendarData","create","$unwrap","Component","Acl","$Component","$$Acl","$view","EventDragDayLength","EventDragHorizontalOffset","ConflictHTTPErrorCode","$defaultCalendar","SOGoDefaultCalendar","$findAll","active","$add","isWebCalendar","$webcalendars","$subscriptions","$calendars","sibling","localeCompare","settings","FoldersOrder","saveFoldersOrder","$reloadAll","writable","contextId","calendars","union","isOwned","acls","objectCreator","calendarData","group","login","$get","$getIndex","$subscribe","path","$addWebCalendar","url","d","defer","urls","webCalendarURL","post","isEditable","isRemote","JSON","stringify","undefined","resolve","response","status","reloadWebCalendars","$error","statusText","$deleteComponents","components","pid","uids","saveFoldersActivation","ids","request","folders","color","$acl","isSuperUser","$shadowData","$omit","$futureCalendarData","getClassName","base","$rename","$save","$delete","$reset","key","save","setCredentials","username","password","export","realOwnerId","type","filename","webDavICSURL","ownerPaths","substring","join","open","downloadProvisioningProfile","$setActivation","$getComponent","componentId","recurrenceId","isError","isObject","copy","futureComponentData","newComponentData","newguid","isNew","$rootScope","Component_STATUS","STATUS","$Attendees","timeFormat","$query","search","$queryEvents","sort","asc","filterpopup","$queryTasks","$refreshTimeout","$ghost","EventsFilterState","TasksFilterState","EventsSortingState","TasksSortingState","show_completed","ShowCompletedLine truncated
|
||||
@@ -831,11 +831,36 @@
|
||||
* @param {number} index - the URL index in the list of attach URLs
|
||||
*/
|
||||
Component.prototype.deleteAttachUrl = function(index) {
|
||||
|
||||
if (index > -1 && this.attachUrls.length > index) {
|
||||
this.attachUrls.splice(index, 1);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @function hasJitsiUrl
|
||||
* @memberof Component.prototype
|
||||
* @desc Check if the there is a jisti url
|
||||
* @returns true if there is a jisti url
|
||||
*/
|
||||
Component.prototype.hasJitsiUrl = function() {
|
||||
if (angular.isUndefined(this.attachUrls)) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
var jitsiBaseUrl = "https://meet.jit.si";
|
||||
if(Component.$Preferences.defaults && Component.$Preferences.defaults.SOGoCalendarJitsiBaseUrl)
|
||||
jitsiBaseUrl = Component.$Preferences.defaults.SOGoCalendarJitsiBaseUrl;
|
||||
for (var i = 0; i < this.attachUrls.length; i++) {
|
||||
if (this.attachUrls[i].value.includes(jitsiBaseUrl)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @function $addDueDate
|
||||
* @memberof Component.prototype
|
||||
|
||||
@@ -232,6 +232,7 @@
|
||||
this.showAttendeesEditor = this.component.attendees && this.component.attendees.length;
|
||||
this.isFullscreen = (typeof screen.orientation !== 'undefined' && screen.orientation && 'portrait-primary' == screen.orientation.type);
|
||||
this.originalModalCancel = $mdDialog.cancel;
|
||||
this.preferences = Preferences;
|
||||
|
||||
if (this.component.type == 'appointment') {
|
||||
this.component.initAttendees();
|
||||
@@ -313,6 +314,15 @@
|
||||
focus('attachUrl_' + i);
|
||||
};
|
||||
|
||||
this.addJitsiUrl = function () {
|
||||
var jitsiBaseUrl = "https://meet.jit.si";
|
||||
if(this.preferences.defaults && this.preferences.defaults.SOGoCalendarJitsiBaseUrl)
|
||||
jitsiBaseUrl = this.preferences.defaults.SOGoCalendarJitsiBaseUrl;
|
||||
var jitsiUrl = jitsiBaseUrl + "/SOGo_meeting/" + crypto.randomUUID();
|
||||
var i = this.component.addAttachUrl(jitsiUrl);
|
||||
focus('attachUrl_' + i);
|
||||
};
|
||||
|
||||
this.toggleRecurrenceEditor = function () {
|
||||
this.showRecurrenceEditor = !this.showRecurrenceEditor;
|
||||
this.component.$hasCustomRepeat = this.showRecurrenceEditor;
|
||||
@@ -543,6 +553,7 @@
|
||||
this.adjustEndTime();
|
||||
this.changeAlarmRelation(form);
|
||||
this.addAttendee(this.searchText).then(function () {
|
||||
vm.adjustStartTime();
|
||||
if (form.$valid) {
|
||||
vm.component.$save(options)
|
||||
.then(function(data) {
|
||||
|
||||
@@ -525,7 +525,7 @@
|
||||
this.currentEventCoordinates.dayNumber += deltaDays;
|
||||
}
|
||||
|
||||
$log.debug('event coordinates ' + JSON.stringify(this.currentEventCoordinates));
|
||||
//$log.debug('event coordinates ' + JSON.stringify(this.currentEventCoordinates));
|
||||
$rootScope.$emit('calendar:drag');
|
||||
},
|
||||
|
||||
|
||||
+1
-1
@@ -1,2 +1,2 @@
|
||||
!function(e,t){"function"==typeof define&&define.amd?define([],t):"undefined"!=typeof exports?t():(t(),e.FileSaver={})}(this,function(){"use strict";var s="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0;function c(e,t,a){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){l(i.response,t,a)},i.onerror=function(){console.error("could not download file")},i.send()}function n(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return 200<=t.status&&t.status<=299}function r(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(e){var a=document.createEvent("MouseEvents");a.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(a)}}var d=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=s.saveAs||("object"!=typeof window||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!d?function(e,t,a){var i=s.URL||s.webkitURL,l=document.createElement("a");t=t||e.name||"download",l.download=t,l.rel="noopener","string"==typeof e?(l.href=e,l.origin!==location.origin?n(l.href)?c(e,t,a):r(l,l.target="_blank"):r(l)):(l.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(l.href)},4e4),setTimeout(function(){r(l)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,a){var i;t=t||e.name||"download","string"==typeof e?n(e)?c(e,t,a):((i=document.createElement("a")).href=e,i.target="_blank",setTimeout(function(){r(i)})):navigator.msSaveOrOpenBlob((e=e,void 0===(a=a)?a={autoBom:!1}:"object"!=typeof a&&(console.warn("Deprecated: Expected third argument to be a object"),a={autoBom:!a}),a.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e),t)}:function(e,t,a,i){if((i=i||open("","_blank"))&&(i.document.title=i.document.body.innerText="downloading..."),"string"==typeof e)return c(e,t,a);var l,n,r,t="application/octet-stream"===e.type,a=/constructor/i.test(s.HTMLElement)||s.safari,o=/CriOS\/[\d]+/.test(navigator.userAgent);(o||t&&a||d)&&"undefined"!=typeof FileReader?((l=new FileReader).onloadend=function(){var e=l.result,e=o?e:e.replace(/^data:[^;]*;/,"data:attachment/file;");i?i.location.href=e:location=e,i=null},l.readAsDataURL(e)):(n=s.URL||s.webkitURL,r=n.createObjectURL(e),i?i.location=r:location.href=r,i=null,setTimeout(function(){n.revokeObjectURL(r)},4e4))});s.saveAs=l.saveAs=l,"undefined"!=typeof module&&(module.exports=l)}),function(e){e=e.af=e.af||{};e.dictionary=Object.assign(e.dictionary||{},{"%0 of %1":"%0 van %1","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Block quote":"Verwysingsaanhaling",Bold:"Vet","Bold text":"",Cancel:"Kanselleer",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Content editing keystrokes":"","Execute the currently focused button":"","Insert code block":"Voeg bronkodeblok in",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Plain text":"Gewone skrif","Remove color":"Verwyder kleur","Remove Format":"Verwyder formatering","Restore default":"Herstel verstek",Save:"Stoor","Show more items":"Wys meer items",Strikethrough:"Deurstreep","Strikethrough text":"",Subscript:"Onderskrif",Superscript:"Boskrif","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"Onderstreep","Underline text":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""}),e.getPluralForm=function(e){return 1!=e}}(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={})),function(e){e=e.ar=e.ar||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align
Line truncated
|
||||
!function(e,t){"function"==typeof define&&define.amd?define([],t):"undefined"!=typeof exports?t():(t(),e.FileSaver={})}(this,function(){"use strict";var s="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0;function c(e,t,a){var i=new XMLHttpRequest;i.open("GET",e),i.responseType="blob",i.onload=function(){l(i.response,t,a)},i.onerror=function(){console.error("could not download file")},i.send()}function n(e){var t=new XMLHttpRequest;t.open("HEAD",e,!1);try{t.send()}catch(e){}return 200<=t.status&&t.status<=299}function r(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(e){var a=document.createEvent("MouseEvents");a.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(a)}}var d=s.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),l=s.saveAs||("object"!=typeof window||window!==s?function(){}:"download"in HTMLAnchorElement.prototype&&!d?function(e,t,a){var i=s.URL||s.webkitURL,l=document.createElement("a");t=t||e.name||"download",l.download=t,l.rel="noopener","string"==typeof e?(l.href=e,l.origin!==location.origin?n(l.href)?c(e,t,a):r(l,l.target="_blank"):r(l)):(l.href=i.createObjectURL(e),setTimeout(function(){i.revokeObjectURL(l.href)},4e4),setTimeout(function(){r(l)},0))}:"msSaveOrOpenBlob"in navigator?function(e,t,a){var i;t=t||e.name||"download","string"==typeof e?n(e)?c(e,t,a):((i=document.createElement("a")).href=e,i.target="_blank",setTimeout(function(){r(i)})):navigator.msSaveOrOpenBlob((e=e,void 0===(a=a)?a={autoBom:!1}:"object"!=typeof a&&(console.warn("Deprecated: Expected third argument to be a object"),a={autoBom:!a}),a.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)?new Blob([String.fromCharCode(65279),e],{type:e.type}):e),t)}:function(e,t,a,i){if((i=i||open("","_blank"))&&(i.document.title=i.document.body.innerText="downloading..."),"string"==typeof e)return c(e,t,a);var l,n,r,t="application/octet-stream"===e.type,a=/constructor/i.test(s.HTMLElement)||s.safari,o=/CriOS\/[\d]+/.test(navigator.userAgent);(o||t&&a||d)&&"undefined"!=typeof FileReader?((l=new FileReader).onloadend=function(){var e=l.result,e=o?e:e.replace(/^data:[^;]*;/,"data:attachment/file;");i?i.location.href=e:location=e,i=null},l.readAsDataURL(e)):(n=s.URL||s.webkitURL,r=n.createObjectURL(e),i?i.location=r:location.href=r,i=null,setTimeout(function(){n.revokeObjectURL(r)},4e4))});s.saveAs=l.saveAs=l,"undefined"!=typeof module&&(module.exports=l)}),function(e){e=e.af=e.af||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 van %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Verwysingsaanhaling",Blue:"","Blue marker":"",Bold:"Vet","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Kanselleer","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar"Line truncated
|
||||
//# sourceMappingURL=FileSaver.min.js.map
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"version":3,"file":"FileSaver.min.js","sources":["../../node_modules/file-saver/dist/FileSaver.js","ckeditor/build/translations/af.js","ckeditor/build/translations/ar.js","ckeditor/build/translations/ast.js","ckeditor/build/translations/az.js","ckeditor/build/translations/bg.js","ckeditor/build/translations/bn.js","ckeditor/build/translations/bs.js","ckeditor/build/translations/ca.js","ckeditor/build/translations/cs.js","ckeditor/build/translations/da.js","ckeditor/build/translations/de-ch.js","ckeditor/build/translations/de.js","ckeditor/build/translations/el.js","ckeditor/build/translations/en-au.js","ckeditor/build/translations/en-gb.js","ckeditor/build/translations/eo.js","ckeditor/build/translations/es-co.js","ckeditor/build/translations/es.js","ckeditor/build/translations/et.js","ckeditor/build/translations/eu.js","ckeditor/build/translations/fa.js","ckeditor/build/translations/fi.js","ckeditor/build/translations/fr.js","ckeditor/build/translations/gl.js","ckeditor/build/translations/gu.js","ckeditor/build/translations/he.js","ckeditor/build/translations/hi.js","ckeditor/build/translations/hr.js","ckeditor/build/translations/hu.js","ckeditor/build/translations/hy.js","ckeditor/build/translations/id.js","ckeditor/build/translations/it.js","ckeditor/build/translations/ja.js","ckeditor/build/translations/jv.js","ckeditor/build/translations/kk.js","ckeditor/build/translations/km.js","ckeditor/build/translations/kn.js","ckeditor/build/translations/ko.js","ckeditor/build/translations/ku.js","ckeditor/build/translations/lt.js","ckeditor/build/translations/lv.js","ckeditor/build/translations/ms.js","ckeditor/build/translations/nb.js","ckeditor/build/translations/ne.js","ckeditor/build/translations/nl.js","ckeditor/build/translations/no.js","ckeditor/build/translations/oc.js","ckeditor/build/translations/pl.js","ckeditor/build/translations/pt-br.js","ckeditor/build/translations/pt.js","ckeditor/build/translations/ro.js","ckeditor/build/translations/ru.js","ckeditor/build/translations/si.js","ckeditor/build/translations/sk.js","ckeditor/build/translations/sl.js","ckeditor/build/translations/sq.js","ckeditor/build/translations/sr-latn.js","ckeditor/build/translations/sr.js","ckeditor/build/translations/sv.js","ckeditor/build/translations/th.js","ckeditor/build/translations/tk.js","ckeditor/build/translations/tr.js","ckeditor/build/translations/tt.js","ckeditor/build/translations/ug.js","ckeditor/build/translations/uk.js","ckeditor/build/translations/ur.js","ckeditor/build/translations/uz.js","ckeditor/build/translations/vi.js","ckeditor/build/translations/zh-cn.js","ckeditor/build/translations/zh.js"],"names":["global","factory","define","amd","exports","FileSaver","this","_global","window","self","download","url","name","opts","xhr","XMLHttpRequest","open","responseType","onload","saveAs","response","onerror","console","error","send","corsEnabled","e","status","click","node","dispatchEvent","MouseEvent","evt","document","createEvent","initMouseEvent","isMacOSWebView","navigator","test","userAgent","HTMLAnchorElement","prototype","blob","URL","webkitURL","a","createElement","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","autoBom","warn","type","Blob","String","fromCharCode","popup","title","body","innerText","reader","force","isSafari","HTMLElement","safari","isChromeIOS","FileReader","onloadend","result","replace","readAsDataURL","module","t","dictionary","Object","assign","%0 of %1","Align center","Align left","Align right","Block quote","Bold","Bold text","Cancel","Clear","Close contextual balloons, dropdowns, and dialogs","Code","Content editing keystrokes","Execute the currently focused button","Insert code block","Italic","Italic text","Justify","Move focus between form fields (inputs, buttons, etc.)","Move focus to the toolbar, navigate between toolbars","Move out of an inline code style","Navigate through the toolbar","Open the accessibility help dialog","Plain text","Remove color","Remove Format","Restore default","Save","Show more items","Strikethrough","Strikethrough text","Subscript","Superscript","Text alignment","Text alignment toolbar","These keyboard shortcuts allow for quick access to content editing features.","Toggle caption off","Toggle caption on","Underline","Underline text","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.","User interface and content navigation keystrokes","getPluralForm","CKEDITOR_TRANSLATIONS","(may require <kbd>Fn</kbd>)","Accept","Accessibility help","Align cell text to the bottom","Align cell text to the center","Align cell text to the left","Align cell text to the middle","Align cell text to the right","Align cell text to the top","Align table to the left","Align table to the right","Alignment","All","Almost equal to","Angle","Approximately equal to","Aquamarine","Arrows","Asterisk operator","Austral sign","back with leftwards arrow above","Background","BelowLine truncated
|
||||
{"version":3,"file":"FileSaver.min.js","sources":["../../node_modules/file-saver/dist/FileSaver.js","ckeditor/build/translations/af.js","ckeditor/build/translations/ar.js","ckeditor/build/translations/ast.js","ckeditor/build/translations/az.js","ckeditor/build/translations/bg.js","ckeditor/build/translations/bn.js","ckeditor/build/translations/bs.js","ckeditor/build/translations/ca.js","ckeditor/build/translations/cs.js","ckeditor/build/translations/da.js","ckeditor/build/translations/de-ch.js","ckeditor/build/translations/de.js","ckeditor/build/translations/el.js","ckeditor/build/translations/en-au.js","ckeditor/build/translations/en-gb.js","ckeditor/build/translations/eo.js","ckeditor/build/translations/es-co.js","ckeditor/build/translations/es.js","ckeditor/build/translations/et.js","ckeditor/build/translations/eu.js","ckeditor/build/translations/fa.js","ckeditor/build/translations/fi.js","ckeditor/build/translations/fr.js","ckeditor/build/translations/gl.js","ckeditor/build/translations/gu.js","ckeditor/build/translations/he.js","ckeditor/build/translations/hi.js","ckeditor/build/translations/hr.js","ckeditor/build/translations/hu.js","ckeditor/build/translations/hy.js","ckeditor/build/translations/id.js","ckeditor/build/translations/it.js","ckeditor/build/translations/ja.js","ckeditor/build/translations/jv.js","ckeditor/build/translations/kk.js","ckeditor/build/translations/km.js","ckeditor/build/translations/kn.js","ckeditor/build/translations/ko.js","ckeditor/build/translations/ku.js","ckeditor/build/translations/lt.js","ckeditor/build/translations/lv.js","ckeditor/build/translations/ms.js","ckeditor/build/translations/nb.js","ckeditor/build/translations/ne.js","ckeditor/build/translations/nl.js","ckeditor/build/translations/no.js","ckeditor/build/translations/oc.js","ckeditor/build/translations/pl.js","ckeditor/build/translations/pt-br.js","ckeditor/build/translations/pt.js","ckeditor/build/translations/ro.js","ckeditor/build/translations/ru.js","ckeditor/build/translations/si.js","ckeditor/build/translations/sk.js","ckeditor/build/translations/sl.js","ckeditor/build/translations/sq.js","ckeditor/build/translations/sr-latn.js","ckeditor/build/translations/sr.js","ckeditor/build/translations/sv.js","ckeditor/build/translations/th.js","ckeditor/build/translations/ti.js","ckeditor/build/translations/tk.js","ckeditor/build/translations/tr.js","ckeditor/build/translations/tt.js","ckeditor/build/translations/ug.js","ckeditor/build/translations/uk.js","ckeditor/build/translations/ur.js","ckeditor/build/translations/uz.js","ckeditor/build/translations/vi.js","ckeditor/build/translations/zh-cn.js","ckeditor/build/translations/zh.js"],"names":["global","factory","define","amd","exports","FileSaver","this","_global","window","self","download","url","name","opts","xhr","XMLHttpRequest","open","responseType","onload","saveAs","response","onerror","console","error","send","corsEnabled","e","status","click","node","dispatchEvent","MouseEvent","evt","document","createEvent","initMouseEvent","isMacOSWebView","navigator","test","userAgent","HTMLAnchorElement","prototype","blob","URL","webkitURL","a","createElement","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","autoBom","warn","type","Blob","String","fromCharCode","popup","title","body","innerText","reader","force","isSafari","HTMLElement","safari","isChromeIOS","FileReader","onloadend","result","replace","readAsDataURL","module","t","af","dictionary","Object","assign","(may require <kbd>Fn</kbd>)","%0 of %1","Accept","Accessibility","Accessibility help","Align cell text to the bottom","Align cell text to the center","Align cell text to the left","Align cell text to the middle","Align cell text to the right","Align cell text to the top","Align center","Align left","Align right","Align table to the left","Align table to the right","Alignment","All","Almost equal to","Angle","Approximately equal to","Aquamarine","Arrows","Asterisk operator","Austral sign","back with leftwards arrow above","Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.","Big","Bitcoin sign","Black","Block quote","Blue","Blue marker","Bold","Bold text","Border","Break text","Bulleted List","Bulleted list styles toolbar","Cancel","Caption for image: %0","Caption for the image","Category","Cedi sign","Cell properties","Cent sign","Center table","Centered image","Change image text alternative","Choose heading","Circle","Clear","Click to edit block","Close","Close contextual balloons, dropdowns, and dialogs","Code","Code block","Colon sign","Color","Color picker","Column","Contains as member","Content editing keystrokes","Copy selected content","Copyright sign","Create link","Cruzeiro sign","Currency","Currency sign","Custom","Custom image size","Dashed","Decimal","Decimal with leading zero","Decrease indent","Decrease list item indent","Default","Degree sign","Delete column","Delete row","Dim greLine truncated
|
||||
@@ -1,6 +1,7 @@
|
||||
(function(t){const e=t["en"]=t["en"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(may require <kbd>Fn</kbd>)","%0 of %1":"%0 of %1",Accept:"Accept","Accessibility help":"Accessibility help","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Below, you can find a list of keyboard shortcuts that can be used in the editor.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"Bold text",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Character categories":"Character categories","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"Click to edit block",Close:"Close","Close contextual balloons, dropdowns, and dialogs":"Close contextual balloons, dropdowns, and dialogs",Code:"Code","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"Content editing keystrokes","Copy selected content":"Copy selected content","Copyright sign":"Copyright sign","Create link":"Create link","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"Decrease list item indent",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"Drag to move","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"Editor dialog","Editor editing area: %0":"Editor editing area: %0","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button":"Execute the currently focused button","Font Background Color":"Font Background Color","Font Color":"Font Color","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"HeadinLine truncated
|
||||
!function(t){const e=t.en=t.en||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(may require <kbd>Fn</kbd>)","%0 of %1":"%0 of %1",Accept:"Accept",Accessibility:"Accessibility","Accessibility help":"Accessibility help","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align center","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Below, you can find a list of keyboard shortcuts that can be used in the editor.",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"Bold text",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image",Category:"Category","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Center table","Centered image":"Centered image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"Click to edit block",Close:"Close","Close contextual balloons, dropdowns, and dialogs":"Close contextual balloons, dropdowns, and dialogs",Code:"Code","Code block":"Code block","Colon sign":"Colon sign",Color:"Color","Color picker":"Color picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"Content editing keystrokes","Copy selected content":"Copy selected content","Copyright sign":"Copyright sign","Create link":"Create link","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Custom:"Custom","Custom image size":"Custom image size",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"Decrease list item indent",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colors","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"Drag to move","Dropdown menu":"Dropdown menu","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"Editor dialog","Editor menu bar":"Editor menu bar","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Entering %0 code snippet":"Entering %0 code snippet","Entering a to-do list":"Entering a to-do list","Entering code snippet":"Entering code snippet","Error during image upload":"Error during image upload","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.","Font Background Color":"Font Background Color","Font Color":"Font Color","Font Family":"Font Family","Font Size":"Font SLine truncated
|
||||
/*!
|
||||
* @license Copyright (c) 2003-2024, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
|
||||
* For licensing, see LICENSE.md.
|
||||
*/(function t(e,n){if(typeof exports==="object"&&typeof module==="object")module.exports=n();else if(typeof define==="function"&&define.amd)define([],n);else if(typeof exports==="object")exports["ClassicEditor"]=n();else e["ClassicEditor"]=n()})(self,(()=>(()=>{var t={5659:(t,e,n)=>{const i=n(8156);const o={};for(const t of Object.keys(i)){o[i[t]]=t}const r={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};t.exports=r;for(const t of Object.keys(r)){if(!("channels"in r[t])){throw new Error("missing channels property: "+t)}if(!("labels"in r[t])){throw new Error("missing channel labels property: "+t)}if(r[t].labels.length!==r[t].channels){throw new Error("channel and label counts mismatch: "+t)}const{channels:e,labels:n}=r[t];delete r[t].channels;delete r[t].labels;Object.defineProperty(r[t],"channels",{value:e});Object.defineProperty(r[t],"labels",{value:n})}r.rgb.hsl=function(t){const e=t[0]/255;const n=t[1]/255;const i=t[2]/255;const o=Math.min(e,n,i);const r=Math.max(e,n,i);const s=r-o;let a;let c;if(r===o){a=0}else if(e===r){a=(n-i)/s}else if(n===r){a=2+(i-e)/s}else if(i===r){a=4+(e-n)/s}a=Math.min(a*60,360);if(a<0){a+=360}const l=(o+r)/2;if(r===o){c=0}else if(l<=.5){c=s/(r+o)}else{c=s/(2-r-o)}return[a,c*100,l*100]};r.rgb.hsv=function(t){let e;let n;let i;let o;let r;const s=t[0]/255;const a=t[1]/255;const c=t[2]/255;const l=Math.max(s,a,c);const d=l-Math.min(s,a,c);const u=function(t){return(l-t)/6/d+1/2};if(d===0){o=0;r=0}else{r=d/l;e=u(s);n=u(a);i=u(c);if(s===l){o=i-n}else if(a===l){o=1/3+e-i}else if(c===l){o=2/3+n-e}if(o<0){o+=1}else if(o>1){o-=1}}return[o*360,r*100,l*100]};r.rgb.hwb=function(t){const e=t[0];const n=t[1];let i=t[2];const o=r.rgb.hsl(t)[0];const s=1/255*Math.min(e,Math.min(n,i));i=1-1/255*Math.max(e,Math.max(n,i));return[o,s*100,i*100]};r.rgb.cmyk=function(t){const e=t[0]/255;const n=t[1]/255;const i=t[2]/255;const o=Math.min(1-e,1-n,1-i);const r=(1-e-o)/(1-o)||0;const s=(1-n-o)/(1-o)||0;const a=(1-i-o)/(1-o)||0;return[r*100,s*100,a*100,o*100]};function s(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}r.rgb.keyword=function(t){const e=o[t];if(e){return e}let n=Infinity;let r;for(const e of Object.keys(i)){const o=i[e];const a=s(t,o);if(a<n){n=a;r=e}}return r};r.keyword.rgb=function(t){return i[t]};r.rgb.xyz=function(t){let e=t[0]/255;let n=t[1]/255;let i=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92;n=n>.04045?((n+.055)/1.055)**2.4:n/12.92;i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;const o=e*.4124+n*.3576+i*.1805;const r=e*.2126+n*.7152+i*.0722;const s=e*.0193+n*.1192+i*.9505;return[o*100,r*100,s*100]};r.rgb.lab=function(t){const e=r.rgb.xyz(t);let n=e[0];let i=e[1];let o=e[2];n/=95.047;i/=100;o/=108.883;n=n>.008856?n**(1/3):7.787*n+16/116;i=i>.008856?i**(1/3):7.787*i+16/116;o=o>.008856?o**(1/3):7.787*o+16/116;const s=116*i-16;const a=500*(n-i);const c=200*(i-o);return[s,a,c]};r.hsl.rgb=function(t){const e=t[0]/360;const n=t[1]/100;const i=t[2]/100;let o;let r;let s;if(n===0){s=i*255;return[s,s,s]}if(i<.5){o=i*(1+n)}else{o=i+n-i*n}const a=2*i-o;const c=[0,0,0];for(let t=0;t<3;t++){r=e+1/3*-(t-1);if(r<0){r++}if(r>1){r--}if(6*r<1){s=a+(o-a)*6*r}else if(2*r<1){s=o}else if(3*r<2){s=a+(o-a)*(2/3-r)*6}else{s=a}c[t]=s*255}return c};r.hsl.hsv=function(t){const e=t[0];let n=t[1]/100;let i=t[2]/100;let o=n;const r=Math.max(i,.01);i*=2;n*=i<=1?i:2-i;o*=r<=1?r:2-r;const s=(i+n)/2;const a=i===0?2*o/(r+o):2*n/(i+n);return[e,a*100,s*100]};r.hsv.rgb=function(t){const e=t[0]/60;const n=t[1]/100;let i=t[2]/100;const o=Math.floor(e)%6;const r=e-Math.floor(e);const s=255*i*(1-n);const a=255*i*(1-n*r);const c=255*i*(1-n*(1-r));i*=255;switch(o){case 0:return[i,c,s];case 1:return[a,i,s];case 2:return[s,i,c];case 3:return[s,a,i];case 4:return[c,s,i];case 5:return[i,s,a]}};r.hsv.hsl=function(t){const e=t[0];const n=t[1]/100;const i=t[2]/100;const o=Math.max(i,.01);let r;let s;s=(2-n)*i;const a=(2-n)*o;r=n*o;r/=a<=1?a:2-a;r=r||0;s/=2;return[e,r*100,s*100]};r.hwb.rgb=function(t){const e=t[0]/360;let n=t[1]/100;let i=t[2]/100;const o=n+i;let r;if(o>1){n/=o;i/=o}const s=Math.floor(6*e);const a=1-i;r=6*e-s;if((s&1)!==0){r=1-r}const c=n+r*(a-n);let l;let d;let u;switch(s){default:case 6:case 0:l=a;d=c;u=n;break;case 1:l=c;d=a;u=n;break;case 2:l=n;d=a;u=c;break;case 3:l=n;d=c;u=a;break;case 4:l=c;d=n;u=a;break;case 5:l=a;d=n;u=c;break}return[l*255,d*255,u*255]};r.cmyk.rgb=function(t){const e=t[0]/100;const n=t[1]/100;const i=t[2]/100;const o=t[3]/100;const r=1-Math.min(1,e*(1-o)+o);const s=1-Math.min(1,n*(1-o)+o);const a=1-Math.min(1,i*(1-o)+o);returnLine truncated
|
||||
*/
|
||||
function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClassicEditor=e():t.ClassicEditor=e()}(self,(function(){return function(){var t,e,n={5659:function(t,e,n){const i=n(8156),o={};for(const t of Object.keys(i))o[i[t]]=t;const r={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};t.exports=r;for(const t of Object.keys(r)){if(!("channels"in r[t]))throw new Error("missing channels property: "+t);if(!("labels"in r[t]))throw new Error("missing channel labels property: "+t);if(r[t].labels.length!==r[t].channels)throw new Error("channel and label counts mismatch: "+t);const{channels:e,labels:n}=r[t];delete r[t].channels,delete r[t].labels,Object.defineProperty(r[t],"channels",{value:e}),Object.defineProperty(r[t],"labels",{value:n})}r.rgb.hsl=function(t){const e=t[0]/255,n=t[1]/255,i=t[2]/255,o=Math.min(e,n,i),r=Math.max(e,n,i),s=r-o;let a,c;r===o?a=0:e===r?a=(n-i)/s:n===r?a=2+(i-e)/s:i===r&&(a=4+(e-n)/s),a=Math.min(60*a,360),a<0&&(a+=360);const l=(o+r)/2;return c=r===o?0:l<=.5?s/(r+o):s/(2-r-o),[a,100*c,100*l]},r.rgb.hsv=function(t){let e,n,i,o,r;const s=t[0]/255,a=t[1]/255,c=t[2]/255,l=Math.max(s,a,c),d=l-Math.min(s,a,c),u=function(t){return(l-t)/6/d+.5};return 0===d?(o=0,r=0):(r=d/l,e=u(s),n=u(a),i=u(c),s===l?o=i-n:a===l?o=1/3+e-i:c===l&&(o=2/3+n-e),o<0?o+=1:o>1&&(o-=1)),[360*o,100*r,100*l]},r.rgb.hwb=function(t){const e=t[0],n=t[1];let i=t[2];const o=r.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(n,i));return i=1-1/255*Math.max(e,Math.max(n,i)),[o,100*s,100*i]},r.rgb.cmyk=function(t){const e=t[0]/255,n=t[1]/255,i=t[2]/255,o=Math.min(1-e,1-n,1-i);return[100*((1-e-o)/(1-o)||0),100*((1-n-o)/(1-o)||0),100*((1-i-o)/(1-o)||0),100*o]},r.rgb.keyword=function(t){const e=o[t];if(e)return e;let n,r=1/0;for(const e of Object.keys(i)){const o=i[e],c=(a=o,((s=t)[0]-a[0])**2+(s[1]-a[1])**2+(s[2]-a[2])**2);c<r&&(r=c,n=e)}var s,a;return n},r.keyword.rgb=function(t){return i[t]},r.rgb.xyz=function(t){let e=t[0]/255,n=t[1]/255,i=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,n=n>.04045?((n+.055)/1.055)**2.4:n/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;return[100*(.4124*e+.3576*n+.1805*i),100*(.2126*e+.7152*n+.0722*i),100*(.0193*e+.1192*n+.9505*i)]},r.rgb.lab=function(t){const e=r.rgb.xyz(t);let n=e[0],i=e[1],o=e[2];n/=95.047,i/=100,o/=108.883,n=n>.008856?n**(1/3):7.787*n+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;return[116*i-16,500*(n-i),200*(i-o)]},r.hsl.rgb=function(t){const e=t[0]/360,n=t[1]/100,i=t[2]/100;let o,r,s;if(0===n)return s=255*i,[s,s,s];o=i<.5?i*(1+n):i+n-i*n;const a=2*i-o,c=[0,0,0];for(let t=0;t<3;t++)r=e+1/3*-(t-1),r<0&&r++,r>1&&r--,s=6*r<1?a+6*(o-a)*r:2*r<1?o:3*r<2?a+(o-a)*(2/3-r)*6:a,c[t]=255*s;return c},r.hsl.hsv=function(t){const e=t[0];let n=t[1]/100,i=t[2]/100,o=n;const r=Math.max(i,.01);i*=2,n*=i<=1?i:2-i,o*=r<=1?r:2-r;return[e,100*(0===i?2*o/(r+o):2*n/(i+n)),100*((i+n)/2)]},r.hsv.rgb=function(t){const e=t[0]/60,n=t[1]/100;let i=t[2]/100;const o=Math.floor(e)%6,r=e-Math.floor(e),s=255*i*(1-n),a=255*i*(1-n*r),c=255*i*(1-n*(1-r));switch(i*=255,o){case 0:return[i,c,s];case 1:return[a,i,s];case 2:return[s,i,c];case 3:return[s,a,i];case 4:return[c,s,i];case 5:return[i,s,a]}},r.hsv.hsl=function(t){const e=t[0],n=t[1]/100,i=t[2]/100,o=Math.max(i,.01);let r,s;s=(2-n)*i;const a=(2-n)*o;return r=n*o,r/=a<=1?a:2-a,r=r||0,s/=2,[e,100*r,100*s]},r.hwb.rgb=function(t){const e=t[0]/360;let n=t[1]/100,i=t[2]/100;const o=n+i;let r;o>1&&(n/=o,i/=o);const s=Math.floor(6*e),a=1-i;r=6*e-s,1&s&&(r=1-r);const c=n+r*(a-n);let l,d,u;switch(s){default:case 6:case 0:l=a,d=c,u=n;break;case 1:l=c,d=a,u=n;break;case 2:l=n,d=a,u=c;break;case 3:l=n,d=c,u=a;break;case 4:l=c,d=n,u=a;break;case 5:l=a,d=n,u=c}return[255*l,255*d,255*u]},r.cmyk.rgb=function(t){const e=t[0]/100,n=t[1]/100,i=t[2]/100,o=t[3]/100;return[255*(1-Math.min(1,e*(1-o)+o)),255*(1-Math.min(1,n*(1-o)+o)),255*(1-Math.min(1,i*(1-o)+o))]},r.xyz.rgb=function(t){const e=t[0]/100,n=t[1]/100,i=t[2]/100;let o,r,s;return o=3.2406*e+-1.5372*n+-.4986*i,r=-.9689*e+1.8758*n+.0415*i,s=.0557*e+-.204*n+1.057*i,o=o>.0031308?1.055*o**(1/2.4)-.055:12.92*o,r=r>.0031308?1.055*r**(1/2.4)-.055:12.92*r,s=s>.0031308?1.055*s**(1/2.4)-.055:12.92*s,o=Math.min(Math.max(0,o),1),r=Math.min(Math.max(0,r),1),s=Math.min(Math.max(0,s),1),[255*o,255*r,255*s]},r.xyz.lab=function(t){let e=t[0],n=t[1],i=t[2];e/=95.047,n/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,n=n>.008856?n**(1/3):7.787*n+16/116,iLine truncated
|
||||
//# sourceMappingURL=ckeditor.js.map
|
||||
@@ -1 +1 @@
|
||||
{"version":3,"file":"ckeditor.js","mappings":";;;;AAAA","sources":["webpack://ClassicEditor/webpack/universalModuleDefinition"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClassicEditor\"] = factory();\n\telse\n\t\troot[\"ClassicEditor\"] = factory();\n})(self, () => {\nreturn "],"names":[],"sourceRoot":""}
|
||||
{"version":3,"file":"ckeditor.js","mappings":"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 truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["af"]=e["af"]||{};t.dictionary=Object.assign(t.dictionary||{},{"%0 of %1":"%0 van %1","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Block quote":"Verwysingsaanhaling",Bold:"Vet","Bold text":"",Cancel:"Kanselleer",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Content editing keystrokes":"","Execute the currently focused button":"","Insert code block":"Voeg bronkodeblok in",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","Open the accessibility help dialog":"","Plain text":"Gewone skrif","Remove color":"Verwyder kleur","Remove Format":"Verwyder formatering","Restore default":"Herstel verstek",Save:"Stoor","Show more items":"Wys meer items",Strikethrough:"Deurstreep","Strikethrough text":"",Subscript:"Onderskrif",Superscript:"Boskrif","Text alignment":"Teksbelyning","Text alignment toolbar":"Teksbelyning nutsbank","These keyboard shortcuts allow for quick access to content editing features.":"","Toggle caption off":"","Toggle caption on":"",Underline:"Onderstreep","Underline text":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
||||
!function(t){const e=t.af=t.af||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 van %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Belyn in die middel","Align left":"Belyn links","Align right":"Belyn regs","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Verwysingsaanhaling",Blue:"","Blue marker":"",Bold:"Vet","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Kanselleer","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Bronkode","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code><br></code> element)":"","Insert code block":"Voeg bronkodeblok in","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Kursief","Italic text":"",Justify:"Belyn beide kante","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letterLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["ar"]=t["ar"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",All:"الكل","Almost equal to":"يساوي على الأرجح",Angle:"علامة الزاوية","Approximately equal to":"يساوي تقريباً",Aquamarine:"أخضر زبرجد",Arrows:"أسهم","Asterisk operator":"علامة الضرب (النجمة)","Austral sign":"رمز الأسترال","back with leftwards arrow above":'"عودة" أعلاها سهم يتجه يساراً',Background:"الخلفية","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"ستجد أدناه قائمة باختصارات لوحة المفاتيح التي يمكن استخدامها في المحرِّر.",Big:"كبير","Bitcoin sign":"رمز البيتكوين",Black:"أسود","Block quote":"اقتباس",Blue:"أزرق","Blue marker":"تحديد ازرق",Bold:"عريض","Bold text":"نص غامق",Border:"الحدود","Break text":"اعتراض النص","Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"شريط أدوات أنماط قوائم التعداد النقطي",Cancel:"إلغاء","Caption for image: %0":"التسمية التوضيحية للصورة: %0","Caption for the image":"التسمية التوضيحية للصورة","Cedi sign":"رمز السيدي","Cell properties":"خصائص الخلية","Cent sign":"رمز السنت","Center table":"قم بمحاذاة الجدول إلى المنتصف","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Character categories":"فئات الأحرف","Choose heading":"اختر عنوان",Circle:"دائرة",Clear:"مسح","Click to edit block":"انقر لتحرير الوحدة التجميعية",Close:"إغلاق","Close contextual balloons, dropdowns, and dialogs":"أغلقْ البالونات السياقية والقوائم المنسدلة ومربعات الحوار",Code:"شفرة برمجية","Colon sign":"رمز الكولون",Color:"اللون","Color picker":"أداة انتقاء الألوان",Column:"عمود","Contains as member":"يحتوي كعضو","Content editing keystrokes":"ضغطة المفاتيح لتحرير المحتوى","Copy selected content":"انسخْ المحتوى المحدد","Copyright sign":'علامة "حق التأليف والنشر"',"Create link":"قمْ بإنشاء رابط","Cruzeiro sign":"رمز الكروزيرو",Currency:"عملة","Currency sign":"رمز العملة",Dashed:"متقطع",Decimal:"رقم عشري","Decimal with leading zero":"رقم عشري مع البدء بصفر ","Decrease indent":"تقليص المسافة البادئة","Decrease list item indent":"تقليل المسافة البادئة لعنصر القائمة",Default:"افتراضي","Degree sign":"علامة الدرجة","Delete column":"حذف العمود","Delete row":"حذف الصف","Dim grey":"رمادي خافت",Dimensions:"الابعاد",Disc:"قرص","Division sign":"علامة القسمة","Document colors":"ألوان المستند","Dollar sign":"رمز الدولار","Dong sign":"رمز الدونغ",Dotted:"منقط",Double:"مزدوج","Double dagger":"رمز الخنجر المزدوج","Double exclamation mark":"علامة تعجّب مزدوجة","Double low-9 quotation mark":"علامة تنصيص 9 منخفضة، مزدوجة","Double question mark":"علامة استفهام مزدوجة",Downloadable:"يمكن تنزيله","downwards arrow to bar":"سهم لأسفل يشير إلى خط","downwards dashed arrow":"سهم متقطع متجه لأسفل","downwards double arrow":"سهم مزدوج متجه لأسفل","downwards simple arrow":"سهم بسيط يشير إلى الأسفل","Drachma sign":"رمز الدراخما","Drag to move":"اسحب للنقل","Dropdown toolbar":"شريط أدوات القائمة المنسدلة","EditLine truncated
|
||||
!function(t){const e=t.ar=t.ar||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(قد يتطلب <kbd>مفتاح Fn</kbd>)","%0 of %1":"%0 من %1",Accept:"قبول",Accessibility:"إمكانية الوصول","Accessibility help":"تعليمات إمكانية الوصول","Align cell text to the bottom":"قم بمحاذاة نص الخلية للاسفل","Align cell text to the center":"قم بمحاذاة نص الخلية إلى المركز","Align cell text to the left":"قم بمحاذاة نص الخلية إلى اليسار","Align cell text to the middle":"قم بمحاذاة نص الخلية إلى المنتصف","Align cell text to the right":"قم بمحاذاة نص الخلية إلى اليمين","Align cell text to the top":"قم بمحاذاة نص الخلية إلى الأعلى","Align center":"محاذاة في المنتصف","Align left":"محاذاة لليسار","Align right":"محاذاة لليمين","Align table to the left":"قم بمحاذاة الجدول إلى اليسار","Align table to the right":"قم بمحاذاة الجدول إلى اليمين",Alignment:"المحاذاة",All:"الكل","Almost equal to":"يساوي على الأرجح",Angle:"علامة الزاوية","Approximately equal to":"يساوي تقريباً",Aquamarine:"أخضر زبرجد",Arrows:"أسهم","Asterisk operator":"علامة الضرب (النجمة)","Austral sign":"رمز الأسترال","back with leftwards arrow above":'"عودة" أعلاها سهم يتجه يساراً',Background:"الخلفية","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"ستجد أدناه قائمة باختصارات لوحة المفاتيح التي يمكن استخدامها في المحرِّر.",Big:"كبير","Bitcoin sign":"رمز البيتكوين",Black:"أسود","Block quote":"اقتباس",Blue:"أزرق","Blue marker":"تحديد ازرق",Bold:"عريض","Bold text":"نص غامق",Border:"الحدود","Break text":"اعتراض النص","Bulleted List":"قائمة نقطية","Bulleted list styles toolbar":"شريط أدوات أنماط قوائم التعداد النقطي",Cancel:"إلغاء","Caption for image: %0":"التسمية التوضيحية للصورة: %0","Caption for the image":"التسمية التوضيحية للصورة",Category:"الفئة","Cedi sign":"رمز السيدي","Cell properties":"خصائص الخلية","Cent sign":"رمز السنت","Center table":"قم بمحاذاة الجدول إلى المنتصف","Centered image":"صورة بالوسط","Change image text alternative":"غير النص البديل للصورة","Choose heading":"اختر عنوان",Circle:"دائرة",Clear:"مسح","Click to edit block":"انقر لتحرير الوحدة التجميعية",Close:"إغلاق","Close contextual balloons, dropdowns, and dialogs":"أغلقْ البالونات السياقية والقوائم المنسدلة ومربعات الحوار",Code:"شفرة برمجية","Code block":"كتلة تعليمات برمجية","Colon sign":"رمز الكولون",Color:"اللون","Color picker":"أداة انتقاء الألوان",Column:"عمود","Contains as member":"يحتوي كعضو","Content editing keystrokes":"ضغطة المفاتيح لتحرير المحتوى","Copy selected content":"انسخْ المحتوى المحدد","Copyright sign":'علامة "حق التأليف والنشر"',"Create link":"قمْ بإنشاء رابط","Cruzeiro sign":"رمز الكروزيرو",Currency:"عملة","Currency sign":"رمز العملة",Custom:"مخصص","Custom image size":"حجم مخصص للصورة",Dashed:"متقطع",Decimal:"رقم عشري","Decimal with leading zero":"رقم عشري مع البدء بصفر ","Decrease indent":"تقليص المسافة البادئة","Decrease list item indent":"تقليل المسافة البادئة لعنصر القائمة",Default:"افتراضي","Degree sign":"علامة الدرجة","Delete column":"حذف العمود","Delete row":"حذف الصف","Dim grey":"رمادي خافت",Dimensions:"الابعاد",Disc:"قرص","Division sign":"علامة القسمة","Document colors":"ألوان المستند","Dollar sign":"رمز الدولار","Dong sign":"رمز الدونغ",Dotted:"منقط",Double:"مزدوج","Double dagger":"رمز الخنجر المزدوج","Double exclamation mark":"علامة تعجّب مزدوجة","Double low-9 quotation mark":"علامة تنصيص 9 منخفضة، مزدوجة","Double question mark":"علامة استفهام مزدوجة",Downloadable:"يمكن تنزيله","downwards arrow to bar":"سهم لأسفل يشير إلى خط","downwards dashed arrow":"سهم متقطع متجه لأسفل","downwards double arrow":"سهم مزدوج متجه لأسفل","downwards simple arrow":"سهم بسيط يشير إلى الأسفل","Drachma sign":"رمزLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["ast"]=e["ast"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"",Aquamarine:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Black:"",Blue:"",Bold:"Negrina","Bold text":"","Break text":"","Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Cancel:"Encaboxar","Caption for image: %0":"","Caption for the image":"","Centered image":"","Change image text alternative":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Content editing keystrokes":"","Create link":"",Decimal:"","Decimal with leading zero":"","Decrease list item indent":"","Dim grey":"",Disc:"",Downloadable:"","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Enter image caption":"","Execute the currently focused button":"","Full size image":"Imaxen a tamañu completu",Green:"",Grey:"","Help Contents. To close this dialog press ESC.":"",HEX:"","Image resize list":"","Image toolbar":"","image widget":"complementu d'imaxen","In line":"","Increase list item indent":"",Insert:"","Insert image":"","Insert image via URL":"","Invalid start index value.":"",Italic:"Cursiva","Italic text":"","Keystrokes that can be used in a list":"","Left aligned image":"","Light blue":"","Light green":"","Light grey":"",Link:"Enllazar","Link image":"","Link URL":"URL del enllaz","List properties":"","Lower-latin":"","Lower–roman":"","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Navigate through the toolbar":"",Next:"","No results found":"","No searchable items":"","Numbered List":"Llista numberada","Numbered list styles toolbar":"","Open in a new tab":"","Open link in new tab":"","Open the accessibility help dialog":"",Orange:"",Original:"","Press %0 for help.":"",Previous:"",Purple:"",Red:"",Redo:"Refacer","Remove color":"","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"","Resize image to %0":"","Resize image to the original size":"","Restore default":"","Reversed order":"","Rich Text Editor":"Editor de testu arriquecíu","Right aligned image":"",Save:"Guardar","Show more items":"","Side image":"Imaxen llateral",Square:"","Start at":"","Start index must be greater than 0.":"",Strikethrough:"","Strikethrough text":"",Subscript:"",Superscript:"","Text alternative":"","These keyboard shortcuts allow for quick access to content editing features.":"","This link has no URL":"","To-do List":"","Toggle caption off":"","Toggle caption on":"","Toggle the circle list style":"","Toggle the decimal list style":"","Toggle the decimal with leading zero list style":"","Toggle the disc list style":"","Toggle the lower–latin list style":"","Toggle the lower–roman list style":"","Toggle the square list style":"","Toggle the upper–latin list style":"","Toggle the upper–roman list style":"",Turquoise:"",Underline:"","Underline text":"",Undo:"Desfacer",Unlink:"Desenllazar",Update:"","Update image URL":"","Upload failed":"","Upload from computer":"","Upload image from computer":"","Upper-latin":"","Upper-roman":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"",White:"","Wrap text":"",Yellow:""});t.getPluralForm=function(e){return e!=1}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
||||
!function(t){const e=t.ast=t.ast||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"","Align left":"","Align right":"","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"",Blue:"","Blue marker":"",Bold:"Negrina","Bold text":"",Border:"","Break text":"","Bulleted List":"Llista con viñetes","Bulleted list styles toolbar":"",Cancel:"Encaboxar","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"","Change image text alternative":"","Choose heading":"",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"","Font Color":"","Font Family":"","Font Size":"","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Imaxen a tamañu completu","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"","Heading 1":"","Heading 2":"","Heading 3":"","Heading 4":"","Heading 5":"","Heading 6":"",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"complementu d'imaxen","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code><br></code> element)":"","Insert code block":"","Insert column left":"","Insert column right":"","Insert HTML":"","Insert image":"","Insert image via URL":"","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Cursiva","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Kip sign":"",Latin:"","Latin capital letter a with breve":"","Latin capital letter a with macron":"","Latin capital letter a with ogonek":"","Latin capital letter c with acute":"","Latin capital letter c wiLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["az"]=t["az"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%1-dən %0",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"Akvamarin",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"Fon","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Böyük","Bitcoin sign":"",Black:"Qara","Block quote":"Sitat bloku",Blue:"Mavi","Blue marker":"Mavi marker",Bold:"Yarıqalın","Bold text":"",Border:"Sərhəd","Break text":"","Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Cancel:"İmtina et","Caption for image: %0":"","Caption for the image":"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Character categories":"","Choose heading":"Başlıqı seç",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Colon sign":"",Color:"Rəng","Color picker":"",Column:"Sütun","Contains as member":"","Content editing keystrokes":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Boş yeri kiçilt","Decrease list item indent":"",Default:"Default","Degree sign":"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil","Dim grey":"Tünd boz",Dimensions:"Ölçülər",Disc:"","Division sign":"","Document colors":"Rənglər","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Yüklənə bilər","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"aşağı ikiqat ox","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Edit link":"Linki redaktə et","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"Redaktorun paneli","Element of":"","Em dash":"","Empty set":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Şəkil başlığı daxil edin","Enter table caption":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button":"","Font Background Color":"Şrift Fonunun Rəngi","Font Color":"Şrift Rəngi","Font Family":"Şrift ailəsi","Font Size":"Şrift ölçüsü","For all":"","Fraction slash":"","French franc sign":"","Full size image":"Tam ölçülü şəkili","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"Yaşıl","Green marker":"Yaşıl marker","Green pen":"Yaşıl qələm",Grey:"Boz",Groove:"","Guarani sign":"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Height:"Hündürlük","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Vurğulamaq","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"",Huge:"Nəhəng","Identical to":"","Image resize list":"","Image toolbar":"Şəkil paneli","image widget":"Şəkil vidgetı","In line":"","Increase indent":"Boş yeri böyüt","Increase list item indent":"","Indian rupee sign":"",Infinity:"",Insert:"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert code block":"Kod blokunu əlavə et","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert image":"Şəkili əlavə et","Insert image via URL":"","Insert media":"Media əlavə ed","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"Aşağıya sətir əlavə et","Insert row below":"Yuxarıya sətir əlavə et","Insert table":"Cədvəli əlavə et",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Maili","Italic text":"",Justify:"Eninə görə","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that canLine truncated
|
||||
!function(t){const e=t.az=t.az||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%1-dən %0",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Mərkəzə düzləndir","Align left":"Soldan düzləndir","Align right":"Sağdan düzləndir","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"Akvamarin",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"Fon","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Böyük","Bitcoin sign":"",Black:"Qara","Block quote":"Sitat bloku",Blue:"Mavi","Blue marker":"Mavi marker",Bold:"Yarıqalın","Bold text":"",Border:"Sərhəd","Break text":"","Bulleted List":"Markerlənmiş siyahı","Bulleted list styles toolbar":"",Cancel:"İmtina et","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Mərkəzə düzləndir","Change image text alternative":"Alternativ mətni redaktə et","Choose heading":"Başlıqı seç",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Code block":"","Colon sign":"",Color:"Rəng","Color picker":"",Column:"Sütun","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"Boş yeri kiçilt","Decrease list item indent":"",Default:"Default","Degree sign":"","Delete column":"Sütunları sil","Delete row":"Sətirləri sil","Dim grey":"Tünd boz",Dimensions:"Ölçülər",Disc:"","Division sign":"","Document colors":"Rənglər","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Yüklənə bilər","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"aşağı ikiqat ox","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"Açılan paneli","Edit block":"Redaktə etmək bloku","Edit link":"Linki redaktə et","Edit source":"","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"Redaktorun paneli","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"","En dash":"","end with leftwards arrow above":"","Enter image caption":"Şəkil başlığı daxil edin","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Şrift Fonunun Rəngi","Font Color":"Şrift Rəngi","Font Family":"Şrift ailəsi","Font Size":"Şrift ölçüsü","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Tam ölçülü şəkili","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"Yaşıl","Green marker":"Yaşıl marker","Green pen":"Yaşıl qələm",Grey:"Boz",Groove:"","Guarani sign":"","Header column":"Başlıqlı sütun","Header row":"Başlıqlı sətir",Heading:"Başlıq","Heading 1":"Başlıq 1","Heading 2":"Başlıq 2","Heading 3":"Başlıq 3","Heading 4":"Başlıq 4","Heading 5":"Başlıq 5","Heading 6":"Başlıq 6",Height:"Hündürlük","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Vurğulamaq","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"",Huge:"Nəhəng","Identical to":"",Image:"","Image from computer":"","Image resize list":"","Image toolbar":"Şəkil paneli","Image upload complete":"","Image via URL":"","image widget":"Şəkil vidgetı","In line":"","Increase indent":"Boş yeri böyüt","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code><br></code> element)":"","Insert code block":"Kod blokunu əlavə et","Insert column left":"Sola sütun əlavə et","Insert column right":"Sağa sütun əlavə et","Insert HTML":"","Insert image":"Şəkili əlavə et","InLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["bg"]=t["bg"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(може да изисква <kbd>Fn</kbd>)","%0 of %1":"%0 от %1",Accept:"Приемане","Accessibility help":"Помощ за достъпност","Align cell text to the bottom":"Подравни текста в клетката към дъното","Align cell text to the center":"Подравни текста в клетката централно","Align cell text to the left":"Подравни текста в клетката наляво","Align cell text to the middle":"Подравни текста в клетката към средата","Align cell text to the right":"Подравни текста в клетката надясно","Align cell text to the top":"Подравни текста в клетката нагоре","Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване","Align table to the left":"Подравни таблицата наляво","Align table to the right":"Подравни таблицата надясно",Alignment:"Подравняване",All:"Всички","Almost equal to":"Почти равно на",Angle:"Ъгъл","Approximately equal to":"Приблизително равно на",Aquamarine:"Аквамарин",Arrows:"Стрелки","Asterisk operator":"Оператор звездичка","Austral sign":"Символ на аустрал","back with leftwards arrow above":"назад със стрелка наляво отгоре",Background:"Фон","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Долу можете да намерите списък от клавишни комбинации, които могат да се използват в редактора.",Big:"Едър","Bitcoin sign":"Символ на Биткойн",Black:"Черен","Block quote":"Цитат",Blue:"Син","Blue marker":"Син маркер",Bold:"Удебелен","Bold text":"Почернен текст",Border:"Граница","Break text":"Раздели текст","Bulleted List":"Водещи символи","Bulleted list styles toolbar":"Лента със стилове за подточки",Cancel:"Отказ","Caption for image: %0":"Заглавие на изображението: %0","Caption for the image":"Заглавие на изображението","Cedi sign":"Символ Седи","Cell properties":"Свойства на клетки","Cent sign":"Символ на цент","Center table":"Центрирай таблицата","Centered image":"Центрирано изображение","Change image text alternative":"Промени изображението на текстовата алтернатива","Character categories":"Категории символи","Choose heading":"Избери заглавие",Circle:"Кръг",Clear:"Изчисти","Click to edit block":"Кликнете, за да редактирате блок",Close:"Затвори","Close contextual balloons, dropdowns, and dialogs":"Затваряне на балоните с контекст, падащите менюта и диалогови прозорци",Code:"Код","Colon sign":"Символ двоеточие",Color:"Цвят","Color picker":"Избор на цвят",Column:"Колона","Contains as member":"Съдържа като член","Content editing keystrokes":"Клавишни комбинации за редактиране на съдържание","Copy selected content":"Копиране на избраното съдържание","Copyright sign":"Знак за авторски права","Create link":"Създаване на линк","Cruzeiro sign":"Символ Крузейро",Currency:"Валутни символи","Currency sign":"Символ на валута",Dashed:"На черти",Decimal:"Десетичен","Decimal with leading zero":"Десетичен с водеща нула","Decrease indent":"Намали отстъпа","Decrease list item indent":"Намаляване на шрифта на елемент от списъка",Default:"По подразбиране","Degree sign":"Знак за степен","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред","Dim grey":"Тъмно сив",Dimensions:"Размери",Disc:"Диск","Division sign":"Знак за деление","Document colors":"Цвят на документа","Dollar sign":"Символ на долар","Dong sign":"Символ на донг",Dotted:"На точки",Double:"Двоен","Double dagger":"Двойна кама","Double exclamation mark":"Двоен удивителен знак","Double low-9 quotation mark":"Двойна ниска 9-кавичка","Double question mark":"Двоен въпросLine truncated
|
||||
!function(t){const e=t.bg=t.bg||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(може да изисква <kbd>Fn</kbd>)","%0 of %1":"%0 от %1",Accept:"Приемане",Accessibility:"Достъпност","Accessibility help":"Помощ за достъпност","Align cell text to the bottom":"Подравни текста в клетката към дъното","Align cell text to the center":"Подравни текста в клетката централно","Align cell text to the left":"Подравни текста в клетката наляво","Align cell text to the middle":"Подравни текста в клетката към средата","Align cell text to the right":"Подравни текста в клетката надясно","Align cell text to the top":"Подравни текста в клетката нагоре","Align center":"Централно подравняване","Align left":"Ляво подравняване","Align right":"Дясно подравняване","Align table to the left":"Подравни таблицата наляво","Align table to the right":"Подравни таблицата надясно",Alignment:"Подравняване",All:"Всички","Almost equal to":"Почти равно на",Angle:"Ъгъл","Approximately equal to":"Приблизително равно на",Aquamarine:"Аквамарин",Arrows:"Стрелки","Asterisk operator":"Оператор звездичка","Austral sign":"Символ на аустрал","back with leftwards arrow above":"назад със стрелка наляво отгоре",Background:"Фон","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Долу можете да намерите списък от клавишни комбинации, които могат да се използват в редактора.",Big:"Едър","Bitcoin sign":"Символ на Биткойн",Black:"Черен","Block quote":"Цитат",Blue:"Син","Blue marker":"Син маркер",Bold:"Удебелен","Bold text":"Почернен текст",Border:"Граница","Break text":"Раздели текст","Bulleted List":"Водещи символи","Bulleted list styles toolbar":"Лента със стилове за подточки",Cancel:"Отказ","Caption for image: %0":"Заглавие на изображението: %0","Caption for the image":"Заглавие на изображението",Category:"Категория","Cedi sign":"Символ Седи","Cell properties":"Свойства на клетки","Cent sign":"Символ на цент","Center table":"Центрирай таблицата","Centered image":"Центрирано изображение","Change image text alternative":"Промени изображението на текстовата алтернатива","Choose heading":"Избери заглавие",Circle:"Кръг",Clear:"Изчисти","Click to edit block":"Кликнете, за да редактирате блок",Close:"Затвори","Close contextual balloons, dropdowns, and dialogs":"Затваряне на балоните с контекст, падащите менюта и диалогови прозорци",Code:"Код","Code block":"Кодов блок","Colon sign":"Символ двоеточие",Color:"Цвят","Color picker":"Избор на цвят",Column:"Колона","Contains as member":"Съдържа като член","Content editing keystrokes":"Клавишни комбинации за редактиране на съдържание","Copy selected content":"Копиране на избраното съдържание","Copyright sign":"Знак за авторски права","Create link":"Създаване на линк","Cruzeiro sign":"Символ Крузейро",Currency:"Валутни символи","Currency sign":"Символ на валута",Custom:"Потребителски","Custom image size":"Потребителски размер на изображението",Dashed:"На черти",Decimal:"Десетичен","Decimal with leading zero":"Десетичен с водеща нула","Decrease indent":"Намали отстъпа","Decrease list item indent":"Намаляване на шрифта на елемент от списъка",Default:"По подразбиране","Degree sign":"Знак за степен","Delete column":"Изтриване на колона","Delete row":"Изтриване на ред","Dim grey":"Тъмно сив",Dimensions:"Размери",Disc:"Диск","Division sign":"Знак за деление","Document colors":"Цвят на документа","Dollar sign":"Символ на долар","Dong sign":"Символ на донг",Dotted:"На точки",Double:"Двоен","Double dagger":"Двойна кама","Double exclamation marLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["bn"]=t["bn"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(<kbd>Fn[</kbd>] এর প্রয়োজন হতে পারে)","%0 of %1":"%0 এর %1",Accept:"গ্রহণ করুন","Accessibility help":"প্রবেশযোগ্যতা জন্য সহায়তা","Align cell text to the bottom":"নীচে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the center":"কেন্দ্রে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the left":"বাম দিকে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the middle":"মাঝখানে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the right":"ডানদিকে সেল টেক্সট সারিবদ্ধ করুন ","Align cell text to the top":"শীর্ষে সেল টেক্সট সারিবদ্ধ করুন","Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন","Align table to the left":"বাম দিকে টেবিল সারিবদ্ধ করুন","Align table to the right":"ডানদিকে টেবিলটি সারিবদ্ধ করুন",Alignment:"সারিবদ্ধকরণ",All:"সকল","Almost equal to":"প্রায় সমান",Angle:"কোণ","Approximately equal to":"প্রায় সমান",Aquamarine:"ফেকাশে সবুজবর্ণ",Arrows:"তীর","Asterisk operator":"অস্ট্রিক অপারেটর","Austral sign":"অস্ট্রাল চিহ্ন","back with leftwards arrow above":"ব্যাক এর উপরে বামমুখী তীর",Background:"ব্যাকগ্রাউন্ড","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"এডিটরে ব্যবহার করা যেতে পারে এমন কীবোর্ড শর্টকাটগুলির একটি তালিকা আপনি নিচে দেখতে পাবেন।",Big:"বড়","Bitcoin sign":"বিটকয়েনের চিহ্ন",Black:"কালো","Block quote":"ব্লক কোট",Blue:"নীল ","Blue marker":"নীল মার্কার",Bold:"বোল্ড","Bold text":"বোল্ড টেক্সট",Border:"বর্ডার ","Break text":"টেক্সট ভেঙ্গে ফেলুন","Bulleted List":"বুলেটযুক্ত তালিকা","Bulleted list styles toolbar":"বুলেটেড তালিকা স্টাইল টুলবার",Cancel:"বাতিল করুন","Caption for image: %0":"ছবির জন্য ক্যাপশন: %0","Caption for the image":"ছবির জন্য ক্যাপশন","Cedi sign":"সেডি চিহ্ন","Cell properties":"সেল বৈশিষ্ট্য","Cent sign":"সেন্ট চিহ্ন","Center table":"কেন্দ্রের টেবিল","Centered image":"কেন্দ্রীভূত ছবি","Change image text alternative":"ছবির টেক্সট বিকল্প পরিবর্তন","Character categories":"অক্ষরের শ্রেণীবিভাগসমূহ","Choose heading":"শিরোনাম নির্বাচন করুন",Circle:"বৃত্ত",Clear:"পরিষ্কার করুন","Click to edit block":"ব্লক এডিট করতে ক্লিক করুন",Close:"বন্ধ করুন","Close contextual balloons, dropdowns, and dialogs":"কন্টেক্সচুয়াল বেলুন, ড্রপডাউন এবং ডায়ালগগুলি বন্ধ করুন",Code:"কোড","Colon sign":"কোলন চিহ্ন",Color:" রং","Color picker":"রং বাছাইকারী",Column:"কলাম","Contains as member":"সদস্য হিসেবে রয়েছে","Content editing keystrokes":"কনটেন্ট এডিটিংয়ের কীস্ট্রোকগুলি","Copy selected content":"সিলেক্ট করা কন্টেন্ট কপি করুন","Copyright sign":"কপিরাইট চিহ্ন","Create link":"লিঙ্ক তৈরি করুন","Cruzeiro sign":"ত্রুুজেইরো চিহ্ন",Currency:"মুদ্রা","Currency sign":"মুদ্রার চিহ্ন",Dashed:"ড্যাশড",Decimal:"দশমিক","Decimal with leading zero":"অগ্রণী 0 সহ দশমিক ","Decrease indent":"ইন্ডেন্ট হ্রাস
Line truncated
|
||||
!function(t){const e=t.bn=t.bn||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(<kbd>Fn[</kbd>] এর প্রয়োজন হতে পারে)","%0 of %1":"%0 এর %1",Accept:"গ্রহণ করুন",Accessibility:"প্রবেশযোগ্যতা","Accessibility help":"প্রবেশযোগ্যতা জন্য সহায়তা","Align cell text to the bottom":"নীচে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the center":"কেন্দ্রে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the left":"বাম দিকে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the middle":"মাঝখানে সেল টেক্সট সারিবদ্ধ করুন","Align cell text to the right":"ডানদিকে সেল টেক্সট সারিবদ্ধ করুন ","Align cell text to the top":"শীর্ষে সেল টেক্সট সারিবদ্ধ করুন","Align center":"কেন্দ্র সারিবদ্ধ করুন","Align left":"বামে সারিবদ্ধ করুন","Align right":"ডানদিকে সারিবদ্ধ করুন","Align table to the left":"বাম দিকে টেবিল সারিবদ্ধ করুন","Align table to the right":"ডানদিকে টেবিলটি সারিবদ্ধ করুন",Alignment:"সারিবদ্ধকরণ",All:"সকল","Almost equal to":"প্রায় সমান",Angle:"কোণ","Approximately equal to":"প্রায় সমান",Aquamarine:"ফেকাশে সবুজবর্ণ",Arrows:"তীর","Asterisk operator":"অস্ট্রিক অপারেটর","Austral sign":"অস্ট্রাল চিহ্ন","back with leftwards arrow above":"ব্যাক এর উপরে বামমুখী তীর",Background:"ব্যাকগ্রাউন্ড","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"এডিটরে ব্যবহার করা যেতে পারে এমন কীবোর্ড শর্টকাটগুলির একটি তালিকা আপনি নিচে দেখতে পাবেন।",Big:"বড়","Bitcoin sign":"বিটকয়েনের চিহ্ন",Black:"কালো","Block quote":"ব্লক কোট",Blue:"নীল ","Blue marker":"নীল মার্কার",Bold:"বোল্ড","Bold text":"বোল্ড টেক্সট",Border:"বর্ডার ","Break text":"টেক্সট ভেঙ্গে ফেলুন","Bulleted List":"বুলেটযুক্ত তালিকা","Bulleted list styles toolbar":"বুলেটেড তালিকা স্টাইল টুলবার",Cancel:"বাতিল করুন","Caption for image: %0":"ছবির জন্য ক্যাপশন: %0","Caption for the image":"ছবির জন্য ক্যাপশন",Category:"ক্যাটাগরি","Cedi sign":"সেডি চিহ্ন","Cell properties":"সেল বৈশিষ্ট্য","Cent sign":"সেন্ট চিহ্ন","Center table":"কেন্দ্রের টেবিল","Centered image":"কেন্দ্রীভূত ছবি","Change image text alternative":"ছবির টেক্সট বিকল্প পরিবর্তন","Choose heading":"শিরোনাম নির্বাচন করুন",Circle:"বৃত্ত",Clear:"পরিষ্কার করুন","Click to edit block":"ব্লক এডিট করতে ক্লিক করুন",Close:"বন্ধ করুন","Close contextual balloons, dropdowns, and dialogs":"কন্টেক্সচুয়াল বেলুন, ড্রপডাউন এবং ডায়ালগগুলি বন্ধ করুন",Code:"কোড","Code block":"কোড ব্লক","Colon sign":"কোলন চিহ্ন",Color:" রং","Color picker":"রং বাছাইকারী",Column:"কলাম","Contains as member":"সদস্য হিসেবে রয়েছে","Content editing keystrokes":"কনটেন্ট এডিটিংয়ের কীস্ট্রোকগুলি","Copy selected content":"সিলেক্ট করা কন্টেন্ট কপি করুন","Copyright sign":"কপিরাইট চিহ্ন","Create link":"লিঙ্ক তৈরি করুন","Cruzeiro sign":"ত্রুুজেইরো চিহ্ন",Currency:"মুদ্রা","Currency sign":"মুদ্রার চিহ্ন",Custom:"কাস্টম","Custom image size":"কাস্টম ইমেজ সাইজ",Dashed:"ড্যাশড",Decimal:"দশমিক","DecimaLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const a=e["bs"]=e["bs"]||{};a.dictionary=Object.assign(a.dictionary||{},{"%0 of %1":"%0 od %1","Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje",Big:"","Block quote":"Citat",Bold:"Podebljano","Bold text":"","Break text":"",Cancel:"Poništi","Caption for image: %0":"","Caption for the image":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni ALT atribut za sliku","Choose heading":"Odaberi naslov",Clear:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Content editing keystrokes":"",Default:"Zadani","Document colors":"","Edit source":"Uredi izvor","Empty snippet content":"HTML odlomak nema sadžaj","Enter image caption":"Unesi naziv slike","Execute the currently focused button":"","Font Background Color":"Boja pozadine","Font Color":"Boja","Font Family":"Font","Font Size":"Veličina fonta","Full size image":"",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6","HTML snippet":"HTML odlomak",Huge:"","Image resize list":"Lista veličina slike","Image toolbar":"","image widget":"","In line":"",Insert:"Umetni","Insert code block":"Umetni kod blok","Insert HTML":"Umetni HTML","Insert image":"Umetni sliku","Insert image via URL":"Umetni sliku preko URLa",Italic:"Zakrivljeno","Italic text":"",Justify:"","Left aligned image":"Lijevo poravnata slika","Move focus between form fields (inputs, buttons, etc.)":"","Move focus to the toolbar, navigate between toolbars":"","Move out of an inline code style":"","Navigate through the toolbar":"","No preview available":"Pregled nedostupan","Open the accessibility help dialog":"",Original:"Original",Paragraph:"Paragraf","Paste raw HTML here...":"Zalijepi HTML ovdje...","Plain text":"Tekst","Remove color":"Ukloni boju","Replace from computer":"","Replace image":"","Replace image from computer":"","Resize image":"Promijeni veličinu slike","Resize image to %0":"","Resize image to the original size":"Postavi originalnu veličinu slike","Restore default":"Vrati na zadano","Right aligned image":"Desno poravnata slika",Save:"Sačuvaj","Save changes":"Sačuvaj izmjene","Show more items":"Prikaži više stavki","Side image":"",Small:"",Strikethrough:"Precrtano","Strikethrough text":"",Subscript:"",Superscript:"","Text alignment":"Poravnanje teksta","Text alignment toolbar":"Traka za poravnanje teksta","Text alternative":"ALT atribut","These keyboard shortcuts allow for quick access to content editing features.":"",Tiny:"","Toggle caption off":"","Toggle caption on":"","Type or paste your content here.":"Unesite ili zalijepite vaš sadržaj ovdje","Type your title":"Unesite naslov",Underline:"Podcrtano","Underline text":"",Update:"Ažuriraj","Update image URL":"Ažuriraj URL slike","Upload failed":"Učitavanje slike nije uspjelo","Upload from computer":"","Upload image from computer":"","Use the following keystrokes for more efficient navigation in the CKEditor 5 user interface.":"","User interface and content navigation keystrokes":"","Wrap text":"Prelomi tekst"});a.getPluralForm=function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2}})(window.CKEDITOR_TRANSLATIONS||(window.CKEDITOR_TRANSLATIONS={}));
|
||||
!function(t){const e=t.bs=t.bs||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 od %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Centrirati","Align left":"Lijevo poravnanje","Align right":"Desno poravnanje","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"","Bitcoin sign":"",Black:"","Block quote":"Citat",Blue:"","Blue marker":"",Bold:"Podebljano","Bold text":"",Border:"","Break text":"","Bulleted List":"","Bulleted list styles toolbar":"",Cancel:"Poništi","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"Centrirana slika","Change image text alternative":"Promijeni ALT atribut za sliku","Choose heading":"Odaberi naslov",Circle:"",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Kod","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"","Decimal with leading zero":"","Decrease indent":"","Decrease list item indent":"",Default:"Zadani","Degree sign":"","Delete column":"","Delete row":"","Dim grey":"",Dimensions:"",Disc:"","Division sign":"","Document colors":"","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"","Edit source":"Uredi izvor","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"HTML odlomak nema sadžaj","En dash":"","end with leftwards arrow above":"","Enter image caption":"Unesi naziv slike","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Boja pozadine","Font Color":"Boja","Font Family":"Font","Font Size":"Veličina fonta","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"","Green pen":"",Grey:"",Groove:"","Guarani sign":"","Header column":"","Header row":"",Heading:"Naslov","Heading 1":"Naslov 1","Heading 2":"Naslov 2","Heading 3":"Naslov 3","Heading 4":"Naslov 4","Heading 5":"Naslov 5","Heading 6":"Naslov 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"HTML odlomak",Huge:"","Identical to":"",Image:"","Image from computer":"","Image resize list":"Lista veličina slike","Image toolbar":"","Image upload complete":"","Image via URL":"","image widget":"","In line":"","Increase indent":"","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code><br></code> element)":"","Insert code block":"Umetni kod blok","Insert column left":"","Insert column right":"","Insert HTML":"Umetni HTML","Insert image":"Umetni sliku","Insert image via URL":"Umetni sliku preko URLa","Insert media":"","Insert paragraph after block":"","Insert paragraph before block":"","Insert row above":"","Insert row below":"","Insert table":"","Insert via URL":"",Inset:"",Integral:"",Intersection:"","Invalid start index value.":"","Inverted exclamation mark":"","Inverted question mark":"",Italic:"Zakrivljeno","Italic text":"",Justify:"","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"Line truncated
|
||||
@@ -1 +1 @@
|
||||
(function(a){const e=a["ca"]=a["ca"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(pot requerir <kbd>Fn</kbd>))","%0 of %1":"%0 de %1",Accept:"Accepta","Accessibility help":"Ajuda d'accessibilitat","Align cell text to the bottom":"Alinear el text de la cel·la a la part inferior","Align cell text to the center":"Alinear el text de la cel·la al centre","Align cell text to the left":"Alinear el text de la cel·la a l'esquerra","Align cell text to the middle":"Alinear el text de la cel·la al centre","Align cell text to the right":"Alinear el text de la cel·la a la dreta","Align cell text to the top":"Alinear el text de la cel·la a la part superior","Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta","Align table to the left":"Alinear la taula a l'esquerra","Align table to the right":"Alinear la taula a la dreta",Alignment:"Alineació",All:"Tot","Almost equal to":"Gairebé igual a",Angle:"Angle","Approximately equal to":"Aproximadament igual a",Aquamarine:"Aiguamarina",Arrows:"Fletxes","Asterisk operator":"Operador d'asterisc","Austral sign":"signe de l'austral","back with leftwards arrow above":"back amb fletxa cap a l'esquerra per sobre",Background:"Fons","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Sota hi trobareu un llistat de dreceres del teclat que podeu emprar amb aquest editor.",Big:"Gran","Bitcoin sign":"signe del bitcoin",Black:"Negre","Block quote":"Cita de bloc",Blue:"Blau","Blue marker":"Marcador blau",Bold:"Negreta","Bold text":"Text en negreta",Border:"Vora","Break text":"Partir el text","Bulleted List":"Llista amb vinyetes","Bulleted list styles toolbar":"Barra d'eines d'estils de llista amb vinyetes",Cancel:"Cancel·lar","Caption for image: %0":"Peu de foto: %0","Caption for the image":"Peu de foto","Cedi sign":"ok","Cell properties":"Propietats de la cel·la","Cent sign":"signe del cèntim","Center table":"Centrar la taula","Centered image":"Imatge centrada","Change image text alternative":"Canviar l'alternativa del text de la imatge","Character categories":"Categories de caràcters","Choose heading":"Escull capçalera",Circle:"Cercle",Clear:"Esborra","Click to edit block":"Fes clic per editar el bloc",Close:"Tanca","Close contextual balloons, dropdowns, and dialogs":"Tanca finestres contextuals, desplegables i diàlegs",Code:"Codi","Colon sign":"signe del còlon",Color:"Color","Color picker":"Selector de colors",Column:"Columna","Contains as member":"Conté com a membre","Content editing keystrokes":"Tecles edició de contingut","Copy selected content":"Copia el contingut seleccionat","Copyright sign":"Signe de drets d'autor","Create link":"Crea un enllaç","Cruzeiro sign":"signe del cruzeiro",Currency:"Moneda","Currency sign":"signe de divisa",Dashed:"De guions",Decimal:"Decimal","Decimal with leading zero":"Decimal amb un zero al davant","Decrease indent":"Reduir el sagnat","Decrease list item indent":"Redueix el sagnat de l'element de la llista",Default:"Predeterminada","Degree sign":"Signe del grau","Delete column":"Suprimir la columna","Delete row":"Suprimir fila","Dim grey":"Gris fosc",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Signe de divisió","Document colors":"Colors del document","Dollar sign":"signe del dòlar","Dong sign":"signe del dong",Dotted:"De punts",Double:"Doble","Double dagger":"Doble obelisc o diesi","Double exclamation mark":"Doble signe d'exclamació","Double low-9 quotation mark":"Cometes dobles inferiors","Double question mark":"Doble signe d'interrogació",Downloadable:"Es pot descarregar","downwards arrow to bar":"fletxa cap a la barra de sota","downwards dashed arrow":"fletxa discontínua cap avall","downwards double arrow":"fletxa doble cap avall","downwards simple arrow":"fletxa simple cap avall","Drachma sign":"signe del dracma","Drag to move":"Arrossega per moure","Dropdown toolbar":"Barra d'eines desplegable","Edit block":"Editar bloc","Edit link":"Editar enllaç","Edit source":"Editar la font","Editor block content toolbar":"Barra d'eines de contingut del bloc de l'editor","Editor contextual toolbar":"Barra d'eines contextual de l'editor","Editor dialog":"Diàleg de l'editor","Editor editing area: %0":"Àrea d'edició d'editor: %0","Editor toolbar":"Barra d'eines de l'editor","Element of":"Element de","Em dash":"Guió llarg","Empty set":"Conjunt buit","Empty snippet content":"Contingut del fragment buit","En dash":"Guió mitjà","end with leftwards arrow above":"end amb fletxa cap a l'esquerra per sobre","Enter image caption":"Introduir el peu de foto de la imatge","Enter table caption":"Introduir el peu de foto de la taula","Euro sign":"signe de l'euro","Euro-currency sign":"signe de l'eurodivisa","Exclamation question mark":"Signe d'interrogació d'exclamació","Execute the currently focused button":"Executa el botó seleccionat","Font Background Color":"Color de fons del tipus de lletra","Font Color":"Color del tipLine truncated
|
||||
!function(a){const e=a.ca=a.ca||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(pot requerir <kbd>Fn</kbd>))","%0 of %1":"%0 de %1",Accept:"Accepta",Accessibility:"Accessibilitat","Accessibility help":"Ajuda d'accessibilitat","Align cell text to the bottom":"Alinear el text de la cel·la a la part inferior","Align cell text to the center":"Alinear el text de la cel·la al centre","Align cell text to the left":"Alinear el text de la cel·la a l'esquerra","Align cell text to the middle":"Alinear el text de la cel·la al centre","Align cell text to the right":"Alinear el text de la cel·la a la dreta","Align cell text to the top":"Alinear el text de la cel·la a la part superior","Align center":"Alineació centre","Align left":"Alineació esquerra","Align right":"Alineació dreta","Align table to the left":"Alinear la taula a l'esquerra","Align table to the right":"Alinear la taula a la dreta",Alignment:"Alineació",All:"Tot","Almost equal to":"Gairebé igual a",Angle:"Angle","Approximately equal to":"Aproximadament igual a",Aquamarine:"Aiguamarina",Arrows:"Fletxes","Asterisk operator":"Operador d'asterisc","Austral sign":"signe de l'austral","back with leftwards arrow above":"back amb fletxa cap a l'esquerra per sobre",Background:"Fons","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Sota hi trobareu un llistat de dreceres del teclat que podeu emprar amb aquest editor.",Big:"Gran","Bitcoin sign":"signe del bitcoin",Black:"Negre","Block quote":"Cita de bloc",Blue:"Blau","Blue marker":"Marcador blau",Bold:"Negreta","Bold text":"Text en negreta",Border:"Vora","Break text":"Parteix el text","Bulleted List":"Llista amb vinyetes","Bulleted list styles toolbar":"Barra d'eines d'estils de llista amb vinyetes",Cancel:"Cancel·lar","Caption for image: %0":"Peu de foto: %0","Caption for the image":"Peu de foto",Category:"Categoria","Cedi sign":"ok","Cell properties":"Propietats de la cel·la","Cent sign":"signe del cèntim","Center table":"Centrar la taula","Centered image":"Imatge centrada","Change image text alternative":"Canviar l'alternativa del text de la imatge","Choose heading":"Trieu l'encapçalament",Circle:"Cercle",Clear:"Esborra","Click to edit block":"Fes clic per editar el bloc",Close:"Tanca","Close contextual balloons, dropdowns, and dialogs":"Tanca finestres contextuals, desplegables i diàlegs",Code:"Codi","Code block":"Bloc de codis","Colon sign":"signe del còlon",Color:"Color","Color picker":"Selector de colors",Column:"Columna","Contains as member":"Conté com a membre","Content editing keystrokes":"Tecles edició de contingut","Copy selected content":"Copia el contingut seleccionat","Copyright sign":"Signe de drets d'autor","Create link":"Crea un enllaç","Cruzeiro sign":"signe del cruzeiro",Currency:"Moneda","Currency sign":"signe de divisa",Custom:"Personalitzat","Custom image size":"Mida de la imatge personalitzada",Dashed:"De guions",Decimal:"Decimal","Decimal with leading zero":"Decimal amb un zero al davant","Decrease indent":"Reduir el sagnat","Decrease list item indent":"Redueix el sagnat de l'element de la llista",Default:"Predeterminada","Degree sign":"Signe del grau","Delete column":"Suprimir la columna","Delete row":"Suprimir fila","Dim grey":"Gris fosc",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Signe de divisió","Document colors":"Colors del document","Dollar sign":"signe del dòlar","Dong sign":"signe del dong",Dotted:"De punts",Double:"Doble","Double dagger":"Doble obelisc o diesi","Double exclamation mark":"Doble signe d'exclamació","Double low-9 quotation mark":"Cometes dobles inferiors","Double question mark":"Doble signe d'interrogació",Downloadable:"Es pot descarregar","downwards arrow to bar":"fletxa cap a la barra de sota","downwards dashed arrow":"fletxa discontínua cap avall","downwards double arrow":"fletxa doble cap avall","downwards simple arrow":"fletxa simple cap avall","Drachma sign":"signe del dracma","Drag to move":"Arrossega per moure","Dropdown menu":"Menú desplegable","Dropdown toolbar":"Barra d'eines desplegable","Edit block":"Editar bloc","Edit link":"Editar enllaç","Edit source":"Editar la font","Editor block content toolbar":"Barra d'eines de contingut del bloc de l'editor","Editor contextual toolbar":"Barra d'eines contextual de l'editor","Editor dialog":"Diàleg de l'editor","Editor menu bar":"Barra de menú del editor","Editor toolbar":"Barra d'eines de l'editor","Element of":"Element de","Em dash":"Guió llarg","Empty set":"Conjunt buit","Empty snippet content":"Contingut del fragment buit","En dash":"Guió mitjà","end with leftwards arrow above":"end amb fletxa cap a l'esquerra per sobre","Enter image caption":"Introduir el peu de foto de la imatge","Enter table caption":"Introduir el peu de foto de la taula","Entering %0 code snippet":"S'està introduint %0 fragments de codi","Entering a to-do list":"Introduint una llista de tasques pendents","Entering code snippet":"InLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["cs"]=e["cs"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(může vyžadovat <kbd>Fn</kbd>)","%0 of %1":"%0 z %1",Accept:"Přijmout","Accessibility help":"Podpora přístupnosti","Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",All:"Vše","Almost equal to":"Částečně rovný",Angle:"Úhel","Approximately equal to":"Aproximace",Aquamarine:"Akvamarínová",Arrows:"Šipky","Asterisk operator":"Hvězdička / násobení","Austral sign":"Znak Austral","back with leftwards arrow above":"šipka zpět",Background:"Pozadí","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Seznam klávesových zkratek, které lze v editoru použít, můžete nalézt níže.",Big:"Velké","Bitcoin sign":"Měna Bitcoin",Black:"Černá","Block quote":"Citace",Blue:"Modrá","Blue marker":"Modrý fix",Bold:"Tučné","Bold text":"Tučně",Border:"Okraj","Break text":"Obtékání textu","Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Cancel:"Zrušit","Caption for image: %0":"Popisek k obrázku: %0","Caption for the image":"Popisek k obrázku","Cedi sign":"Znak Cedi","Cell properties":"Vlastnosti buňky","Cent sign":"Znak cent","Center table":"Centrovat tabulku","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Character categories":"Kategorie znaků","Choose heading":"Zvolte nadpis",Circle:"Kruh",Clear:"Smazat","Click to edit block":"Kliknutím upravíte blok",Close:"Zavřít","Close contextual balloons, dropdowns, and dialogs":"Zavřít kontextuální balóny, rozbalovací menu a dialogy",Code:"Kódový blok","Colon sign":"dvojtečka",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec","Contains as member":"Obsahuje prvek","Content editing keystrokes":"Klávesy na úpravu obsahu","Copy selected content":"Zkopírovat vybraný obsah","Copyright sign":"Copyright","Create link":"Vytvořit odkaz","Cruzeiro sign":"Měna Cruzeiro",Currency:"Měna","Currency sign":"Znak měny",Dashed:"Čárkovaná",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku","Decrease indent":"Zmenšit odsazení","Decrease list item indent":"Zmenšit odsazení položky seznamu",Default:"Výchozí","Degree sign":"Znak stupeň","Delete column":"Smazat sloupec","Delete row":"Smazat řádek","Dim grey":"Tmavě šedá",Dimensions:"Rozměry",Disc:"Plný kruh","Division sign":"Dělení","Document colors":"Barvy dokumentu","Dollar sign":"Znak Dolar","Dong sign":"Znak Dong",Dotted:"Tečkovaná",Double:"Dvojitá","Double dagger":"Dvojkříž","Double exclamation mark":"Dvojitý vykřičník","Double low-9 quotation mark":"Dvojitá spodní uvozovka","Double question mark":"Dvojitý otazník",Downloadable:"Ke stažení","downwards arrow to bar":"šipka dolů do svislé čáry","downwards dashed arrow":"přerušovaná šipka dolů","downwards double arrow":"dvojitá šipka dolů","downwards simple arrow":"jednoduchá šipka dolů","Drachma sign":"Znak Drachma","Drag to move":"Přesuňte potažením","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Edit link":"Upravit odkaz","Edit source":"Upravit zdroj","Editor block content toolbar":"Panel nástrojů obsahu bloku editoru","Editor contextual toolbar":"Kontextový panel nástrojů editoru","Editor dialog":"Dialog editoru","Editor editing area: %0":"Editační oblast editoru: %0","Editor toolbar":"Panel nástrojů editoru","Element of":"Patří / Je součástí","Em dash":"Dlouhá pomlčka","Empty set":"Prázdná množina","Empty snippet content":"Prázdný obsah kódu","En dash":"Pomlčka","end with leftwards arrow above":"šipka konec","Enter image caption":"Zadejte popis obrázku","Enter table caption":"Zadejte titulek tabulky","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Vykřičník a otazník","Execute the currently focused button":"Stisknout aktuálně zaměřené tlačítko","Font Background Color":"Barva pozadí písma","Font Color":"Barva písma","Font Family":"Typ písma","Font Size":"Velikost písma","For all":"Pro všechny prvky v množině","Fraction slash":"Lomítko / Dělení","French franc sign":"Měna Francouzský Frank","Full size image":"Obrázek v plné velikosti","German penny sign":"Německá penny","Greater-than or equal to":"Větší nebo roven","Greater-than sign":Line truncated
|
||||
!function(e){const t=e.cs=e.cs||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(může vyžadovat <kbd>Fn</kbd>)","%0 of %1":"%0 z %1",Accept:"Přijmout",Accessibility:"Přístupnost","Accessibility help":"Podpora přístupnosti","Align cell text to the bottom":"Zarovnat text buňky dolů","Align cell text to the center":"Zarovnat text buňky na střed","Align cell text to the left":"Zarovnat text buňky doleva","Align cell text to the middle":"Zarovnat text buňky na střed","Align cell text to the right":"Zarovnat text buňky doprava","Align cell text to the top":"Zarovnat text buňky nahoru","Align center":"Zarovnat na střed","Align left":"Zarovnat vlevo","Align right":"Zarovnat vpravo","Align table to the left":"Zarovnat tabulku doleva","Align table to the right":"Zarovnat tabulku doprava",Alignment:"Zarovnání",All:"Vše","Almost equal to":"Částečně rovný",Angle:"Úhel","Approximately equal to":"Aproximace",Aquamarine:"Akvamarínová",Arrows:"Šipky","Asterisk operator":"Hvězdička / násobení","Austral sign":"Znak Austral","back with leftwards arrow above":"šipka zpět",Background:"Pozadí","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Seznam klávesových zkratek, které lze v editoru použít, můžete nalézt níže.",Big:"Velké","Bitcoin sign":"Měna Bitcoin",Black:"Černá","Block quote":"Citace",Blue:"Modrá","Blue marker":"Modrý fix",Bold:"Tučné","Bold text":"Tučně",Border:"Okraj","Break text":"Obtékání textu","Bulleted List":"Odrážky","Bulleted list styles toolbar":"Panel seznamu s odrážkami",Cancel:"Zrušit","Caption for image: %0":"Popisek k obrázku: %0","Caption for the image":"Popisek k obrázku",Category:"Kategorie","Cedi sign":"Znak Cedi","Cell properties":"Vlastnosti buňky","Cent sign":"Znak cent","Center table":"Centrovat tabulku","Centered image":"Obrázek zarovnaný na střed","Change image text alternative":"Změnit alternativní text obrázku","Choose heading":"Zvolte nadpis",Circle:"Kruh",Clear:"Smazat","Click to edit block":"Kliknutím upravíte blok",Close:"Zavřít","Close contextual balloons, dropdowns, and dialogs":"Zavřít kontextuální balóny, rozbalovací menu a dialogy",Code:"Kódový blok","Code block":"Blok kódu","Colon sign":"dvojtečka",Color:"Barva","Color picker":"Vybrat barvu",Column:"Sloupec","Contains as member":"Obsahuje prvek","Content editing keystrokes":"Klávesy na úpravu obsahu","Copy selected content":"Zkopírovat vybraný obsah","Copyright sign":"Copyright","Create link":"Vytvořit odkaz","Cruzeiro sign":"Měna Cruzeiro",Currency:"Měna","Currency sign":"Znak měny",Custom:"Vlastní","Custom image size":"Vlastní velikost obrázku",Dashed:"Čárkovaná",Decimal:"Čísla","Decimal with leading zero":"Čísla s nulou na začátku","Decrease indent":"Zmenšit odsazení","Decrease list item indent":"Zmenšit odsazení položky seznamu",Default:"Výchozí","Degree sign":"Znak stupeň","Delete column":"Smazat sloupec","Delete row":"Smazat řádek","Dim grey":"Tmavě šedá",Dimensions:"Rozměry",Disc:"Plný kruh","Division sign":"Dělení","Document colors":"Barvy dokumentu","Dollar sign":"Znak Dolar","Dong sign":"Znak Dong",Dotted:"Tečkovaná",Double:"Dvojitá","Double dagger":"Dvojkříž","Double exclamation mark":"Dvojitý vykřičník","Double low-9 quotation mark":"Dvojitá spodní uvozovka","Double question mark":"Dvojitý otazník",Downloadable:"Ke stažení","downwards arrow to bar":"šipka dolů do svislé čáry","downwards dashed arrow":"přerušovaná šipka dolů","downwards double arrow":"dvojitá šipka dolů","downwards simple arrow":"jednoduchá šipka dolů","Drachma sign":"Znak Drachma","Drag to move":"Přesuňte potažením","Dropdown menu":"Rozbalovací nabídka","Dropdown toolbar":"Rozbalovací panel nástrojů","Edit block":"Upravit blok","Edit link":"Upravit odkaz","Edit source":"Upravit zdroj","Editor block content toolbar":"Panel nástrojů obsahu bloku editoru","Editor contextual toolbar":"Kontextový panel nástrojů editoru","Editor dialog":"Dialog editoru","Editor menu bar":"Panel nabídek editoru","Editor toolbar":"Panel nástrojů editoru","Element of":"Patří / Je součástí","Em dash":"Dlouhá pomlčka","Empty set":"Prázdná množina","Empty snippet content":"Prázdný obsah kódu","En dash":"Pomlčka","end with leftwards arrow above":"šipka konec","Enter image caption":"Zadejte popis obrázku","Enter table caption":"Zadejte titulek tabulky","Entering %0 code snippet":"Zadávání fragmentu kódu %0","Entering a to-do list":"Zadání seznamu úkolů","Entering code snippet":"Zadávání fragmentu kódu","Error during image upload":"Při nahrávání obrázku došlo k chybě","Euro sign":"Znak Euro","Euro-currency sign":"Mena Euro","Exclamation question mark":"Vykřičník a otazník","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"SpusťtLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["da"]=e["da"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(kan kræve <kbd>Fn</kbd>)","%0 of %1":"%0 af %1",Accept:"Accepter","Accessibility help":"Tilgængelighedshjælp","Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",All:"Alle","Almost equal to":"Næsten lig med",Angle:"Vinkel","Approximately equal to":"Nogenlunde lig med",Aquamarine:"Marineblå",Arrows:"Pile","Asterisk operator":"Asterisk-operator","Austral sign":"Austral-tegn","back with leftwards arrow above":"tilbage med venstrepegende pil over",Background:"Baggrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Nedenfor kan du finde en liste over tastaturgenveje, der kan bruges i editoren.",Big:"Stor","Bitcoin sign":"Bitcoin-tegn",Black:"Sort","Block quote":"Blot citat",Blue:"Blå","Blue marker":"Blå markør",Bold:"Fed","Bold text":"Fed tekst",Border:"Ramme","Break text":"Opdel tekst","Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"Værktøjslinje til punktopdelt liste",Cancel:"Annullér","Caption for image: %0":"Billedtekst for billede: %0","Caption for the image":"Billedtekst for billedet","Cedi sign":"Cedi-tegn","Cell properties":"Celleegenskaber","Cent sign":"Cent-tegn","Center table":"Centrér tabel","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Character categories":"Tegnkategorier","Choose heading":"Vælg overskrift",Circle:"Cirkel",Clear:"Ryd","Click to edit block":"Klik for at redigere blok",Close:"Luk","Close contextual balloons, dropdowns, and dialogs":"Luk kontekstbetingede balloner, rullemenuer og dialoger",Code:"Kode","Colon sign":"Kolontegn",Color:"Farve","Color picker":"Farvevælger",Column:"Kolonne","Contains as member":"Element i","Content editing keystrokes":"Tastaturtryk til redigering af indhold","Copy selected content":"Kopier markeret indhold","Copyright sign":"Copyright-tegnb","Create link":"Opret link","Cruzeiro sign":"Cruzeiro-tegn",Currency:"Valuta","Currency sign":"Valuta-tegn",Dashed:"Stiplet (streg)",Decimal:"Decimal","Decimal with leading zero":"Decimal med nul i starten","Decrease indent":"Formindsk indrykning","Decrease list item indent":"Reducer listeemners indrykning",Default:"Standard","Degree sign":"Grad-tegn","Delete column":"Slet kolonne","Delete row":"Slet række","Dim grey":"Dunkel grå",Dimensions:"Dimensioner",Disc:"Disk","Division sign":"Divisionstegn","Document colors":"Dokumentfarve","Dollar sign":"Dollartegn","Dong sign":"Dong-tegn",Dotted:"Stiplet (prik)",Double:"Dobbel","Double dagger":"Dobbeltobelisk","Double exclamation mark":"Dobbelt udråbstegn","Double low-9 quotation mark":"Dobbelt lav-9 citationstegn","Double question mark":"Dobbelt spørgsmålstegn",Downloadable:"Kan downloades","downwards arrow to bar":"nedadpegende pil mod bjælke","downwards dashed arrow":"nedadpegende stiplet pil","downwards double arrow":"nedadpegende dobbeltpil","downwards simple arrow":"nedadgående simpel pil","Drachma sign":"Drakmer-tegn","Drag to move":"Træk for at flytte","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Edit link":"Redigér link","Edit source":"Rediger kilde","Editor block content toolbar":"Redigeringskasse indholdsværktøjslinje","Editor contextual toolbar":"Kontekstuel værktøjslinje til redigeringsprogram","Editor dialog":"Editor-dialog","Editor editing area: %0":"Redigeringsområde: %0","Editor toolbar":"Editor værktøjslinje","Element of":"Element af","Em dash":"Em-bindestreg","Empty set":"Tomt sæt","Empty snippet content":"Tøm uddragsindhold","En dash":"En-bindestreg","end with leftwards arrow above":"afslut med venstrepegende pil over","Enter image caption":"Indtast billedoverskrift","Enter table caption":"Indtast tabeltekst","Euro sign":"Eurotegn","Euro-currency sign":"Euro-valutategn","Exclamation question mark":"Udråbstegn-spørgsmålstegn","Execute the currently focused button":"Brug den knap, der i øjeblikket er i fokus","Font Background Color":"Skrift baggrundsfarve","Font Color":"Skriftfarve","Font Family":"Skriftfamilie","Font Size":"Skriftstørrelse","For all":"For alle","Fraction slash":"Brøk-tegn","French franc sign":"Franske franc-tegn","Full size image":"Fuld billedstørrelse","German penny sign":"Tysk penny-tegn","Greater-than or equal to":"Større end eller lig med-tegn","Greater-than sign":"Større end-tegn",Green:"Grøn","Green marLine truncated
|
||||
!function(e){const t=e.da=e.da||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(kan kræve <kbd>Fn</kbd>)","%0 of %1":"%0 af %1",Accept:"Accepter",Accessibility:"Tilgængelighed","Accessibility help":"Tilgængelighedshjælp","Align cell text to the bottom":"Justér tekstcelle til bunden","Align cell text to the center":"Justér tekstcelle centreret","Align cell text to the left":"Justér tekstcelle til venstre","Align cell text to the middle":"Justér tekstcelle til midten","Align cell text to the right":"Justér tekstcelle til højre","Align cell text to the top":"Justér tekstcelle til top","Align center":"Justér center","Align left":"Justér venstre","Align right":"Justér højre","Align table to the left":"Justér tabel til venstre","Align table to the right":"Justér tabel til højre",Alignment:"Justering",All:"Alle","Almost equal to":"Næsten lig med",Angle:"Vinkel","Approximately equal to":"Nogenlunde lig med",Aquamarine:"Marineblå",Arrows:"Pile","Asterisk operator":"Asterisk-operator","Austral sign":"Austral-tegn","back with leftwards arrow above":"tilbage med venstrepegende pil over",Background:"Baggrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Nedenfor kan du finde en liste over tastaturgenveje, der kan bruges i editoren.",Big:"Stor","Bitcoin sign":"Bitcoin-tegn",Black:"Sort","Block quote":"Blot citat",Blue:"Blå","Blue marker":"Blå markør",Bold:"Fed","Bold text":"Fed tekst",Border:"Ramme","Break text":"Opdel tekst","Bulleted List":"Punktopstilling","Bulleted list styles toolbar":"Værktøjslinje til punktopdelt liste",Cancel:"Annullér","Caption for image: %0":"Billedtekst for billede: %0","Caption for the image":"Billedtekst for billedet",Category:"Kategori","Cedi sign":"Cedi-tegn","Cell properties":"Celleegenskaber","Cent sign":"Cent-tegn","Center table":"Centrér tabel","Centered image":"Centreret billede","Change image text alternative":"Skift alternativ billedtekst","Choose heading":"Vælg overskrift",Circle:"Cirkel",Clear:"Ryd","Click to edit block":"Klik for at redigere blok",Close:"Luk","Close contextual balloons, dropdowns, and dialogs":"Luk kontekstbetingede balloner, rullemenuer og dialoger",Code:"Kode","Code block":"Kodeblok","Colon sign":"Kolontegn",Color:"Farve","Color picker":"Farvevælger",Column:"Kolonne","Contains as member":"Element i","Content editing keystrokes":"Tastaturtryk til redigering af indhold","Copy selected content":"Kopier markeret indhold","Copyright sign":"Copyright-tegnb","Create link":"Opret link","Cruzeiro sign":"Cruzeiro-tegn",Currency:"Valuta","Currency sign":"Valuta-tegn",Custom:"Brugerdefineret","Custom image size":"Brugerdefineret billedstørrelse",Dashed:"Stiplet (streg)",Decimal:"Decimal","Decimal with leading zero":"Decimal med nul i starten","Decrease indent":"Formindsk indrykning","Decrease list item indent":"Reducer listeemners indrykning",Default:"Standard","Degree sign":"Grad-tegn","Delete column":"Slet kolonne","Delete row":"Slet række","Dim grey":"Dunkel grå",Dimensions:"Dimensioner",Disc:"Disk","Division sign":"Divisionstegn","Document colors":"Dokumentfarve","Dollar sign":"Dollartegn","Dong sign":"Dong-tegn",Dotted:"Stiplet (prik)",Double:"Dobbel","Double dagger":"Dobbeltobelisk","Double exclamation mark":"Dobbelt udråbstegn","Double low-9 quotation mark":"Dobbelt lav-9 citationstegn","Double question mark":"Dobbelt spørgsmålstegn",Downloadable:"Kan downloades","downwards arrow to bar":"nedadpegende pil mod bjælke","downwards dashed arrow":"nedadpegende stiplet pil","downwards double arrow":"nedadpegende dobbeltpil","downwards simple arrow":"nedadgående simpel pil","Drachma sign":"Drakmer-tegn","Drag to move":"Træk for at flytte","Dropdown menu":"Rullemenu","Dropdown toolbar":"Dropdown værktøjslinje","Edit block":"Redigér blok","Edit link":"Redigér link","Edit source":"Rediger kilde","Editor block content toolbar":"Redigeringskasse indholdsværktøjslinje","Editor contextual toolbar":"Kontekstuel værktøjslinje til redigeringsprogram","Editor dialog":"Editor-dialog","Editor menu bar":"Editor menulinje","Editor toolbar":"Editor værktøjslinje","Element of":"Element af","Em dash":"Em-bindestreg","Empty set":"Tomt sæt","Empty snippet content":"Tøm uddragsindhold","En dash":"En-bindestreg","end with leftwards arrow above":"afslut med venstrepegende pil over","Enter image caption":"Indtast billedoverskrift","Enter table caption":"Indtast tabeltekst","Entering %0 code snippet":"Indtastning af %0 kodestykke","Entering a to-do list":"Indtastning af en huskeliste","Entering code snippet":"Indtastning af kodestykke","Error during image upload":"Fejl under upload af billede","Euro sign":"Eurotegn","Euro-currency sign":"Euro-valutategn","Exclamation question mark":"Udråbstegn-spørgsmålstegn","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"Udfør den aktuelt fokuserede knapLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"","Align table to the right":"",Alignment:"",Aquamarine:"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Gross",Black:"","Block quote":"Blockzitat",Blue:"","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"",Border:"","Break text":"","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"","Caption for the image":"","Cell properties":"","Center table":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code",Color:"","Color picker":"",Column:"Spalte","Content editing keystrokes":"","Create link":"",Dashed:"",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"",Default:"Standard","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"",Dimensions:"",Disc:"Gefüllter Kreis","Document colors":"Farben des Dokuments",Dotted:"",Double:"",Downloadable:"Herunterladbar","Drag to move":"","Dropdown toolbar":"","Edit block":"","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor editing area: %0":"","Editor toolbar":"","Empty snippet content":"Codeschnipsel ohne Inhalt","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"","Execute the currently focused button":"","Font Background Color":"Hintergrundfarbe der Schrift","Font Color":"Schriftfarbe","Font Family":"Schriftfamilie","Font Size":"Schriftgrösse","Full size image":"Bild in voller Grösse",Green:"","Green marker":"Grüner Marker","Green pen":"Grüne Schriftfarbe",Grey:"",Groove:"","Header column":"Kopfspalte","Header row":"Kopfspalte",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Texthervorhebung","Horizontal text alignment toolbar":"","HTML snippet":"HTML-Codeschnipsel",Huge:"Riesig","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","image widget":"Bild-Steuerelement","In line":"","Increase indent":"Einzug vergrössern","Increase list item indent":"",Insert:"Einfügen","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert code block":"Code-Block einfügen","Insert column left":"","Insert column right":"","Insert HTML":"HTML einfügen","Insert image":"Bild einfügen","Insert image via URL":"Bild von URL einfügen","Insert media":"Medium einfügen","Insert paragraph after block":"Absatz nach Block einfügen","Insert paragraph before block":"Absatz vor Block einfügen","Insert row above":"Zeile oben einfügen","Insert row below":"Zeile unten einfügen","Insert table":"Tabelle einfügen",Inset:"","Invalid start index value.":"",Italic:"Kursiv","Italic text":"",Justify:"Blocksatz","Justify cell text":"","Keystrokes that can be used in a list":"","Keystrokes that can be used in a table cell":"","Keystrokes that can be used when a widget is selected (for example: image, table, etc.)":"","Left aligned image":"linksbündiges Bild","Light blue":"","Light green":"","Light grey":"",Link:"Link","Link image":"Bild verlinken","Link URL":"Link Adresse","List properties":"","Lower-latin":"Kleingeschriebene lateinische Buchstaben","Lower–roman":"Kleingeschriebene römische Zahlen","Media toolbar":"Medien Werkzeugleiste","Media URL":"Medien-URL","media widget":"Medien-Widget","Merge cell down":"Zelle unten verbinden","Merge cell left":"Zelle links verbinden","Merge cell right":"Zele rechts verbinden","Merge cell up":"Zelle oben verbinden","Merge cells":"Zellen verbinden","Move focus between form fields (inputs, buttons, etc.)":"","Move focus in and out of an active dialog window":"","Move focus to the toolbar, navigate between toolbars":"","Move out of a link":"","Move out of an inline code style":"","Move the caret to allow typing directly after a widget":"","Move the caret to allow typing directly before
Line truncated
|
||||
!function(e){const t=e["de-ch"]=e["de-ch"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"","Align cell text to the center":"","Align cell text to the left":"","Align cell text to the middle":"","Align cell text to the right":"","Align cell text to the top":"","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"","Align table to the right":"",Alignment:"",All:"","Almost equal to":"",Angle:"","Approximately equal to":"",Aquamarine:"",Arrows:"","Asterisk operator":"","Austral sign":"","back with leftwards arrow above":"",Background:"","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Gross","Bitcoin sign":"",Black:"","Block quote":"Blockzitat",Blue:"","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"",Border:"","Break text":"","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"","Caption for the image":"",Category:"","Cedi sign":"","Cell properties":"","Cent sign":"","Center table":"","Centered image":"zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Code block":"","Colon sign":"",Color:"","Color picker":"",Column:"Spalte","Contains as member":"","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"","Create link":"","Cruzeiro sign":"",Currency:"","Currency sign":"",Custom:"","Custom image size":"",Dashed:"",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"",Default:"Standard","Degree sign":"","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"",Dimensions:"",Disc:"Gefüllter Kreis","Division sign":"","Document colors":"Farben des Dokuments","Dollar sign":"","Dong sign":"",Dotted:"",Double:"","Double dagger":"","Double exclamation mark":"","Double low-9 quotation mark":"","Double question mark":"",Downloadable:"Herunterladbar","downwards arrow to bar":"","downwards dashed arrow":"","downwards double arrow":"","downwards simple arrow":"","Drachma sign":"","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"","Edit block":"","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"","Editor contextual toolbar":"","Editor dialog":"","Editor menu bar":"","Editor toolbar":"","Element of":"","Em dash":"","Empty set":"","Empty snippet content":"Codeschnipsel ohne Inhalt","En dash":"","end with leftwards arrow above":"","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"","Euro-currency sign":"","Exclamation question mark":"","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Hintergrundfarbe der Schrift","Font Color":"Schriftfarbe","Font Family":"Schriftfamilie","Font Size":"Schriftgrösse","For all":"","Fraction slash":"","French franc sign":"","From computer":"","Full size image":"Bild in voller Grösse","German penny sign":"","Greater-than or equal to":"","Greater-than sign":"",Green:"","Green marker":"Grüner Marker","Green pen":"Grüne Schriftfarbe",Grey:"",Groove:"","Guarani sign":"","Header column":"Kopfspalte","Header row":"Kopfspalte",Heading:"Überschrift","Heading 1":"Überschrift 1","Heading 2":"Überschrift 2","Heading 3":"Überschrift 3","Heading 4":"Überschrift 4","Heading 5":"Überschrift 5","Heading 6":"Überschrift 6",Height:"","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Texthervorhebung","Horizontal ellipsis":"","Horizontal text alignment toolbar":"","Hryvnia sign":"","HTML object":"","HTML snippet":"HTML-Codeschnipsel",Huge:"Riesig","Identical to":"",Image:"","Image from computer":"","Image resize list":"Bildgrössen-Liste","Image toolbar":"Bild Werkzeugleiste","Image upload complete":"","Image via URL":"","image widget":"Bild-Steuerelement","In line":"","Increase indent":"Einzug vergrössern","Increase list item indent":"","Indian rupee sign":"",Infinity:"","Insert a hard break (a new paragraph)":"","Insert a new paragraph directly after a widget":"","Insert a new paragraph directly before a widget":"","Insert a new table row (when in the last cell of a table)":"","Insert a soft break (a <code><br></code> element)":"","Insert code block":"Code-Block einfügen","Insert column left":"","Insert column right":"","Insert HTML":"HTML einfügen","Insert image":"Bild einfügen","InLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(e){const t=e["de"]=e["de"]||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(erfordert gegebenenfalls <kbd>Fn</kbd>)","%0 of %1":"%0 von %1",Accept:"Akzeptieren","Accessibility help":"Hilfe zur Eingabe","Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",All:"Alle","Almost equal to":"Gerundet",Angle:"Winkel-Zeichen","Approximately equal to":"Ungefähr gleich",Aquamarine:"Aquamarinblau",Arrows:"Pfeile","Asterisk operator":"Hodge-Stern-Operator","Austral sign":"Austral-Zeichen","back with leftwards arrow above":"„Back“ darüber Pfeil nach links",Background:"Hintergrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Unten finden Sie eine Liste mit Tastenkombinationen, die im Editor benutzt werden können.",Big:"Groß","Bitcoin sign":"Bitcoin-Zeichen",Black:"Schwarz","Block quote":"Blockzitat",Blue:"Blau","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"Fettschrift",Border:"Rahmen","Break text":"Bild teilt Text","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"Bildunterschrift: %0","Caption for the image":"Bildunterschrift","Cedi sign":"Cedi-Zeichen","Cell properties":"Zelleneigenschaften","Cent sign":"Cent-Zeichen","Center table":"Tabelle zentrieren","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Character categories":"Zeichenkategorien","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"Löschen","Click to edit block":"Zum Bearbeiten des Blocks klicken",Close:"Schließen","Close contextual balloons, dropdowns, and dialogs":"Kontextsprechblasen, Dropdown-Menü und Dialoge schließen",Code:"Code","Colon sign":"Colón-Zeichen",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte","Contains as member":"Enthält als Element","Content editing keystrokes":"Tastatureingaben zur Inhaltsverarbeitung","Copy selected content":"Markierten Inhalt kopieren","Copyright sign":"Copyright-Zeichen","Create link":"Link erstellen","Cruzeiro sign":"Cruzeiro-Zeichen",Currency:"Währung","Currency sign":"Währungssymbol",Dashed:"Gestrichelt",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"Listeneinzug verkleinern",Default:"Standard","Degree sign":"Grad-Zeichen","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"Dunkelgrau",Dimensions:"Größe",Disc:"Gefüllter Kreis","Division sign":"Geteilt-Zeichen","Document colors":"Dokumentfarben","Dollar sign":"Dollar-Zeichen","Dong sign":"Đồng-Zeichen",Dotted:"Gepunktet",Double:"Doppelt","Double dagger":"Zweibalkenkreuz","Double exclamation mark":"Doppeltes Ausrufezeichen","Double low-9 quotation mark":"Doppelte Anführungszeichen links unten","Double question mark":"Doppeltes Fragezeichen",Downloadable:"Herunterladbar","downwards arrow to bar":"Pfeil nach unten zum Querstrich","downwards dashed arrow":"Gestrichelter Pfeil nach unten","downwards double arrow":"Doppelpfeil nach unten","downwards simple arrow":"einfacher Abwärtspfeil","Drachma sign":"Drachme-Zeichen","Drag to move":"Zum Verschieben ziehen","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"Editor Blockinhalt-Toolbar","Editor contextual toolbar":"Editor kontextuelle Toolbar","Editor dialog":"Editor-Dialog","Editor editing area: %0":"Bearbeitungsbereich des Editors: %0","Editor toolbar":"Editor Werkzeugleiste","Element of":"Element von","Em dash":"Geviertstrich","Empty set":"Leere Menge","Empty snippet content":"Leerer Snippet-Inhalt","En dash":"Halbgeviertstrich","end with leftwards arrow above":"„End“ darüber Pfeil nach links","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"Tabellenüberschrift eingeben","Euro sign":"Euro-Zeichen","Euro-currency sign":"Euro-Währungszeichen","Exclamation question mark":"Ruf-Frage-Zeichen","Execute the currently focused button":"Das gegenwärtig im Fokus stehende Tastenfeld betätigen","Font Background Color":"Hintergrundfarbe","Font Color":"Schriftfarbe","Font Family":"Schriftart","Font Size":"Schriftgröße","For all":"Allquantor","Fraction slash":"Schrägstrich","French franc sign":"Französischer FraLine truncated
|
||||
!function(e){const t=e.de=e.de||{};t.dictionary=Object.assign(t.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(erfordert gegebenenfalls <kbd>Fn</kbd>)","%0 of %1":"%0 von %1",Accept:"Akzeptieren",Accessibility:"Bedienungshilfen","Accessibility help":"Hilfe zur Eingabe","Align cell text to the bottom":"Zellentext unten ausrichten","Align cell text to the center":"Zellentext zentriert ausrichten","Align cell text to the left":"Zellentext linksbündig ausrichten","Align cell text to the middle":"Zellentext mittig ausrichten","Align cell text to the right":"Zellentext rechtsbündig ausrichten","Align cell text to the top":"Zellentext oben ausrichten","Align center":"Zentriert","Align left":"Linksbündig","Align right":"Rechtsbündig","Align table to the left":"Tabelle links ausrichten","Align table to the right":"Tabelle rechts ausrichten",Alignment:"Ausrichtung",All:"Alle","Almost equal to":"Gerundet",Angle:"Winkel-Zeichen","Approximately equal to":"Ungefähr gleich",Aquamarine:"Aquamarinblau",Arrows:"Pfeile","Asterisk operator":"Hodge-Stern-Operator","Austral sign":"Austral-Zeichen","back with leftwards arrow above":"„Back“ darüber Pfeil nach links",Background:"Hintergrund","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Unten finden Sie eine Liste mit Tastenkombinationen, die im Editor benutzt werden können.",Big:"Groß","Bitcoin sign":"Bitcoin-Zeichen",Black:"Schwarz","Block quote":"Blockzitat",Blue:"Blau","Blue marker":"Blauer Marker",Bold:"Fett","Bold text":"Fettschrift",Border:"Rahmen","Break text":"Bild teilt Text","Bulleted List":"Aufzählungsliste","Bulleted list styles toolbar":"Darstellung der ungeordneten Liste",Cancel:"Abbrechen","Caption for image: %0":"Bildunterschrift: %0","Caption for the image":"Bildunterschrift",Category:"Kategorie","Cedi sign":"Cedi-Zeichen","Cell properties":"Zelleneigenschaften","Cent sign":"Cent-Zeichen","Center table":"Tabelle zentrieren","Centered image":"Zentriertes Bild","Change image text alternative":"Alternativtext ändern","Choose heading":"Überschrift auswählen",Circle:"Leerer Kreis",Clear:"Löschen","Click to edit block":"Zum Bearbeiten des Blocks klicken",Close:"Schließen","Close contextual balloons, dropdowns, and dialogs":"Kontextsprechblasen, Dropdown-Menü und Dialoge schließen",Code:"Code","Code block":"Codeblock","Colon sign":"Colón-Zeichen",Color:"Farbe","Color picker":"Farbwähler",Column:"Spalte","Contains as member":"Enthält als Element","Content editing keystrokes":"Tastatureingaben zur Inhaltsverarbeitung","Copy selected content":"Markierten Inhalt kopieren","Copyright sign":"Copyright-Zeichen","Create link":"Link erstellen","Cruzeiro sign":"Cruzeiro-Zeichen",Currency:"Währung","Currency sign":"Währungssymbol",Custom:"Benutzerdefiniert","Custom image size":"Benutzerdefinierte Bildgröße",Dashed:"Gestrichelt",Decimal:"Dezimalzahlen","Decimal with leading zero":"Dezimalzahlen mit vorangestellten Nullen","Decrease indent":"Einzug verkleinern","Decrease list item indent":"Listeneinzug verkleinern",Default:"Standard","Degree sign":"Grad-Zeichen","Delete column":"Spalte löschen","Delete row":"Zeile löschen","Dim grey":"Dunkelgrau",Dimensions:"Größe",Disc:"Gefüllter Kreis","Division sign":"Geteilt-Zeichen","Document colors":"Dokumentfarben","Dollar sign":"Dollar-Zeichen","Dong sign":"Đồng-Zeichen",Dotted:"Gepunktet",Double:"Doppelt","Double dagger":"Zweibalkenkreuz","Double exclamation mark":"Doppeltes Ausrufezeichen","Double low-9 quotation mark":"Doppelte Anführungszeichen links unten","Double question mark":"Doppeltes Fragezeichen",Downloadable:"Herunterladbar","downwards arrow to bar":"Pfeil nach unten zum Querstrich","downwards dashed arrow":"Gestrichelter Pfeil nach unten","downwards double arrow":"Doppelpfeil nach unten","downwards simple arrow":"einfacher Abwärtspfeil","Drachma sign":"Drachme-Zeichen","Drag to move":"Zum Verschieben ziehen","Dropdown menu":"Dropdown-Menü","Dropdown toolbar":"Dropdown-Liste Werkzeugleiste","Edit block":"Absatz bearbeiten","Edit link":"Link bearbeiten","Edit source":"Quelle bearbeiten","Editor block content toolbar":"Editor Blockinhalt-Toolbar","Editor contextual toolbar":"Editor kontextuelle Toolbar","Editor dialog":"Editor-Dialog","Editor menu bar":"Menüleiste des Editors","Editor toolbar":"Editor Werkzeugleiste","Element of":"Element von","Em dash":"Geviertstrich","Empty set":"Leere Menge","Empty snippet content":"Leerer Snippet-Inhalt","En dash":"Halbgeviertstrich","end with leftwards arrow above":"„End“ darüber Pfeil nach links","Enter image caption":"Bildunterschrift eingeben","Enter table caption":"Tabellenüberschrift eingeben","Entering %0 code snippet":"%0 Code-Ausschnitt eingeben","Entering a to-do list":"Eingabe einer Aufgabenliste","Entering code snippet":"Code-Ausschnit eingeben","Error during image upload":"Fehler beim Hochladen des Bildes","Euro sign":"Euro-Zeichen","Euro-currency sign":"Euro-Währungszeichen","Exclamation questionLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["el"]=t["el"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(μπορεί να απαιτείται το <kbd> Fn</kbd>)","%0 of %1":"%0 από %1",Accept:"Αποδοχή","Accessibility help":"Βοήθεια προσβασιμότητας","Align cell text to the bottom":"Στοίχιση κειμένου κελιού κάτω","Align cell text to the center":"Στοίχιση κειμένου κελιού στο κέντρο","Align cell text to the left":"Στοίχιση κειμένου κελιού στα αριστερά","Align cell text to the middle":"Στοίχιση κειμένου κελιού στο μέσο","Align cell text to the right":"Στοίχιση κειμένου κελιού στα δεξιά","Align cell text to the top":"Στοίχιση κειμένου κελιού επάνω","Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά","Align table to the left":"Στοίχιση πίνακα στα αριστερά","Align table to the right":"Στοίχιση πίνακα στα δεξιά",Alignment:"Στοίχιση",All:"Όλα","Almost equal to":"Περίπου ίσο με",Angle:"Γωνία","Approximately equal to":"Κατά προσέγγιση ίσο με",Aquamarine:"Ακουαμαρίνα",Arrows:"Βέλη","Asterisk operator":"Τελεστής αστερίσκος","Austral sign":"Σύμβολο αουστράλ Αργεντινής","back with leftwards arrow above":"όπισθεν με αριστερό βέλος άνω",Background:"Υπόβαθρο","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Παρακάτω, μπορείτε να βρείτε μια λίστα με συντομεύσεις πληκτρολογίου που μπορείτε να χρησιμοποιήσετε στο εργαλείο επεξεργασίας.",Big:"Μεγάλο","Bitcoin sign":"Σύμβολο Bitcoin",Black:"Μαύρο","Block quote":"Περιοχή παράθεσης",Blue:"Μπλε","Blue marker":"Επισημαντής μπλε",Bold:"Έντονα","Bold text":"Έντονο κείμενο",Border:"Περίγραμμα","Break text":"Κατάτμηση κειμένου","Bulleted List":"Λίστα με κουκκίδες","Bulleted list styles toolbar":"Γραμμή εργαλείων στυλ λιστών με κουκίδες",Cancel:"Ακύρωση","Caption for image: %0":"Λεζάντα για την εικόνα: %0","Caption for the image":"Λεζάντα για την εικόνα","Cedi sign":"Σύμβολο σίντι Γκάνας","Cell properties":"Ιδιότητες κελιού","Cent sign":"Σύμβολο λεπτού","Center table":"Στοίχιση πίνακα στο κέντρο","Centered image":"Εικόνα με στοίχιση στο κέντρο","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου εικόνας","Character categories":"Κατηγορίες χαρακτήρων","Choose heading":"Επιλέξτε κεφαλίδα",Circle:"Κύκλος",Clear:"Καθαρισμός","Click to edit block":"Κάντε κλικ για να επεξεργαστείτε το μπλοκ",Close:"Κλείσιμο","Close contextual balloons, dropdowns, and dialogs":"Κλείσιμο παραθύρων σχολίων, αναπτυσσόμενων μενού και παραθύρων διαλόγου",Code:"Κώδικας","Colon sign":"Σύμβολο άνω κάτω τελείας",Color:"Χρώμα","Color picker":"Επιλογέας χρώματος",Column:"Στήλη","Contains as member":"Περιέχει ως μέλος","Content editing keystrokes":"Πλήκτρα επεξεργασίας περιεχομένου","Copy selected content":"Αντιγραφή επιλεγμένου περιεχομένου","Copyright sign":"Σύμβολο πνευματικής ιδιοκτησίας","Create link":"Δημιουργία συνδέσμου","Cruzeiro sign":"Σύμβολο Κρουζέιρο",Currency:"Νόμισμα","Currency sign":"Σύμβολο νομίσματος",Dashed:"Με παύλες",Decimal:"Δεκαδικό","Decimal with leading zero":"Δεκαδικό με μηδενικά","Decrease indent":"Μείωση εσοχής","Decrease list item indent":"Μείωση εσοχής στοιχείου λίστας",Default:"Προεπιλογή","Degree sign":"Σύμβολο βαθμών Κελσίου","Delete column":"Διαγραφή στήλης","Delete row":"Διαγραφή γραμμής","Dim grey":"Θολό γκρι",Dimensions:"Διαστάσεις",Disc:"Δίσκος","Division sign":"Σύμβολο διαίρεσης","Document colors":"Χρώματα εγγράφου","Dollar sign":"Σύμβολο δολλαρίου","Dong sign":"Σύμβολο Ντόνγκ Βιετνάμ",Dotted:"Διάστικτο",Double:"Διπλό"Line truncated
|
||||
!function(t){const e=t.el=t.el||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"(μπορεί να απαιτείται το <kbd> Fn</kbd>)","%0 of %1":"%0 από %1",Accept:"Αποδοχή",Accessibility:"Προσβασιμότητα","Accessibility help":"Βοήθεια προσβασιμότητας","Align cell text to the bottom":"Στοίχιση κειμένου κελιού κάτω","Align cell text to the center":"Στοίχιση κειμένου κελιού στο κέντρο","Align cell text to the left":"Στοίχιση κειμένου κελιού στα αριστερά","Align cell text to the middle":"Στοίχιση κειμένου κελιού στο μέσο","Align cell text to the right":"Στοίχιση κειμένου κελιού στα δεξιά","Align cell text to the top":"Στοίχιση κειμένου κελιού επάνω","Align center":"Στοίχιση στο κέντρο","Align left":"Στοίχιση αριστερά","Align right":"Στοίχιση δεξιά","Align table to the left":"Στοίχιση πίνακα στα αριστερά","Align table to the right":"Στοίχιση πίνακα στα δεξιά",Alignment:"Στοίχιση",All:"Όλα","Almost equal to":"Περίπου ίσο με",Angle:"Γωνία","Approximately equal to":"Κατά προσέγγιση ίσο με",Aquamarine:"Ακουαμαρίνα",Arrows:"Βέλη","Asterisk operator":"Τελεστής αστερίσκος","Austral sign":"Σύμβολο αουστράλ Αργεντινής","back with leftwards arrow above":"όπισθεν με αριστερό βέλος άνω",Background:"Υπόβαθρο","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"Παρακάτω, μπορείτε να βρείτε μια λίστα με συντομεύσεις πληκτρολογίου που μπορείτε να χρησιμοποιήσετε στο εργαλείο επεξεργασίας.",Big:"Μεγάλο","Bitcoin sign":"Σύμβολο Bitcoin",Black:"Μαύρο","Block quote":"Περιοχή παράθεσης",Blue:"Μπλε","Blue marker":"Επισημαντής μπλε",Bold:"Έντονα","Bold text":"Έντονο κείμενο",Border:"Περίγραμμα","Break text":"Κατάτμηση κειμένου","Bulleted List":"Λίστα με κουκκίδες","Bulleted list styles toolbar":"Γραμμή εργαλείων στυλ λιστών με κουκίδες",Cancel:"Ακύρωση","Caption for image: %0":"Λεζάντα για την εικόνα: %0","Caption for the image":"Λεζάντα για την εικόνα",Category:"Κατηγορία","Cedi sign":"Σύμβολο σίντι Γκάνας","Cell properties":"Ιδιότητες κελιού","Cent sign":"Σύμβολο λεπτού","Center table":"Στοίχιση πίνακα στο κέντρο","Centered image":"Εικόνα με στοίχιση στο κέντρο","Change image text alternative":"Αλλαγή εναλλακτικού κείμενου εικόνας","Choose heading":"Επιλέξτε κεφαλίδα",Circle:"Κύκλος",Clear:"Καθαρισμός","Click to edit block":"Κάντε κλικ για να επεξεργαστείτε το μπλοκ",Close:"Κλείσιμο","Close contextual balloons, dropdowns, and dialogs":"Κλείσιμο παραθύρων σχολίων, αναπτυσσόμενων μενού και παραθύρων διαλόγου",Code:"Κώδικας","Code block":"Μπλοκ κώδικα","Colon sign":"Σύμβολο άνω κάτω τελείας",Color:"Χρώμα","Color picker":"Επιλογέας χρώματος",Column:"Στήλη","Contains as member":"Περιέχει ως μέλος","Content editing keystrokes":"Πλήκτρα επεξεργασίας περιεχομένου","Copy selected content":"Αντιγραφή επιλεγμένου περιεχομένου","Copyright sign":"Σύμβολο πνευματικής ιδιοκτησίας","Create link":"Δημιουργία συνδέσμου","Cruzeiro sign":"Σύμβολο Κρουζέιρο",Currency:"Νόμισμα","Currency sign":"Σύμβολο νομίσματος",Custom:"Προσαρμοσμένο","Custom image size":"Προσαρμοσμένο μέγεθος εικόνας",Dashed:"Με παύλες",Decimal:"Δεκαδικό","Decimal with leading zero":"Δεκαδικό με μηδενικά","Decrease indent":"Μείωση εσοχής","Decrease list item indent":"Μείωση εσοχής στοιχείου λίστας",Default:"Προεπιλογή","Degree sign":"Σύμβολο βαθμών Κελσίου","Delete column":"Διαγραφή στήλης","Delete row":"Διαγραφή γραμμής","Dim grey":"Θολό γκρι",Dimensions:"Διαστάσεις",Disc:"Δίσκος","Division sign":"Σύμβολο διαίρεσης","Document colors":"Χρώματα εγγράφουLine truncated
|
||||
@@ -1 +1 @@
|
||||
(function(t){const e=t["en-au"]=t["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"","Accessibility help":"","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align centre","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Centre table","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Character categories":"Character categories","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Colon sign":"Colon sign",Color:"Colour","Color picker":"Colour picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"","Copyright sign":"Copyright sign","Create link":"","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colours","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"","Editor editing area: %0":"Editor editing area: %0","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5","Heading 6":"Heading 6",Height:"Height","Help Contents. To close this dialog press ESC.":"",HEX:"",Highlight:"Highlight","Horizontal ellipsis":"Horizontal ellipsis","Horizontal text alignment toolbar":"Horizontal text alignment toolbar","Hryvnia sign":"Hryvnia sign","HTML
Line truncated
|
||||
!function(t){const e=t["en-au"]=t["en-au"]||{};e.dictionary=Object.assign(e.dictionary||{},{"(may require <kbd>Fn</kbd>)":"","%0 of %1":"%0 of %1",Accept:"",Accessibility:"","Accessibility help":"","Align cell text to the bottom":"Align cell text to the bottom","Align cell text to the center":"Align cell text to the center","Align cell text to the left":"Align cell text to the left","Align cell text to the middle":"Align cell text to the middle","Align cell text to the right":"Align cell text to the right","Align cell text to the top":"Align cell text to the top","Align center":"Align centre","Align left":"Align left","Align right":"Align right","Align table to the left":"Align table to the left","Align table to the right":"Align table to the right",Alignment:"Alignment",All:"All","Almost equal to":"Almost equal to",Angle:"Angle","Approximately equal to":"Approximately equal to",Aquamarine:"Aquamarine",Arrows:"Arrows","Asterisk operator":"Asterisk operator","Austral sign":"Austral sign","back with leftwards arrow above":"back with leftwards arrow above",Background:"Background","Below, you can find a list of keyboard shortcuts that can be used in the editor.":"",Big:"Big","Bitcoin sign":"Bitcoin sign",Black:"Black","Block quote":"Block quote",Blue:"Blue","Blue marker":"Blue marker",Bold:"Bold","Bold text":"",Border:"Border","Break text":"Break text","Bulleted List":"Bulleted List","Bulleted list styles toolbar":"Bulleted list styles toolbar",Cancel:"Cancel","Caption for image: %0":"Caption for image: %0","Caption for the image":"Caption for the image",Category:"","Cedi sign":"Cedi sign","Cell properties":"Cell properties","Cent sign":"Cent sign","Center table":"Centre table","Centered image":"Centred image","Change image text alternative":"Change image text alternative","Choose heading":"Choose heading",Circle:"Circle",Clear:"Clear","Click to edit block":"",Close:"","Close contextual balloons, dropdowns, and dialogs":"",Code:"Code","Code block":"","Colon sign":"Colon sign",Color:"Colour","Color picker":"Colour picker",Column:"Column","Contains as member":"Contains as member","Content editing keystrokes":"","Copy selected content":"","Copyright sign":"Copyright sign","Create link":"","Cruzeiro sign":"Cruzeiro sign",Currency:"Currency","Currency sign":"Currency sign",Custom:"","Custom image size":"",Dashed:"Dashed",Decimal:"Decimal","Decimal with leading zero":"Decimal with leading zero","Decrease indent":"Decrease indent","Decrease list item indent":"",Default:"Default","Degree sign":"Degree sign","Delete column":"Delete column","Delete row":"Delete row","Dim grey":"Dim grey",Dimensions:"Dimensions",Disc:"Disc","Division sign":"Division sign","Document colors":"Document colours","Dollar sign":"Dollar sign","Dong sign":"Dong sign",Dotted:"Dotted",Double:"Double","Double dagger":"Double dagger","Double exclamation mark":"Double exclamation mark","Double low-9 quotation mark":"Double low-9 quotation mark","Double question mark":"Double question mark",Downloadable:"Downloadable","downwards arrow to bar":"downwards arrow to bar","downwards dashed arrow":"downwards dashed arrow","downwards double arrow":"downwards double arrow","downwards simple arrow":"downwards simple arrow","Drachma sign":"Drachma sign","Drag to move":"","Dropdown menu":"","Dropdown toolbar":"Dropdown toolbar","Edit block":"Edit block","Edit link":"Edit link","Edit source":"Edit source","Editor block content toolbar":"Editor block content toolbar","Editor contextual toolbar":"Editor contextual toolbar","Editor dialog":"","Editor menu bar":"","Editor toolbar":"Editor toolbar","Element of":"Element of","Em dash":"Em dash","Empty set":"Empty set","Empty snippet content":"Empty snippet content","En dash":"En dash","end with leftwards arrow above":"end with leftwards arrow above","Enter image caption":"Enter image caption","Enter table caption":"Enter table caption","Entering %0 code snippet":"","Entering a to-do list":"","Entering code snippet":"","Error during image upload":"","Euro sign":"Euro sign","Euro-currency sign":"Euro-currency sign","Exclamation question mark":"Exclamation question mark","Execute the currently focused button. Executing buttons that interact with the editor content moves the focus back to the content.":"","Font Background Color":"Font Background Colour","Font Color":"Font Colour","Font Family":"Font Family","Font Size":"Font Size","For all":"For all","Fraction slash":"Fraction slash","French franc sign":"French franc sign","From computer":"","Full size image":"Full size image","German penny sign":"German penny sign","Greater-than or equal to":"Greater-than or equal to","Greater-than sign":"Greater-than sign",Green:"Green","Green marker":"Green marker","Green pen":"Green pen",Grey:"Grey",Groove:"Groove","Guarani sign":"Guarani sign","Header column":"Header column","Header row":"Header row",Heading:"Heading","Heading 1":"Heading 1","Heading 2":"Heading 2","Heading 3":"Heading 3","Heading 4":"Heading 4","Heading 5":"Heading 5Line truncated
|
||||
Loaded 100 of 162 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user