feat: move nextcloud addressbook user settings under contatcs settings section

This commit is contained in:
Fahim Salam Chowdhury 2024-08-30 13:55:55 +06:00
parent 500b997f91
commit a47cc450e8
4 changed files with 47 additions and 50 deletions

View file

@ -7,6 +7,9 @@ class NextcloudAddressBook implements \RainLoop\Providers\AddressBook\AddressBoo
use RainLoop\Providers\AddressBook\CardDAV; use RainLoop\Providers\AddressBook\CardDAV;
private $contactsManager; private $contactsManager;
private const DEFAULT_URI = 'webmail';
private const SETTINGS_KEY = 'nextCloudAddressBookUri';
function __construct() function __construct()
{ {
$this->GetSavedAddressBookKey(); $this->GetSavedAddressBookKey();
@ -21,20 +24,21 @@ class NextcloudAddressBook implements \RainLoop\Providers\AddressBook\AddressBoo
$this->contactsManager->unregisterAddressBook($addressBook); $this->contactsManager->unregisterAddressBook($addressBook);
} }
} }
$uid = \OC::$server->getUserSession()->getUser()->getUID(); $uid = \OC::$server->getUserSession()->getUser()->getUID();
$cardDavBackend = \OC::$server->get(\OCA\DAV\CardDAV\CardDavBackend::class); $cardDavBackend = \OC::$server->get(\OCA\DAV\CardDAV\CardDavBackend::class);
$principalUri = 'principals/users/' . $uid; $principalUri = 'principals/users/' . $uid;
$uri = $this->GetSavedUri(); $uri = $this->GetSavedUri();
$addressBookId = $cardDavBackend->getAddressBooksByUri($principalUri, $uri); $addressBookId = $cardDavBackend->getAddressBooksByUri($principalUri, $uri);
if ($addressBookId === null) { if ($addressBookId === null) {
$addressBookId = $cardDavBackend->createAddressBook($principalUri, $uri, array_filter([ return $cardDavBackend->createAddressBook($principalUri, $uri, array_filter([
'{DAV:}displayname' => 'WebMail', '{DAV:}displayname' => 'WebMail',
'{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'Recipients from snappymail', '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'Recipients from snappymail',
])); ]));
} else {
$addressBookId = $addressBookId['id'];
} }
return $addressBookId;
return $addressBookId['id'];
} }
public function IsSupported(): bool public function IsSupported(): bool
@ -177,6 +181,6 @@ class NextcloudAddressBook implements \RainLoop\Providers\AddressBook\AddressBoo
private function GetSavedUri(): string private function GetSavedUri(): string
{ {
return $this->Settings()->GetConf('NextCloudAddressBookUri', 'webmail'); return $this->Settings()->GetConf(self::SETTINGS_KEY, self::DEFAULT_URI);
} }
} }

View file

@ -10,6 +10,10 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
DESCRIPTION = 'Integrate with Nextcloud v20+', DESCRIPTION = 'Integrate with Nextcloud v20+',
REQUIRED = '2.36.2'; REQUIRED = '2.36.2';
private const DEFAULT_ADDRESSBOOK_URI = 'webmail';
private const ADDRESSBOOK_SETTINGS_KEY = 'nextCloudAddressBookUri';
public function Init(): void public function Init(): void
{ {
if (static::IsIntegrated()) { if (static::IsIntegrated()) {
@ -42,9 +46,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$this->addHook('smtp.before-login', 'beforeLogin'); $this->addHook('smtp.before-login', 'beforeLogin');
$this->addHook('sieve.before-login', 'beforeLogin'); $this->addHook('sieve.before-login', 'beforeLogin');
$this->addJs('js/addressbook.js'); // add js file $this->addJs('js/addressbook.js');
$this->addTemplate('templates/AddressBookSettings.html'); $this->addJsonHook('NextcloudGetAddressBooks', 'GetAddressBooks');
$this->addJsonHook('JsonGetAddressbooks', 'GetAddressBooks');
$this->addJsonHook('NextcloudUpdateAddressBook', 'UpdateAddressBook'); $this->addJsonHook('NextcloudUpdateAddressBook', 'UpdateAddressBook');
} else { } else {
\SnappyMail\Log::debug('Nextcloud', 'NOT integrated'); \SnappyMail\Log::debug('Nextcloud', 'NOT integrated');
@ -59,7 +62,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$contactsManager = \OC::$server->getContactsManager(); $contactsManager = \OC::$server->getContactsManager();
$selectedUri = $this->Settings()->GetConf('NextCloudAddressBookUri', 'webmail'); $selectedUri = $this->Settings()->GetConf(self::ADDRESSBOOK_SETTINGS_KEY, self::DEFAULT_ADDRESSBOOK_URI);
foreach ($contactsManager->getUserAddressBooks() as $addressBook) { foreach ($contactsManager->getUserAddressBooks() as $addressBook) {
if ($addressBook->isSystemAddressBook()) { if ($addressBook->isSystemAddressBook()) {
@ -88,7 +91,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$uri = $this->jsonParam('uri'); $uri = $this->jsonParam('uri');
$oSettings = $this->Settings(); $oSettings = $this->Settings();
if (\is_string($uri)) { if (\is_string($uri)) {
$oSettings->SetConf('NextCloudAddressBookUri', $uri); $oSettings->SetConf(self::ADDRESSBOOK_SETTINGS_KEY, $uri);
$this->SettingsProvider()->Save($this->Account(), $oSettings); $this->SettingsProvider()->Save($this->Account(), $oSettings);
} }
return $this->jsonResponse(__FUNCTION__, true); return $this->jsonResponse(__FUNCTION__, true);

View file

@ -1,36 +1,38 @@
(rl => { (rl => {
if (rl) { if (rl) {
class AddressBookSettings /* extends AbstractViewSettings */ { addEventListener('rl-view-model', e => {
constructor() { if ('SettingsContacts' === e.detail.viewModelTemplateID) {
this.addressBookList = ko.observableArray(); const container = e.detail.viewModelDom.querySelector('.form-horizontal');
this.selectedAddressBook = ko.observable(); if (container) {
rl.pluginRemoteRequest((iError, oData) => {
if (!iError) {
const mainDivElement = Element.fromHTML('<div class="control-group">'
+ '<label>' + rl.i18n("NEXTCLOUD/ADDRESS_BOOK") + '</label>'
+ '</div>');
rl.pluginRemoteRequest((iError, oData) => { const selectElement = Element.fromHTML('<select></select>');
if (!iError) {
const books = JSON.parse(oData.Result.addressbooks);
books.forEach(book => {
this.addressBookList.push(book);
if (book.selected) { const books = JSON.parse(oData.Result.addressbooks);
this.selectedAddressBook(book.uri); books.forEach(book => {
} if (book.selected) {
}); selectElement.append(Element.fromHTML('<option value="' + book.uri + '" selected="selected">' + book.name + '</option>'));
} else {
this.selectedAddressBook.subscribe(value => { selectElement.append(Element.fromHTML('<option value="' + book.uri + '">' + book.name + '</option>'));
rl.pluginRemoteRequest(() => { }, 'NextcloudUpdateAddressBook', { }
uri: value
}); });
});
}
}, "JsonGetAddressbooks");
}
}
rl.addSettingsViewModel( selectElement.onchange = function() {
AddressBookSettings, rl.pluginRemoteRequest(() => { }, 'NextcloudUpdateAddressBook', {
'AddressBookSettings', uri: selectElement.value
'NEXTCLOUD/ADDRESS_BOOK', });
'addressbook' }
);
mainDivElement.append(selectElement);
container.append(mainDivElement);
}
}, "NextcloudGetAddressBooks");
}
}
});
} }
})(window.rl); })(window.rl);

View file

@ -1,12 +0,0 @@
<div class="b-settings-nextcloud-addressbook form-horizontal">
<div class="legend">AddressBook</div>
<div class="form-horizontal">
<div class="control-group">
<label data-i18n="NEXTCLOUD/ADDRESS_BOOK"></label>
<select data-bind="options: addressBookList, value: selectedAddressBook,
optionsText: 'name', optionsValue: 'uri'"></select>
</div>
</div>
</div>