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;
private $contactsManager;
private const DEFAULT_URI = 'webmail';
private const SETTINGS_KEY = 'nextCloudAddressBookUri';
function __construct()
{
$this->GetSavedAddressBookKey();
@ -21,20 +24,21 @@ class NextcloudAddressBook implements \RainLoop\Providers\AddressBook\AddressBoo
$this->contactsManager->unregisterAddressBook($addressBook);
}
}
$uid = \OC::$server->getUserSession()->getUser()->getUID();
$cardDavBackend = \OC::$server->get(\OCA\DAV\CardDAV\CardDavBackend::class);
$principalUri = 'principals/users/' . $uid;
$uri = $this->GetSavedUri();
$addressBookId = $cardDavBackend->getAddressBooksByUri($principalUri, $uri);
if ($addressBookId === null) {
$addressBookId = $cardDavBackend->createAddressBook($principalUri, $uri, array_filter([
return $cardDavBackend->createAddressBook($principalUri, $uri, array_filter([
'{DAV:}displayname' => 'WebMail',
'{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'Recipients from snappymail',
]));
} else {
$addressBookId = $addressBookId['id'];
}
return $addressBookId;
return $addressBookId['id'];
}
public function IsSupported(): bool
@ -177,6 +181,6 @@ class NextcloudAddressBook implements \RainLoop\Providers\AddressBook\AddressBoo
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+',
REQUIRED = '2.36.2';
private const DEFAULT_ADDRESSBOOK_URI = 'webmail';
private const ADDRESSBOOK_SETTINGS_KEY = 'nextCloudAddressBookUri';
public function Init(): void
{
if (static::IsIntegrated()) {
@ -42,9 +46,8 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$this->addHook('smtp.before-login', 'beforeLogin');
$this->addHook('sieve.before-login', 'beforeLogin');
$this->addJs('js/addressbook.js'); // add js file
$this->addTemplate('templates/AddressBookSettings.html');
$this->addJsonHook('JsonGetAddressbooks', 'GetAddressBooks');
$this->addJs('js/addressbook.js');
$this->addJsonHook('NextcloudGetAddressBooks', 'GetAddressBooks');
$this->addJsonHook('NextcloudUpdateAddressBook', 'UpdateAddressBook');
} else {
\SnappyMail\Log::debug('Nextcloud', 'NOT integrated');
@ -59,7 +62,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$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) {
if ($addressBook->isSystemAddressBook()) {
@ -88,7 +91,7 @@ class NextcloudPlugin extends \RainLoop\Plugins\AbstractPlugin
$uri = $this->jsonParam('uri');
$oSettings = $this->Settings();
if (\is_string($uri)) {
$oSettings->SetConf('NextCloudAddressBookUri', $uri);
$oSettings->SetConf(self::ADDRESSBOOK_SETTINGS_KEY, $uri);
$this->SettingsProvider()->Save($this->Account(), $oSettings);
}
return $this->jsonResponse(__FUNCTION__, true);

View file

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