2018-10-16 18:50:58 +03:00
|
|
|
import QtQuick 2.0
|
|
|
|
import Sailfish.Silica 1.0
|
2019-01-29 01:15:53 +03:00
|
|
|
import harbour.nextcloudnotes.note 1.0
|
2019-11-11 01:04:42 +03:00
|
|
|
import harbour.nextcloudnotes.notesmodel 1.0
|
2018-10-16 18:50:58 +03:00
|
|
|
|
|
|
|
Page {
|
|
|
|
id: page
|
|
|
|
|
2019-11-11 01:04:42 +03:00
|
|
|
property NotesModel notesModel: notesApi.model()
|
2019-11-12 01:23:41 +03:00
|
|
|
Connections {
|
|
|
|
target: appSettings
|
|
|
|
onSortByChanged: notesModel.sortRole = notesModel.sortingRole(appSettings.sortBy)
|
|
|
|
onFavoritesOnTopChanged: notesModel.favoritesOnTop = appSettings.favoritesOnTop
|
|
|
|
}
|
2018-12-20 20:53:29 +03:00
|
|
|
|
2018-11-18 00:28:25 +03:00
|
|
|
onStatusChanged: {
|
|
|
|
if (status === PageStatus.Active) {
|
2018-12-07 02:30:18 +03:00
|
|
|
if (appSettings.accountIDs.length <= 0) {
|
|
|
|
addAccountHint.restart()
|
2018-11-18 00:28:25 +03:00
|
|
|
}
|
|
|
|
else {
|
2018-12-07 02:30:18 +03:00
|
|
|
autoSyncTimer.restart()
|
2018-11-18 00:28:25 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-10-16 18:50:58 +03:00
|
|
|
SilicaListView {
|
|
|
|
id: notesList
|
|
|
|
anchors.fill: parent
|
2018-12-13 01:10:45 +03:00
|
|
|
spacing: Theme.paddingLarge
|
2018-10-16 18:50:58 +03:00
|
|
|
|
|
|
|
PullDownMenu {
|
2019-11-11 01:04:42 +03:00
|
|
|
busy: notesApi.busy
|
2018-10-22 23:53:14 +03:00
|
|
|
|
2018-10-16 18:50:58 +03:00
|
|
|
MenuItem {
|
|
|
|
text: qsTr("Settings")
|
2018-10-22 23:53:14 +03:00
|
|
|
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
|
|
|
MenuItem {
|
|
|
|
text: qsTr("Add note")
|
2018-12-07 02:30:18 +03:00
|
|
|
enabled: appSettings.currentAccount.length > 0
|
2019-11-11 01:04:42 +03:00
|
|
|
onClicked: notesApi.createNote( { 'content': "" } )
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
2018-11-15 00:13:47 +03:00
|
|
|
MenuItem {
|
2018-11-24 21:34:01 +03:00
|
|
|
text: enabled ? qsTr("Reload") : qsTr("Updating...")
|
2019-11-11 01:04:42 +03:00
|
|
|
enabled: appSettings.currentAccount.length > 0 && !notesApi.busy
|
|
|
|
onClicked: notesApi.getAllNotes()
|
2018-11-15 00:13:47 +03:00
|
|
|
}
|
|
|
|
MenuLabel {
|
2018-12-07 02:30:18 +03:00
|
|
|
visible: appSettings.currentAccount.length > 0
|
|
|
|
text: qsTr("Last update") + ": " + (
|
2018-12-27 22:38:14 +03:00
|
|
|
new Date(account.update).valueOf() !== 0 ?
|
|
|
|
new Date(account.update).toLocaleString(Qt.locale(), Locale.ShortFormat) :
|
2018-12-07 02:30:18 +03:00
|
|
|
qsTr("never"))
|
2018-11-15 00:13:47 +03:00
|
|
|
}
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
|
|
|
|
2018-11-18 13:25:28 +03:00
|
|
|
header: PageHeader {
|
2018-12-04 18:31:28 +03:00
|
|
|
height: searchField.height + description.height
|
2018-12-03 22:33:37 +03:00
|
|
|
SearchField {
|
|
|
|
id: searchField
|
|
|
|
width: parent.width
|
2019-06-21 18:49:54 +03:00
|
|
|
enabled: !busyIndicator.running && !noLoginPlaceholder.enabled && !errorPlaceholder.enabled && !noNotesPlaceholder.enabled
|
2018-12-27 22:38:14 +03:00
|
|
|
placeholderText: account.name.length > 0 ? account.name : qsTr("Nextcloud Notes")
|
2018-12-03 22:33:37 +03:00
|
|
|
EnterKey.iconSource: "image://theme/icon-m-enter-close"
|
|
|
|
EnterKey.onClicked: focus = false
|
2019-11-12 01:23:41 +03:00
|
|
|
onTextChanged: notesModel.setFilterFixedString(text)
|
2018-11-25 16:08:00 +03:00
|
|
|
}
|
2018-12-04 18:31:28 +03:00
|
|
|
Label {
|
|
|
|
id: description
|
|
|
|
x: Theme.horizontalPageMargin
|
|
|
|
width: parent.width - 2*x
|
2018-12-27 22:38:14 +03:00
|
|
|
visible: text.length > 1
|
2018-12-04 18:31:28 +03:00
|
|
|
anchors.bottom: parent.bottom
|
|
|
|
anchors.bottomMargin: Theme.paddingMedium
|
|
|
|
color: Theme.secondaryHighlightColor
|
|
|
|
font.pixelSize: Theme.fontSizeSmall
|
2019-11-11 01:04:42 +03:00
|
|
|
text: account.username + "@" + account.server
|
2018-12-05 19:06:06 +03:00
|
|
|
}
|
|
|
|
BusyIndicator {
|
|
|
|
anchors.verticalCenter: searchField.verticalCenter
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Theme.horizontalPageMargin
|
|
|
|
size: BusyIndicatorSize.Medium
|
2019-11-11 01:04:42 +03:00
|
|
|
running: notesApi.busy && !busyIndicator.running
|
2018-12-04 18:31:28 +03:00
|
|
|
}
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
currentIndex: -1
|
|
|
|
|
2019-11-11 01:04:42 +03:00
|
|
|
model: notesModel
|
2018-10-16 18:50:58 +03:00
|
|
|
|
2019-01-29 01:15:53 +03:00
|
|
|
delegate: BackgroundItem {
|
|
|
|
id: note
|
|
|
|
|
|
|
|
contentHeight: titleLabel.height + previewLabel.height + 2*Theme.paddingSmall
|
|
|
|
height: contentHeight + menu.height
|
|
|
|
width: parent.width
|
|
|
|
highlighted: down || menu.active
|
|
|
|
ListView.onAdd: AddAnimation {
|
|
|
|
target: note //searchText !== "" ? null : note
|
|
|
|
}
|
|
|
|
ListView.onRemove: RemoveAnimation {
|
|
|
|
target: note //searchText !== "" ? null : note
|
|
|
|
}
|
|
|
|
RemorseItem {
|
|
|
|
id: remorse
|
|
|
|
}
|
|
|
|
|
|
|
|
onClicked: pageStack.push(Qt.resolvedUrl("../pages/NotePage.qml"),
|
2019-11-11 01:04:42 +03:00
|
|
|
{ //note: noteListModel.get(index),
|
2019-06-21 18:49:54 +03:00
|
|
|
id: id,
|
2019-05-14 00:32:37 +03:00
|
|
|
modified: modified,
|
|
|
|
title: title,
|
|
|
|
category: category,
|
|
|
|
content: content,
|
|
|
|
favorite: favorite,
|
|
|
|
etag: etag,
|
|
|
|
error: error,
|
2019-11-11 01:04:42 +03:00
|
|
|
errorMessage: errorMessage
|
|
|
|
//date: date
|
2019-05-14 00:32:37 +03:00
|
|
|
})
|
2019-01-29 01:15:53 +03:00
|
|
|
onPressAndHold: menu.open(note)
|
|
|
|
|
|
|
|
Separator {
|
|
|
|
width: parent.width
|
|
|
|
color: Theme.primaryColor
|
|
|
|
anchors.top: titleLabel.top
|
|
|
|
visible: appSettings.showSeparator && index !== 0
|
|
|
|
}
|
|
|
|
|
|
|
|
IconButton {
|
|
|
|
id: isFavoriteIcon
|
|
|
|
anchors.left: parent.left
|
|
|
|
anchors.top: parent.top
|
|
|
|
icon.source: (favorite ? "image://theme/icon-m-favorite-selected?" : "image://theme/icon-m-favorite?") +
|
|
|
|
(note.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor)
|
|
|
|
onClicked: {
|
2019-11-11 01:04:42 +03:00
|
|
|
notesApi.updateNote(id, {'favorite': !favorite} )
|
2019-01-29 01:15:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
|
|
|
id: titleLabel
|
|
|
|
anchors.left: isFavoriteIcon.right
|
|
|
|
anchors.leftMargin: Theme.paddingSmall
|
|
|
|
anchors.right: categoryRectangle.visible ? categoryRectangle.left : parent.right
|
|
|
|
anchors.top: parent.top
|
|
|
|
text: title
|
|
|
|
truncationMode: TruncationMode.Fade
|
|
|
|
color: note.highlighted ? Theme.highlightColor : Theme.primaryColor
|
|
|
|
}
|
|
|
|
|
|
|
|
Rectangle {
|
|
|
|
id: categoryRectangle
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Theme.horizontalPageMargin
|
|
|
|
anchors.top: parent.top
|
|
|
|
anchors.topMargin: Theme.paddingSmall
|
|
|
|
width: categoryLabel.width + Theme.paddingLarge
|
|
|
|
height: categoryLabel.height + Theme.paddingSmall
|
|
|
|
color: "transparent"
|
|
|
|
border.color: Theme.highlightColor
|
|
|
|
radius: height / 4
|
|
|
|
visible: appSettings.sortBy !== "category" && categoryLabel.text.length > 0
|
|
|
|
Label {
|
|
|
|
id: categoryLabel
|
|
|
|
anchors.centerIn: parent
|
|
|
|
text: category
|
|
|
|
color: note.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
|
|
|
|
font.pixelSize: Theme.fontSizeExtraSmall
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Label {
|
|
|
|
id: previewLabel
|
|
|
|
anchors.left: isFavoriteIcon.right
|
|
|
|
anchors.leftMargin: Theme.paddingSmall
|
|
|
|
anchors.right: parent.right
|
|
|
|
anchors.rightMargin: Theme.horizontalPageMargin
|
|
|
|
anchors.top: titleLabel.bottom
|
|
|
|
text: parseText(content)
|
|
|
|
font.pixelSize: Theme.fontSizeExtraSmall
|
|
|
|
textFormat: Text.PlainText
|
|
|
|
wrapMode: Text.Wrap
|
|
|
|
elide: Text.ElideRight
|
|
|
|
maximumLineCount: appSettings.previewLineCount > 0 ? appSettings.previewLineCount : 1
|
|
|
|
visible: appSettings.previewLineCount > 0
|
|
|
|
color: note.highlighted ? Theme.secondaryHighlightColor : Theme.secondaryColor
|
|
|
|
function parseText (preText) {
|
|
|
|
var lines = preText.split('\n')
|
|
|
|
lines.splice(0,1);
|
|
|
|
var newText = lines.join('\n');
|
|
|
|
return newText.replace(/^\s*$(?:\r\n?|\n)/gm, "")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ContextMenu {
|
|
|
|
id: menu
|
|
|
|
MenuLabel {
|
|
|
|
id: modifiedLabel
|
|
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
text: qsTr("Modified") + ": " + new Date(modified * 1000).toLocaleString(Qt.locale(), Locale.ShortFormat)
|
|
|
|
}
|
|
|
|
MenuItem {
|
|
|
|
text: qsTr("Delete")
|
|
|
|
onClicked: {
|
|
|
|
remorse.execute(note, qsTr("Deleting note"), function() {
|
2019-11-11 01:04:42 +03:00
|
|
|
notesApi.deleteNote(id)
|
2019-01-29 01:15:53 +03:00
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-11-25 16:08:00 +03:00
|
|
|
section.property: appSettings.sortBy
|
|
|
|
section.criteria: appSettings.sortBy === "title" ? ViewSection.FirstCharacter : ViewSection.FullString
|
2018-12-20 20:53:29 +03:00
|
|
|
section.labelPositioning: appSettings.sortBy === "title" ? ViewSection.CurrentLabelAtStart | ViewSection.NextLabelAtEnd : ViewSection.InlineLabels
|
2018-10-16 18:50:58 +03:00
|
|
|
section.delegate: SectionHeader {
|
2018-10-17 00:52:28 +03:00
|
|
|
text: section
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
BusyIndicator {
|
|
|
|
id: busyIndicator
|
|
|
|
anchors.centerIn: parent
|
|
|
|
size: BusyIndicatorSize.Large
|
2019-11-11 01:04:42 +03:00
|
|
|
running: notesList.count === 0 && notesApi.busy
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|
2019-06-21 18:49:54 +03:00
|
|
|
Label {
|
|
|
|
id: busyLabel
|
|
|
|
anchors.top: busyIndicator.bottom
|
|
|
|
anchors.topMargin: Theme.paddingMedium
|
|
|
|
visible: busyIndicator.running
|
|
|
|
width: parent.width
|
|
|
|
color: Theme.highlightColor
|
|
|
|
font.pixelSize: Theme.fontSizeExtraLarge
|
|
|
|
horizontalAlignment: Qt.AlignHCenter
|
|
|
|
text: qsTr("Loading notes...")
|
|
|
|
}
|
2019-11-11 01:04:42 +03:00
|
|
|
|
2018-10-21 02:44:23 +03:00
|
|
|
ViewPlaceholder {
|
2018-11-24 21:34:01 +03:00
|
|
|
id: noLoginPlaceholder
|
2018-12-07 02:30:18 +03:00
|
|
|
enabled: appSettings.accountIDs.length <= 0
|
2018-11-24 21:34:01 +03:00
|
|
|
text: qsTr("No account yet")
|
|
|
|
hintText: qsTr("Got to the settings to add an account")
|
|
|
|
}
|
|
|
|
|
|
|
|
ViewPlaceholder {
|
|
|
|
id: noNotesPlaceholder
|
2019-11-11 01:04:42 +03:00
|
|
|
enabled: notesApi.status === 204 && !busyIndicator.running && !noLoginPlaceholder.enabled
|
2018-10-22 23:53:14 +03:00
|
|
|
text: qsTr("No notes yet")
|
|
|
|
hintText: qsTr("Pull down to add a note")
|
2018-10-21 02:44:23 +03:00
|
|
|
}
|
|
|
|
|
2018-12-03 22:33:37 +03:00
|
|
|
ViewPlaceholder {
|
|
|
|
id: noSearchPlaceholder
|
2019-11-12 01:23:41 +03:00
|
|
|
enabled: notesList.count === 0 && searchField.text !== ""
|
2018-12-03 22:33:37 +03:00
|
|
|
text: qsTr("No result")
|
|
|
|
hintText: qsTr("Try another query")
|
|
|
|
}
|
|
|
|
|
2018-11-15 00:13:47 +03:00
|
|
|
ViewPlaceholder {
|
2018-11-24 21:34:01 +03:00
|
|
|
id: errorPlaceholder
|
2018-12-03 22:33:37 +03:00
|
|
|
enabled: notesList.count === 0 && !busyIndicator.running && !noSearchPlaceholder.enabled && !noNotesPlaceholder.enabled && !noLoginPlaceholder.enabled
|
2018-11-24 21:34:01 +03:00
|
|
|
text: qsTr("An error occurred")
|
2019-11-11 01:04:42 +03:00
|
|
|
hintText: notesApi.statusText
|
2018-11-15 00:13:47 +03:00
|
|
|
}
|
2019-11-11 01:04:42 +03:00
|
|
|
|
2018-11-15 00:13:47 +03:00
|
|
|
TouchInteractionHint {
|
|
|
|
id: addAccountHint
|
|
|
|
interactionMode: TouchInteraction.Pull
|
|
|
|
direction: TouchInteraction.Down
|
|
|
|
}
|
|
|
|
InteractionHintLabel {
|
|
|
|
anchors.fill: parent
|
|
|
|
text: qsTr("Open the settings to configure your Nextcloud accounts")
|
|
|
|
opacity: addAccountHint.running ? 1.0 : 0.0
|
|
|
|
Behavior on opacity { FadeAnimation {} }
|
|
|
|
width: parent.width
|
|
|
|
}
|
2018-10-22 23:53:14 +03:00
|
|
|
|
2018-11-15 00:13:47 +03:00
|
|
|
VerticalScrollDecorator { flickable: notesList }
|
|
|
|
}
|
2018-12-04 19:24:45 +03:00
|
|
|
|
|
|
|
allowedOrientations: defaultAllowedOrientations
|
2018-10-16 18:50:58 +03:00
|
|
|
}
|