Synchronizing with a remote CardDAV server (#42, #138, #139)

+ Updated contacts sql shema (breaking changes)
+ Fixes
- Removed SabreDAV Server
- Removed Contacts Sharing (awhile, code refactoring)
This commit is contained in:
RainLoop Team 2014-04-26 01:50:17 +04:00
parent 54a4c2657a
commit d29f20789f
78 changed files with 2024 additions and 2317 deletions

View file

@ -18,19 +18,21 @@
<i data-bind="css: enableContacts() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
Enable contacts
</label>
<label data-bind="click: function () { contactsSharing(!contactsSharing()); }">
<!-- <label data-bind="click: function () { contactsSharing(!contactsSharing()); }">
<i data-bind="css: contactsSharing() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
Allow contacts sharing
</label>
<br />
Allow contacts sharing (disabled)
</label>-->
<label data-bind="click: function () { contactsSync(!contactsSync()); }">
<i data-bind="css: contactsSync() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
Allow contacts sync server (CardDAV)
Allow contacts sync (with external CardDAV server)
</label>
<a href="http://rainloop.net/docs/web-servers/" target="_blank">Web server configuration examples</a>
</div>
</div>
<br />
</div>
<div class="form-horizontal" data-bind="visible: contactsSupported">
<div class="legend">
Storage (PDO)
</div>
<div class="control-group">
<label class="control-label">
Type
@ -41,10 +43,8 @@
<div data-bind="saveTrigger: contactsTypeTrigger"></div>
</div>
</div>
<br />
<div data-bind="visible: 'sqlite' !== contactsType()">
<div class="legend">
PDO (MySQL / PostgreSQL)
</div>
<div class="control-group">
<label class="control-label">
Dsn
@ -90,15 +90,12 @@
</div>
</div>
<div data-bind="visible: 'sqlite' === contactsType()">
<div class="legend">
PDO (SQLite)
</div>
<div class="control-group">
<div class="controls">
<div class="alert alert-null-left-margin span8">
<h4>Notice!</h4>
<br />
Don't use this type of database with a large number of active users.
Don't use this database type with a large number of active users.
</div>
</div>
</div>

View file

@ -31,7 +31,7 @@
</a>
<a class="btn btn-dark-disabled-border button-delete" data-tooltip-placement="bottom" data-bind="command: deleteCommand, tooltip: 'MESSAGE_LIST/BUTTON_DELETE'">
<i class="icon-trash"></i>
<span data-bind="text: printableMessageCountForDeletion()"></span>
<!--<span data-bind="text: printableMessageCountForDeletion()"></span>-->
</a>
</div>
<div class="btn-group">&nbsp;</div>

View file

@ -75,10 +75,10 @@
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SEARCH/LABEL_ADV_FLAGGED"></span>
</label>
<label data-bind="click: function () { hasAttachments(!hasAttachments()); }">
<i data-bind="css: hasAttachments() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
<label data-bind="click: function () { hasAttachment(!hasAttachment()); }">
<i data-bind="css: hasAttachment() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SEARCH/LABEL_ADV_HAS_ATTACHMENTS"></span>
<span class="i18n" data-i18n-text="SEARCH/LABEL_ADV_HAS_ATTACHMENT"></span>
</label>
</div>
</div>

View file

@ -3,7 +3,7 @@
<div class="modal-header b-header-toolbar g-ui-user-select-none">
<button type="button" class="close" data-bind="command: cancelCommand">&times;</button>
<a class="btn btn-large button-send" data-bind="command: sendCommand, css: {'btn-danger': sendError, 'btn-warning': sendSuccessButSaveError }">
<i data-bind="css: {'icon-rocket': !sending(), 'icon-spinner animated': sending(), 'icon-white': sendError() || sendSuccessButSaveError()}"></i>
<i data-bind="css: {'icon-paper-plane': !sending(), 'icon-spinner animated': sending(), 'icon-white': sendError() || sendSuccessButSaveError()}"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="COMPOSE/BUTTON_SEND"></span>
</a>

View file

@ -14,7 +14,8 @@
<div class="btn-group">
<a class="btn dropdown-toggle buttonMore" data-toggle="dropdown">
<i data-bind="css: {'icon-list': !contacts.importing(), 'icon-spinner animated': contacts.importing()}"></i>
<i data-bind="css: {'icon-list': !contacts.importing() && !contacts.syncing(),
'icon-spinner animated': contacts.importing() || contacts.syncing()}"></i>
</a>
<ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item">
@ -24,6 +25,13 @@
<span class="i18n" data-i18n-text="CONTACTS/BUTTON_IMPORT"></span>
</a>
</li>
<li class="e-item" data-bind="visible: enableContactsSync">
<a class="e-link" data-bind="command: syncCommand">
<i class="icon-sync"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="CONTACTS/BUTTON_SYNC"></span>
</a>
</li>
</ul>
</div>
@ -147,32 +155,6 @@
<i class="icon-lock iconsize24" data-tooltip-placement="left" data-bind="tooltip: 'CONTACTS/LABEL_READ_ONLY'"></i>
</div>
<div class="e-share-sign" data-bind="visible: contactsSharingIsAllowed">
<div class="btn-group pull-right">
<a class="btn dropdown-toggle" data-tooltip-placement="left" data-toggle="dropdown" data-bind="tooltip: 'CONTACTS/LABEL_SHARE'">
<i data-bind="css: shareIcon"></i>
&nbsp;&nbsp;
<span class="caret"></span>
</a>
<ul class="dropdown-menu g-ui-menu" role="menu">
<li class="e-item" data-bind="css: {'selected': shareToNone}">
<a class="e-link" data-bind="click: setShareToNone">
<i class="icon-none"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="CONTACTS/BUTTON_SHARE_NONE"></span>
</a>
</li>
<li class="e-item" data-bind="css: {'selected': shareToAll}">
<a class="e-link" data-bind="click: setShareToAll">
<i class="icon-earth"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="CONTACTS/BUTTON_SHARE_ALL"></span>
</a>
</li>
</ul>
</div>
</div>
<button class="btn button-save-contact" data-bind="command: saveCommand, css: {'dirty': watchDirty}">
<i data-bind="css: {'icon-ok': !viewSaving(), 'icon-spinner animated': viewSaving()}"></i>
&nbsp;&nbsp;

View file

@ -13,53 +13,52 @@
</div>
</div>
</div>
<br />
<div class="form-horizontal" data-bind="visible: allowContactsSync">
<div class="legend">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LEGEND_MOBILE_SYNC"></span>
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LEGEND_CONTACTS_SYNC"></span>
</div>
<div class="control-group">
<label class="control-label" style="padding-top: 0;">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_SYNC_SERVER"></span>
<div class="controls">
<label data-bind="click: function () { enableContactsSync(!enableContactsSync()); }">
<i data-bind="css: enableContactsSync() ? 'icon-checkbox-checked' : 'icon-checkbox-unchecked'"></i>
&nbsp;&nbsp;
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_ENABLE"></span>
</label>
</div>
</div>
<!-- <div class="control-group">
<label class="control-label">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_SERVER"></span>
</label>
<div class="controls">
<strong data-bind="text: contactsSyncServer"></strong>
<input type="text" data-bind="" />
</div>
</div>
</div>-->
<div class="control-group">
<label class="control-label" style="padding-top: 0;">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_SYNC_USERNAME"></span>
<label class="control-label">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_AB_URL"></span>
</label>
<div class="controls">
<strong data-bind="text: contactsSyncUser"></strong>
<input class="input-xxlarge" type="text" data-bind="value: contactsSyncUrl" />
</div>
</div>
<div class="control-group">
<label class="control-label" style="padding-top: 0;">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_SYNC_PASSWORD"></span>
<label class="control-label">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_USER"></span>
</label>
<div class="controls">
<strong style="color:red" data-bind="text: contactsSyncPass, visible: showPassword"></strong>
<span class="g-ui-link i18n" data-bind="visible: !showPassword(), click: toggleShowPassword"
data-i18n-text="SETTINGS_CONTACTS/LINK_SHOW"></span>
&nbsp;&nbsp;
<span class="g-ui-link i18n" data-bind="visible: showPassword, click: toggleShowPassword"
data-i18n-text="SETTINGS_CONTACTS/LINK_HIDE"></span>
<input type="text" data-bind="value: contactsSyncUser" />
</div>
</div>
<div class="control-group">
<label class="control-label">
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_CONTACTS_SYNC_PASSWORD"></span>
</label>
<div class="controls">
<div class="alert alert-info span7" style="margin-left: 0">
<p>
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/DESC_FULL_PAB_URL"></span>
</p>
<p>
<span class="i18n" data-i18n-text="SETTINGS_CONTACTS/LABEL_DESC_PAB"></span>:
<br />
<a href="javascript:void(0);" target="_blank" data-bind="text: contactsSyncPabUrl, attr: {'href': contactsSyncPabUrl}"></a>
</p>
</div>
<br />
<input type="password" data-bind="value: contactsSyncPass" />
</div>
</div>
</div>
</div>
</div>