Fixed basic API calls (not visible in UI yet)

This commit is contained in:
scharel 2021-06-21 00:17:10 +02:00
parent 79ed971afe
commit 6ff59f1971
7 changed files with 151 additions and 111 deletions

View file

@ -24,7 +24,7 @@ ApplicationWindow
path: "/apps/harbour-nextcloudnotes"
property bool initialized: false
property var accounts: value("accounts", [], Array)
property var accountList: value("accountList", [], Array)
property string currentAccount: value("currentAccount", "", String)
property int autoSyncInterval: value("autoSyncInterval", 0, Number)
property int previewLineCount: value("previewLineCount", 4, Number)
@ -34,10 +34,6 @@ ApplicationWindow
property bool useMonoFont: value("useMonoFont", false, Boolean)
property bool useCapitalX: value("useCapitalX", false, Boolean)
onCurrentAccountChanged: {
console.log("Current account: " + currentAccount)
}
onSortByChanged: {
if (sortBy == "none") Notes.model.invalidate()
}
@ -47,9 +43,9 @@ ApplicationWindow
function createAccount(username, password, url, name) {
var hash = accountHash.hash(username, url)
var tmpaccounts = accounts
var tmpaccounts = accountList
tmpaccounts.push(hash)
accounts = tmpaccounts
accountList = tmpaccounts
tmpAccount.path = appSettings.path + "/accounts/" + hash
tmpAccount.url = url
@ -64,13 +60,18 @@ ApplicationWindow
Nextcloud.deleteAppPassword(appSettings.value("accounts/" + hash + "/password"),
appSettings.value("accounts/" + hash + "/username"),
appSettings.value("accounts/" + hash + "/url"))
var tmpaccounts = accounts
var tmpaccounts = accountList
tmpaccounts.pop(hash)
accounts = tmpaccounts
accountList = tmpaccounts
tmpAccount.path = appSettings.path + "/accounts/" + hash
tmpAccount.clear()
currentAccount = accounts[-1]
if (accountList[-1]) {
currentAccount = accountList[-1]
}
else {
currentAccount = ""
}
}
}
@ -78,7 +79,10 @@ ApplicationWindow
id: account
Connections {
target: appSettings
onCurrentAccountChanged: account.path = appSettings.path + "/accounts/" + appSettings.currentAccount
onCurrentAccountChanged: {
account.path = appSettings.path + "/accounts/" + appSettings.currentAccount
console.log("Current account: " + account.username + "@" + account.url)
}
}
property url url: value("url", "", String)

View file

@ -1,13 +1,14 @@
import QtQuick 2.2
import Sailfish.Silica 1.0
import harbour.nextcloudapi 1.0
import harbour.nextcloudapi.notes 1.0
Page {
id: page
onStatusChanged: {
if (status === PageStatus.Activating) {
if (appSettings.accounts.length <= 0) {
if (appSettings.accountList.length <= 0) {
addAccountHint.restart()
}
else {
@ -35,13 +36,13 @@ Page {
text: qsTr("Add note")
visible: appSettings.currentAccount !== ""
enabled: Nextcloud.networkAccessible
onClicked: Nextcloud.createNote( { 'content': "", 'modified': new Date().valueOf() / 1000 } )
onClicked: Notes.createNote( { 'content': "", 'modified': new Date().valueOf() / 1000 } )
}
MenuItem {
text: Nextcloud.networkAccessible && !Nextcloud.busy ? qsTr("Reload") : qsTr("Updating...")
visible: appSettings.currentAccount !== ""
enabled: Nextcloud.networkAccessible && !Nextcloud.busy
onClicked: Nextcloud.getAllNotes()
onClicked: Notes.getAllNotes()
}
MenuLabel {
visible: appSettings.currentAccount !== ""
@ -227,7 +228,7 @@ Page {
ViewPlaceholder {
id: noLoginPlaceholder
enabled: appSettings.accounts.length <= 0
enabled: appSettings.accountList.length <= 0
text: qsTr("No account yet")
hintText: qsTr("Got to the settings to add an account")
}

View file

@ -32,7 +32,7 @@ Page {
}
Label {
id: noAccountsLabel
visible: appSettings.accounts.length <= 0
visible: appSettings.accountList.length <= 0
text: qsTr("No Nextcloud account yet")
font.pixelSize: Theme.fontSizeLarge
color: Theme.secondaryHighlightColor
@ -43,7 +43,7 @@ Page {
}
Repeater {
id: accountRepeater
model: appSettings.accounts
model: appSettings.accountList
delegate: ListItem {
id: accountListItem
@ -53,15 +53,17 @@ Page {
ConfigurationGroup {
id: settingsAccount
path: appSettings.path + "/accounts/" + modelData
onPathChanged: console.log(path)
Component.onCompleted: {
accountTextSwitch.text = value("name", qsTr("Account %1").arg(index+1))
accountTextSwitch.description = value("username") + "@" + value("url")
}
property url url: value("url", "", String)
property string username: value("username", "", String)
property string passowrd: value("password", "", String)
property string name: value("name", qsTr("Account %1").arg(index+1), String)
property var update: value("update", new Date(0), Date)
}
TextSwitch {
id: accountTextSwitch
text: settingsAccount.name
description: settingsAccount.username + "@" + settingsAccount.url
automaticCheck: false
checked: modelData === appSettings.currentAccount
onClicked: {

View file

@ -13,9 +13,9 @@ class AbstractNextcloudApp : public QObject {
public:
AbstractNextcloudApp(QObject *parent = nullptr, QString name = QString(), NextcloudApi* api = nullptr) : QObject(parent), m_appName(name), m_api(api) {
connect(this, SIGNAL(capabilitiesChanged(QJsonObject*)), this, SLOT(updateCapabilities(QJsonObject*)));
//connect(this, SIGNAL(capabilitiesChanged(QJsonObject*)), this, SLOT(updateCapabilities(QJsonObject*)));
connect(m_api, SIGNAL(capabilitiesChanged(QJsonObject*)), this, SLOT(updateApiCapabilities(QJsonObject*)));
connect(this, SIGNAL(replyReceived(QNetworkReply*)), this, SLOT(updateReply(QNetworkReply*)));
//connect(this, SIGNAL(replyReceived(QNetworkReply*)), this, SLOT(updateReply(QNetworkReply*)));
connect(m_api, SIGNAL(apiFinished(QNetworkReply*)), this, SLOT(updateApiReply(QNetworkReply*)));
}

View file

@ -3,6 +3,8 @@
NotesApp::NotesApp(QObject *parent, NextcloudApi* api)
: AbstractNextcloudApp(parent, "notes", api) {
m_notesProxy.setSourceModel(&m_notesModel);
connect(this, SIGNAL(capabilitiesChanged(QJsonObject*)), this, SLOT(updateCapabilities(QJsonObject*)));
connect(this, SIGNAL(replyReceived(QNetworkReply*)), this, SLOT(updateReply(QNetworkReply*)));
}
// QML singleton
@ -41,12 +43,28 @@ bool NotesApp::getAllNotes(const QStringList& exclude) {
QUrlQuery query;
if (!exclude.isEmpty())
query.addQueryItem(EXCLUDE_QUERY, exclude.join(","));
return m_api->get(NOTES_APP_ENDPOINT, query);
QNetworkReply* reply = m_api->get(QString(NOTES_APP_ENDPOINT).append("/notes"), query);
if (reply->error() == QNetworkReply::NoError) {
m_replies << reply;
return true;
}
else {
reply->deleteLater();
return false;
}
}
bool NotesApp::getNote(const int id) {
qDebug() << "Getting note: " << id;
return m_api->get(NOTES_APP_ENDPOINT + QString("/%1").arg(id));
QNetworkReply* reply = m_api->get(QString(NOTES_APP_ENDPOINT).append("/notes/%1").arg(id));
if (reply->error() == QNetworkReply::NoError) {
m_replies << reply;
return true;
}
else {
reply->deleteLater();
return false;
}
}
bool NotesApp::createNote(const QJsonObject& note, bool local) {
@ -56,7 +74,15 @@ bool NotesApp::createNote(const QJsonObject& note, bool local) {
m_notes.append(value);
}
if (!local) {
return m_api->post(NOTES_APP_ENDPOINT, QJsonDocument(note).toJson());
QNetworkReply* reply = m_api->post(QString(NOTES_APP_ENDPOINT).append("/notes"), QJsonDocument(note).toJson());
if (reply->error() == QNetworkReply::NoError) {
m_replies << reply;
return true;
}
else {
reply->deleteLater();
return false;
}
}
return true;
}
@ -85,7 +111,15 @@ bool NotesApp::updateNote(const int id, const QJsonObject& note, bool local) {
}
}
if (!local) {
return m_api->put(NOTES_APP_ENDPOINT + QString("/%1").arg(id), QJsonDocument(note).toJson());
QNetworkReply* reply = m_api->put(QString(NOTES_APP_ENDPOINT).append("/notes/%1").arg(id), QJsonDocument(note).toJson());
if (reply->error() == QNetworkReply::NoError) {
m_replies << reply;
return true;
}
else {
reply->deleteLater();
return false;
}
}
return done;
}
@ -102,7 +136,15 @@ bool NotesApp::deleteNote(const int id, bool local) {
}
}
if (!local) {
return m_api->del(NOTES_APP_ENDPOINT + QString("/%1").arg(id));
QNetworkReply* reply = m_api->del(QString(NOTES_APP_ENDPOINT).append("/notes/%1").arg(id));
if (reply->error() == QNetworkReply::NoError) {
m_replies << reply;
return true;
}
else {
reply->deleteLater();
return false;
}
}
return done;
}
@ -112,7 +154,9 @@ void NotesApp::updateReply(QNetworkReply* reply) {
qDebug() << reply->error() << reply->errorString();
QByteArray data = reply->readAll();
//qDebug() << data;
QJsonDocument json = QJsonDocument::fromJson(data);
qDebug() << json;
if (json.isObject()) {
QJsonObject obj = json.object();
updateNote(obj.value("id").toInt(), obj, true);

View file

@ -351,9 +351,6 @@ void NextcloudApi::replyFinished(QNetworkReply* reply) {
qDebug() << reply->error() << reply->errorString();
qDebug() << reply->url().toDisplayString();
QByteArray data = reply->readAll();
QJsonDocument json = QJsonDocument::fromJson(data);
//qDebug() << data;
switch (reply->error()) {
case QNetworkReply::NoError:
@ -362,34 +359,32 @@ void NextcloudApi::replyFinished(QNetworkReply* reply) {
case QNetworkAccessManager::GetOperation:
if (reply->url().toString().endsWith(STATUS_ENDPOINT)) {
qDebug() << "Nextcloud status.php";
updateStatus(json.object());
updateStatus(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url().toString().endsWith(GET_APPPASSWORD_ENDPOINT)) {
qDebug() << "App password received";
updateAppPassword(json.object());
updateAppPassword(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url().toString().contains(QString(USER_METADATA_ENDPOINT).remove(QRegExp("/%[0-9]")))) {
qDebug() << "User metadata for" << reply->url().toString().split('/').last() << "received";
updateUserMeta(json.object());
updateUserMeta(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url().toString().endsWith(LIST_USERS_ENDPOINT)) {
qDebug() << "User list received";
updateUserList(json.object());
updateUserList(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url().toString().endsWith(CAPABILITIES_ENDPOINT)) {
qDebug() << "Capabilites received";
updateCapabilities(json.object());
updateCapabilities(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url().toString().endsWith(USER_NOTIFICATION_ENDPOINT)) {
qDebug() << "Notifications are not yet implemented!";
qDebug() << json.object().value("ocs").toObject().value("data").toArray();
qDebug() << QJsonDocument::fromJson(reply->readAll()).object().value("ocs").toObject().value("data").toArray();
}
else {
qDebug() << "GET reply received";
break;
}
m_replies.removeOne(reply);
reply->deleteLater();
break;
case QNetworkAccessManager::PutOperation:
if (reply->url().toString().endsWith(DIRECT_DOWNLOAD_ENDPOINT)) {
@ -399,43 +394,37 @@ void NextcloudApi::replyFinished(QNetworkReply* reply) {
qDebug() << "PUT reply received";
break;
}
m_replies.removeOne(reply);
reply->deleteLater();
break;
case QNetworkAccessManager::PostOperation:
if (reply->url().toString().endsWith(LOGIN_FLOWV2_ENDPOINT)) {
qDebug() << "Login Flow v2 initiated.";
updateLoginFlow(json.object());
updateLoginFlow(QJsonDocument::fromJson(reply->readAll()).object());
}
else if (reply->url() == m_pollUrl) {
qDebug() << "Login Flow v2 finished.";
updateLoginCredentials(json.object());
updateLoginCredentials(QJsonDocument::fromJson(reply->readAll()).object());
}
else {
qDebug() << "POST reply received";
break;
}
m_replies.removeOne(reply);
reply->deleteLater();
break;
case QNetworkAccessManager::DeleteOperation:
if (reply->url().toString().endsWith(DEL_APPPASSWORD_ENDPOINT)) {
deleteAppPassword(json.object());
deleteAppPassword(QJsonDocument::fromJson(reply->readAll()).object());
}
else {
qDebug() << "DELETE reply received";
break;
}
m_replies.removeOne(reply);
reply->deleteLater();
break;
default:
qDebug() << "Unknown reply received:" << reply->operation() << reply->url();
m_replies.removeOne(reply);
reply->deleteLater();
break;
}
emit apiFinished(reply);
m_replies.removeOne(reply);
reply->deleteLater();
break;
case QNetworkReply::AuthenticationRequiredError:
qDebug() << reply->errorString();

View file

@ -407,97 +407,97 @@
<context>
<name>NotesPage</name>
<message>
<location filename="../qml/pages/NotesPage.qml" line="31"/>
<location filename="../qml/pages/NotesPage.qml" line="32"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="35"/>
<location filename="../qml/pages/NotesPage.qml" line="36"/>
<source>Add note</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="41"/>
<location filename="../qml/pages/NotesPage.qml" line="42"/>
<source>Reload</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="41"/>
<location filename="../qml/pages/NotesPage.qml" line="42"/>
<source>Updating...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="48"/>
<location filename="../qml/pages/NotesPage.qml" line="49"/>
<source>Last update</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="51"/>
<location filename="../qml/pages/NotesPage.qml" line="52"/>
<source>never</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="61"/>
<location filename="../qml/pages/NotesPage.qml" line="62"/>
<source>Nextcloud Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="190"/>
<location filename="../qml/pages/NotesPage.qml" line="191"/>
<source>Modified</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="193"/>
<location filename="../qml/pages/NotesPage.qml" line="194"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="195"/>
<location filename="../qml/pages/NotesPage.qml" line="196"/>
<source>Deleting note</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="225"/>
<location filename="../qml/pages/NotesPage.qml" line="226"/>
<source>Loading notes...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="231"/>
<location filename="../qml/pages/NotesPage.qml" line="232"/>
<source>No account yet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="232"/>
<location filename="../qml/pages/NotesPage.qml" line="233"/>
<source>Got to the settings to add an account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="238"/>
<location filename="../qml/pages/NotesPage.qml" line="239"/>
<source>No notes yet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="239"/>
<location filename="../qml/pages/NotesPage.qml" line="240"/>
<source>Pull down to add a note</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="245"/>
<location filename="../qml/pages/NotesPage.qml" line="246"/>
<source>No result</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="246"/>
<location filename="../qml/pages/NotesPage.qml" line="247"/>
<source>Try another query</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="252"/>
<location filename="../qml/pages/NotesPage.qml" line="253"/>
<source>An error occurred</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/NotesPage.qml" line="263"/>
<location filename="../qml/pages/NotesPage.qml" line="264"/>
<source>Open the settings to configure your Nextcloud accounts</source>
<translation type="unfinished"></translation>
</message>
@ -525,182 +525,182 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="58"/>
<location filename="../qml/pages/SettingsPage.qml" line="59"/>
<source>Account %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="74"/>
<location filename="../qml/pages/SettingsPage.qml" line="76"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="80"/>
<location filename="../qml/pages/SettingsPage.qml" line="82"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="82"/>
<location filename="../qml/pages/SettingsPage.qml" line="84"/>
<source>Deleting account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="92"/>
<location filename="../qml/pages/SettingsPage.qml" line="94"/>
<source>Add account</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="100"/>
<location filename="../qml/pages/SettingsPage.qml" line="102"/>
<source>Synchronization</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="104"/>
<location filename="../qml/pages/SettingsPage.qml" line="106"/>
<source>Auto-Sync</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="105"/>
<location filename="../qml/pages/SettingsPage.qml" line="107"/>
<source>Periodically pull notes from the server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="112"/>
<location filename="../qml/pages/SettingsPage.qml" line="114"/>
<source>Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="112"/>
<location filename="../qml/pages/SettingsPage.qml" line="114"/>
<source>every</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="114"/>
<location filename="../qml/pages/SettingsPage.qml" line="116"/>
<source>Minutes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="115"/>
<location filename="../qml/pages/SettingsPage.qml" line="117"/>
<source>Seconds</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="138"/>
<location filename="../qml/pages/SettingsPage.qml" line="140"/>
<source>The Answer is 42</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="139"/>
<location filename="../qml/pages/SettingsPage.qml" line="141"/>
<source>Congratulation you found the Answer to the Ultimate Question of Life, The Universe, and Everything!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="147"/>
<location filename="../qml/pages/SettingsPage.qml" line="149"/>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="155"/>
<location filename="../qml/pages/SettingsPage.qml" line="157"/>
<source>No sorting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="179"/>
<location filename="../qml/pages/SettingsPage.qml" line="181"/>
<source>Favorites on top</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="180"/>
<location filename="../qml/pages/SettingsPage.qml" line="182"/>
<source>Show notes marked as favorite above the others</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="218"/>
<location filename="../qml/pages/SettingsPage.qml" line="220"/>
<source>Reset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="221"/>
<location filename="../qml/pages/SettingsPage.qml" line="223"/>
<source>Reset app settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="223"/>
<location filename="../qml/pages/SettingsPage.qml" line="225"/>
<source>Cleared app data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="226"/>
<location filename="../qml/pages/SettingsPage.qml" line="228"/>
<source>Resetting the app wipes all application data from the device! This includes offline synced notes, app settings and accounts.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="152"/>
<location filename="../qml/pages/SettingsPage.qml" line="154"/>
<source>Last edited</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="153"/>
<location filename="../qml/pages/SettingsPage.qml" line="155"/>
<source>Category</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="154"/>
<location filename="../qml/pages/SettingsPage.qml" line="156"/>
<source>Title alphabetically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="157"/>
<location filename="../qml/pages/SettingsPage.qml" line="159"/>
<source>Sort notes by</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="158"/>
<location filename="../qml/pages/SettingsPage.qml" line="160"/>
<source>This will also change how the notes are grouped</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="185"/>
<location filename="../qml/pages/SettingsPage.qml" line="187"/>
<source>Show separator</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="186"/>
<location filename="../qml/pages/SettingsPage.qml" line="188"/>
<source>Show a separator line between the notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="196"/>
<location filename="../qml/pages/SettingsPage.qml" line="198"/>
<source>lines</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="197"/>
<location filename="../qml/pages/SettingsPage.qml" line="199"/>
<source>Number of lines in the preview</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="202"/>
<location filename="../qml/pages/SettingsPage.qml" line="204"/>
<source>Editing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="205"/>
<location filename="../qml/pages/SettingsPage.qml" line="207"/>
<source>Monospaced font</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="206"/>
<location filename="../qml/pages/SettingsPage.qml" line="208"/>
<source>Use a monospeced font to edit a note</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="211"/>
<location filename="../qml/pages/SettingsPage.qml" line="213"/>
<source>Capital &apos;X&apos; in checkboxes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/pages/SettingsPage.qml" line="212"/>
<location filename="../qml/pages/SettingsPage.qml" line="214"/>
<source>For interoperability with other apps such as Joplin</source>
<translation type="unfinished"></translation>
</message>
@ -912,27 +912,27 @@ You can also use other markdown syntax inside them.</source>
<context>
<name>harbour-nextcloudnotes</name>
<message>
<location filename="../qml/harbour-nextcloudnotes.qml" line="111"/>
<location filename="../qml/harbour-nextcloudnotes.qml" line="115"/>
<source>Notes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/harbour-nextcloudnotes.qml" line="112"/>
<location filename="../qml/harbour-nextcloudnotes.qml" line="116"/>
<source>Offline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/harbour-nextcloudnotes.qml" line="113"/>
<location filename="../qml/harbour-nextcloudnotes.qml" line="117"/>
<source>Synced</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/harbour-nextcloudnotes.qml" line="127"/>
<location filename="../qml/harbour-nextcloudnotes.qml" line="131"/>
<source>API error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../qml/harbour-nextcloudnotes.qml" line="120"/>
<location filename="../qml/harbour-nextcloudnotes.qml" line="124"/>
<source>File error</source>
<translation type="unfinished"></translation>
</message>