Files
advotracker/advotracker_qml/resources/pages/PageNumberHarmList.qml
2020-06-19 17:44:02 +02:00

794 lines
19 KiB
QML
Executable File

/* AdvoTracker - Hotline tackingtool for Advocats
*
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
* SPDX-License-Identifier: (0BSD or MIT)
*
* Based on an example from https://github.com/woboq/qmetaobject-rs/tree/master/examples
* Copyright 2019 Olivier Goffart <ogoffart@woboq.com>
*
*/
import QtQuick 2.10 // Qt 5.10
import QtQuick.Controls 2.3 // Qt 5.10
import QtQuick.Layouts 1.3 // Qt 5.10
import QtQuick.Controls.Material 2.3 // Qt 5.10
// AdvoTracker Modules
import de.networkx.AdvoTracker 1.0 as Nwx
import SortFilterProxyModel 0.2
Page {
id: pageNumberHarmList
//padding: 12
//Material.theme: Material.System
//Material.theme: Material.Light
//rightPadding: 24
// include AdvoTracker Type 'SearchToolBar'
header: SearchToolBar {
id: searchToolBar
// search field: searchToolBar.text
Material.foreground: "white"
Layout.fillWidth: true
focus:true
onFocusChanged: console.log("searchToolBar: Focus changed " + focus)
/*
Keys.onPressed: {
if (event.key == Qt.Key_Ctrl + Qt.Key_S) {
console.log("search");
event.accepted = true;
}
}
*/
}
// simple Filter as starter ...
SortFilterProxyModel {
id: filterNumberHarm
sourceModel: modelNumberHarm
filters: [
ValueFilter {
//enabled: onlyShowFavoritesCheckbox.checked
roleName: "numberHarm"
//value: "Administrator"
//value: "*"
},
AnyOf {
RegExpFilter {
roleName: "numberHarm"
pattern: searchToolBar.text
caseSensitivity: Qt.CaseInsensitive
}
RegExpFilter {
roleName: "numberPolicyholder"
pattern: searchToolBar.text
caseSensitivity: Qt.CaseInsensitive
}
}
]
sorters: [
//RoleSorter { roleName: "userId"; sortOrder: Qt.DescendingOrder },
RoleSorter { roleName: "clerkId"; sortOrder: Qt.AscendingOrder },
StringSorter { roleName: "dateRecored"; sortOrder: Qt.DescendingOrder },
StringSorter { roleName: "numberPolicyholder" }
]
} // filterNumberHarm
/* complex filter with two roles
SortFilterProxyModel {
id: filterComplex
sourceModel: modelNumberHarm
sorters: [
RoleSorter { roleName: "numberHarm"; sortOrder: Qt.DescendingOrder },
StringSorter { roleName: "numberHarm" }
]
filters: RegExpFilter {
id: nameFilter
roleName: "numberHarm"
enable: textSearch.nameFilter
//pattern: searchToolBar.text
pattern: "^" + searchToolBar.text
caseSensitivity: Qt.CaseInsensitive
}
proxyRoles: SwitchRole {
name: "sectionRole"
filters: RegExpFilter {
roleName: "numberHarm"
enable: search
value: true
SwitchRole.value: "*"
}
defaultRoleName: "numberHarm"
}
}
*/
// simple filter: one role, given explicit search pattern
/*
SortFilterProxyModel {
id: filterNumberHarm
sourceModel: modelNumberHarm
filters: [
ValueFilter {
//enabled: onlyShowFavoritesCheckbox.checked
roleName: "numberHarm"
value: "47114711"
//value: "*"
},
AnyOf {
RegExpFilter {
roleName: "numberHarm"
pattern: searchToolBar.text
caseSensitivity: Qt.CaseInsensitive
}
RegExpFilter {
roleName: "numberPolicyholder"
pattern: searchToolBar.text
caseSensitivity: Qt.CaseInsensitive
}
}
]
sorters: [
RoleSorter { roleName: "numberHarm"; sortOrder: Qt.AscendingOrder },
//StringSorter { roleName: "numberHarm", "clerkId" }
StringSorter { roleName: "numberPolicyholder" }
]
} // filterNumberHarm
*/
Component {
id: headerNumberHarmList
Pane {
id: frameHeaderNumberHarmList
Layout.fillWidth: true
width: parent.width
Material.background: Material.color(Material.Grey)
RowLayout {
id: rowHeaderNumberHarmList
spacing: 8
width: parent.width
//anchors.verticalCenter: parent.verticalCenter
//anchors.right: parent.right
Layout.fillWidth: true
//Material.foreground: Material.accent
Label {
id: labelHeaderNumberHarm
text: qsTr("Number harm")
//font.pixelsize: 18
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.preferredWidth: 150
anchors.left: parent.left
}
Label {
id: labelHeaderNumberPolicyholder
text: qsTr("Number policyholder")
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.fillWidth: true
Layout.preferredWidth: 300
Layout.minimumWidth: 300
}
Label {
id: labelHeaderClerkId
text: qsTr("Clerk Id")
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.fillWidth: true
Layout.preferredWidth: 80
Layout.minimumWidth: 80
}
Label {
id: labelHeaderDateRecorded
text: qsTr("Date recorded")
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.preferredWidth: 200
Layout.minimumWidth: 200
anchors.left: labelHeaderClerkId.right
anchors.right: parent.right;
//anchors.right: rowHeaderNumberHarmList.right
}
} // rowHeaderNumberHarmList
} // frameHeaderNumberHarmList
} // headerNumberHarmList
Component {
id: footerNumberHarmList
Rectangle {
id: root
width: ListView.view.width
height: 20
//color: "#ffffff"
//border.color: Qt.darker(color, 1.2)
property alias text: label.text
property color fontColor: '#1f1f1f'
Text {
id: label
anchors.centerIn: parent
//font.pixelSize: 14
color: root.fontColor
text: qsTr("List ends here")
}
}
} // footerNumberHarmList
Component {
id: highlightNumberHarmList
Item {
width: listNumberHarmList.width
height: listNumberHarmList.currentItem.height
y: listNumberHarmList.currentItem.y
Behavior on y {
SequentialAnimation {
PropertyAnimation {
target: rectangleHeighlight
property: "opacity"
to: 0
duration: 500
}
NumberAnimation { duration: 5 }
PropertyAnimation {
target: rectangleHeighlight
property: "opacity"
to: 1
duration: 200
}
//SpringAnimation { spring: 2; damping: 0.1 }
}
}
Rectangle {
id: rectangleHeighlight
width: listNumberHarmList.width
height: listNumberHarmList.currentItem.height
anchors.fill: parent
anchors.margins: 5
color: "lightsteelblue"
radius: 5
} // Rectangle
} // Item
} // highlightNumberHarmList
Component {
id: delegateNumberHarmList
ItemDelegate {
id: itemNumberHarmList
Layout.fillWidth: true
width: parent.width
anchors.right: parent.fill
focus: true
contentItem: RowLayout {
id: rowNumberHarmList
spacing: 8
anchors.horizontalCenter: parent.horizontalCenter
focus: true
Label {
id: numberHarm
text: model.numberHarm
Layout.preferredWidth: 150
}
Label {
id: numberPolicyholder
text: model.numberPolicyholder
Layout.preferredWidth: 300
Layout.minimumWidth: 300
Layout.fillWidth: true
//width: labelHeaderNumberPolicyholder.width
//Layout.preferredWidth: labelHeaderNumberPolicyholder.width
}
Label {
id: clerkId
text: model.clerkId
Layout.preferredWidth: 80
Layout.minimumWidth: 80
Layout.fillWidth: true
//width: labelHeaderNumberPolicyholder.width
//Layout.preferredWidth: labelHeaderNumberPolicyholder.width
}
Label {
id: dateRecorded
text: Qt.formatDateTime(model.dateRecorded, "ddd dd.MM.yyyy hh:mm")
Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter
Layout.preferredWidth: 200
Layout.minimumWidth: 200
anchors.left: clerkId.right
anchors.right: parent.right;
}
} // rowNumberHarmList (contentItem)
// adapt the current item
states: State {
name: "Current"
when: itemNumberHarmList.ListView.isCurrentItem
PropertyChanges { target: numberHarm ; color: Material.color(Material.primary, Material.ShadeA700) }
//PropertyChanges { target: numberPolicyholder ; color: Material.color(Material.accent, Material.ShadeA700) }
}
transitions: Transition {
NumberAnimation { properties: "color"; duration: 200 }
SpringAnimation { spring: 2; damping: 0.1 }
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton
onPressed: {
console.log("Mouse-Press: left; index:", index, "; iconName:", filterNumberHarm.get(index).numberHarm)
itemNumberHarmList.ListView.view.currentIndex = index
}
onDoubleClicked: {
console.log("Mouse-Press: double; index:", index, "; numberHarm:", filterNumberHarm.get(index).numberHarm)
console.log("Mouse-Press: double; index:", index, "; userId:", filterNumberHarm.get(index).clerkId)
// stackViewMain.push(componentDetail, { numberHarm: filterNumberHarm.get(index).numberHarm } )
stackViewMain.push("qrc:/pages/PageNumberHarm.qml", { numberHarm: filterNumberHarm.get(index).numberHarm } )
//Loader { id: pagePolicy, source: "qrc:/PolicyPage.qml" }
}
} // MouseArea
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
onPressed: {
console.log("Mouse-Press: right; index:", index, "; numberHarm:", filterNumberHarm.get(index).numberHarm)
itemNumberHarmList.ListView.view.currentIndex = index
}
} // MouseArea
Shortcut {
context: Qt.ApplicationShortcut
sequence: [ StandardKey.NextChild, "Ctrl+N" ]
// onActivated: view.currentIndex++
onActivated: itemNumberHarmList.ListView.view.currentIndex++
}
Keys.onReturnPressed: {
console.log("Key-Press: retrun; index:", index, "; iconName:", filterNumberHarm.get(index).numberHarm)
itemNumberHarmList.ListView.view.currentIndex = index
stackViewMain.push(componentDetail, { numberHarm: "filterNumberHarm.get(index).numberHarm" } )
}
Keys.onTabPressed: {
// Windows: Ctrl-Tab, Alt+Right, Ctrl-F6
// Gnome: Ctrl-Tab
console.log("Key-Press: Tab; index:", index, "; iconName:", filterNumberHarm.get(index).numberHarm)
itemNumberHarmList.ListView.view.currentIndex = index + 1
}
Keys.onBacktabPressed: {
// Windows: Ctrl-Shift-Tab, Alt+Left, Ctrl-Shift-F6
// Gnome: Ctrl-Shift-Tab, Alt+Left
console.log("Key-Press: Backtab (Shift+tab); index:", index, "; iconName:", filterNumberHarm.get(index).numberHarm)
itemNumberHarmList.ListView.view.currentIndex = index -1
}
} // itemNumberHarmList
} // delegateNumberHarmList
// just here for testing!!!
Component {
// called via: stackViewMain.push(componentDetail)
id: componentDetail
Page {
id: pageDetail
leftPadding: 26
rightPadding: 26
topPadding: 18
bottomPadding: 18
property string userId
header: ToolBar {
Material.foreground: "white"
ToolButton {
text: Nwx.MdiFont.Icon.pencil + " " + qsTr("Edit")
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
onClicked: {
console.log("Mouse-Press: left; index:", index, "; userId:", filterNumberHarm.get(index).userId)
stackViewMain.push(componentEdit, { userId: filterNumberHarm.get(index).userId } )
}
}
Label {
id: pageTitle
text: qsTr("Show Number harm detail")
//font.pointSize: 18
//font.pointSize: {
// if (main_window.main_w < main_window.width)
// return main_window.main_w / 35 // we need 20pt
// return main_window.width / 35
//}
anchors.centerIn: parent
}
} // header
ColumnLayout {
id: columnDetail
anchors.fill: parent
Layout.fillWidth: true
Layout.fillHeight: true
//anchors.right: parent.fill
ListView {
id: listDetail
anchors.fill: parent
//Layout.fillWidth: true
//Layout.fillHeight: true
//Layout.margins: 12
//displayMarginBeginning: 40
//displayMarginEnd: 40
// simple model
model: SortFilterProxyModel {
id: filterNumberHarm
sourceModel: modelNumberHarm
filters: RegExpFilter {
// useRole
roleName: "numberHarm"
pattern: numberHarm
//pattern: "account"
//caseSensitivity: Qt.CaseInsensitive
//caseSensitivity: Qt.Sensitive
}
sorters: [
RoleSorter { roleName: "numberHarm"; sortOrder: Qt.DescendingOrder },
StringSorter { roleName: "dateRecording"; sortOrder: Qt.DescendingOrder },
StringSorter { roleName: "clerkId" }
]
} // model: filterNumberHarm
//header: headerDetail
//footer: footerDetail
delegate: Pane {
id: paneDetails
anchors.fill: parent
Layout.fillWidth: true
//Layout.fillWidth: true
//Layout.fillHeight: true
leftPadding: 6
rightPadding: 6
topPadding: 6
bottomPadding: 6
ColumnLayout {
id: columnDetail
width: parent.width
anchors.topMargin: 12
spacing: 2
GroupBox {
id: groupDetailNumberHarm
title: qsTr("Number harm data")
width: parent.width
Layout.fillWidth: true
ColumnLayout {
id: columnDetailNumberHarm
width: parent.width
anchors.topMargin: 12
spacing: 2
RowLayout {
Layout.fillWidth: true
//spacing: 12
Label {
Layout.preferredWidth: 160
text: qsTr("Number harm")
}
Pane {
Layout.fillWidth: true
background: Rectangle {
color: "lightgrey"
radius: 5
}
Label {
//anchors.horizontalCenter: parent.horizontalCenter
Layout.preferredWidth: 120
text: numberHarm
}
}
}
RowLayout {
Layout.fillWidth: true
//spacing: 12
Label {
Layout.preferredWidth: 160
text: qsTr("Number policyholder")
}
Pane {
Layout.fillWidth: true
background: Rectangle {
color: "lightgrey"
radius: 5
}
Label {
text: numberPolicyholder
}
}
}
RowLayout {
Layout.fillWidth: true
//spacing: 12
Label {
Layout.preferredWidth: 160
text: qsTr("Date recorded")
}
Pane {
Layout.fillWidth: true
background: Rectangle {
color: "lightgrey"
radius: 5
}
Label {
text: dateRecording
Layout.preferredWidth: 150
// width: 100;
}
}
}
} // columnDetail
} // groupDetailNumberHarm
GroupBox {
id: groupDetailRole
title: qsTr("User data")
width: parent.width
Layout.fillWidth: true
ColumnLayout {
id: columnDetailRole
width: parent.width
anchors.topMargin: 12
spacing: 2
RowLayout {
id: rowDetailRole
Layout.fillWidth: true
//spacing: 12
Label {
Layout.preferredWidth: 160
text: qsTr("User Id")
}
Pane {
Layout.fillWidth: true
background: Rectangle {
color: "lightgrey"
radius: 5
}
Label {
text: userId
}
}
} // rowRole
} // columnDetail
} // groupDetailRole
} // paneDetail (contentItem)
} // columnDetailNumberHarm
} // listDetail
} // columnDetail
} // pageDetail
} // componentDetail
Component {
// called via: stackViewMain.push(pageEdit)
id: componentEdit
Page {
id: pageEdit
leftPadding: 26
rightPadding: 26
topPadding: 18
bottomPadding: 18
property string numberHarm
header: ToolBar {
Material.foreground: "white"
ToolButton {
text: Nwx.MdiFont.Icon.settings + " " +qsTr("Edit")
anchors.left: parent.left
anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
onClicked: stackViewMain.push(componentEdit)
}
Label {
id: pageTitle
text: qsTr("Edit user details")
font.pixelSize: 20
anchors.centerIn: parent
}
} // header
ColumnLayout {
id: columnEdit
anchors.right: parent.fill
ListView {
id: listEdit
anchors.fill: parent
spacing: 20
Layout.fillWidth: true
Layout.fillHeight: true
Layout.margins: 6
//displayMarginBeginning: 40
//displayMarginEnd: 40
// simple model
model: SortFilterProxyModel {
id: filterNumberHarm
sourceModel: modelNumberHarm
filters: RegExpFilter {
// useRole
roleName: "numberHarm"
pattern: numberHarm
//pattern: "account"
//caseSensitivity: Qt.CaseInsensitive
//caseSensitivity: Qt.Sensitive
}
sorters: [ StringSorter { roleName: "numberHarm" } ]
} // model: filterNumberHarm
//header: headerEdit
//footer: footerEdit
delegate: ColumnLayout {
id: columnEdits
//anchors.right: parent.right
anchors.fill: parent
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 12
GroupBox {
id: groupEdit
title: qsTr("Number harm data")
width: parent.width
Layout.fillWidth: true
Layout.fillHeight: true
RowLayout {
Label {
text: qsTr("User-Id")
}
Text {
//anchors.horizontalCenter: parent.horizontalCenter
text: userId
width: 50
}
}
RowLayout {
Label {
text: qsTr("Role")
}
Text {
text: roleName
//width: 150;
}
}
RowLayout {
Label {
text: qsTr("Lastname")
}
Text {
text: lastName
// width: 120
}
}
RowLayout {
Label {
text: qsTr("Firstname")
}
Text {
text: firstName
// width: 100;
}
}
RowLayout {
Label {
text: qsTr("Email")
}
Text {
text: email
// width: 100;
}
}
RowLayout {
Label {
text: qsTr("Intitials")
}
Text {
text: userInitials
//width: 50;
}
}
} // groupEdit
} // columnEdit (contentItem)
} // listEdit
} // columnEdit
} // pageEdit
} // componentEdit
ListView {
id: listNumberHarmList
anchors.fill: parent
anchors.rightMargin: 12
Layout.fillWidth: true
Layout.fillHeight: true
spacing: 4
model: filterNumberHarm
//model: modelNumberHarm
delegate: delegateNumberHarmList
header: headerNumberHarmList
footer: footerNumberHarmList
highlight: highlightNumberHarmList
highlightFollowsCurrentItem: false
//focus: true
//contentWidth: headerNumberHarmList.width
flickableDirection: Flickable.VerticalFlick
/*
Keys.onPressed: {
console.log("list-item: " + event.key + " : " + event.text)
}
*/
Shortcut {
context: Qt.ApplicationShortcut
sequence: [ "Ctrl+S" ]
//onActivated: view.currentIndex++
onActivated: {
searchToolBar.forceActiveFocus()
console.log("Key-Press->Ctrl+S: Shortcut activated.")
}
}
Keys.onUpPressed: scrollBarNumberHarmList.decrease()
Keys.onDownPressed: scrollBarNumberHarmList.increase()
//Component.onCompleted: positionViewAtEnd()
//Component.onCompleted: positionViewAtIndex(ListView.Center)
ScrollBar.vertical: Nwx.ScrollBar {
id: scrollBarNumberHarmList
// leftPadding: 2
// topPadding: 2
// color: "lightsteelblue"
parent: listNumberHarmList.parent
anchors.top: listNumberHarmList.top
anchors.left: listNumberHarmList.right
anchors.bottom: listNumberHarmList.bottom
}
/*
ScrollIndicator.vertical: Nwx.ScrollIndicator {
id: scrollIndicatorNumberHarmList
leftPadding: 5
topPadding: 5
}
*/
} // listNumberHarmList
} // pageNumberHarmList