feat(@desktop/wallet): Glue for acitvity filter UI and backend

This commit is contained in:
Khushboo Mehta 2023-06-15 19:43:08 +02:00 committed by Khushboo-dev-cpp
parent 60d78eb0ad
commit 47c76714db
12 changed files with 385 additions and 613 deletions

View File

@ -5,6 +5,7 @@ import QtQuick.Layouts 1.14
import AppLayouts.Wallet.controls 1.0 import AppLayouts.Wallet.controls 1.0
import AppLayouts.Wallet.popups 1.0 import AppLayouts.Wallet.popups 1.0
import AppLayouts.Wallet.panels 1.0 import AppLayouts.Wallet.panels 1.0
import AppLayouts.Wallet.stores 1.0
import AppLayouts.stores 1.0 import AppLayouts.stores 1.0
import StatusQ.Core 0.1 import StatusQ.Core 0.1
@ -31,285 +32,7 @@ SplitView {
QtObject { QtObject {
id: d id: d
property int selectedTime: Constants.TransactionTimePeriod.All
property double fromTimestamp: new Date().setDate(new Date().getDate() - 7)
property double toTimestamp: Date.now()
function changeSelectedTime(newTime) {
selectedTime = newTime
}
function setCustomTimeRange(fromTimestamp , toTimestamp) {
d.fromTimestamp = fromTimestamp
d.toTimestamp = toTimestamp
}
property var typeFilters: [
Constants.TransactionType.Send,
Constants.TransactionType.Receive,
Constants.TransactionType.Buy,
Constants.TransactionType.Swap,
Constants.TransactionType.Bridge]
function toggleType(type) {
let tempFilters = typeFilters
let allCheckedIs = false
if(tempFilters.length === 5)
allCheckedIs = true
// if all were selected then only select one of them
if(allCheckedIs) {
tempFilters = [type]
}
else {
// if last one is being deselected, select all
if(tempFilters.length === 1 && tempFilters[0] === type) {
tempFilters = [
Constants.TransactionType.Send,
Constants.TransactionType.Receive,
Constants.TransactionType.Buy,
Constants.TransactionType.Swap,
Constants.TransactionType.Bridge]
}
else {
let index = tempFilters.indexOf(type)
if(index === -1) {
tempFilters.push(type)
}
else {
tempFilters.splice(index, 1)
}
}
}
typeFilters = tempFilters
}
property var statusFilters: [
Constants.TransactionStatus.Failed,
Constants.TransactionStatus.Pending,
Constants.TransactionStatus.Complete,
Constants.TransactionStatus.Finished]
function toggleStatus(status) {
let tempFilters = statusFilters
let allCheckedIs = false
if(tempFilters.length === 4)
allCheckedIs = true
// if all were selected then only select one of them
if(allCheckedIs) {
tempFilters = [status]
}
else {
// if last one is being deselected, select all
if(tempFilters.length === 1 && tempFilters[0] === status) {
tempFilters = [
Constants.TransactionStatus.Failed,
Constants.TransactionStatus.Pending,
Constants.TransactionStatus.Complete,
Constants.TransactionStatus.Finished]
}
else {
let index = tempFilters.indexOf(status)
if(index === -1) {
tempFilters.push(status)
}
else {
tempFilters.splice(index, 1)
}
}
}
statusFilters = tempFilters
}
property var simulatedAssetsModel: WalletAssetsModel {}
function toggleToken(tokenSymbol) {
let tempodel = simulatedAssetsModel
let allChecked = true
let allChecked1 = true
let checkedTokens = []
simulatedAssetsModel = []
for (let k =0; k<tempodel.count; k++) {
if(!tempodel.get(k).checked)
allChecked = false
else {
checkedTokens.push(tempodel.get(k))
}
}
if(allChecked) {
for (let i = 0; i<tempodel.count; i++) {
if(tempodel.get(i).symbol === tokenSymbol) {
tempodel.get(i).checked = true
}
else
tempodel.get(i).checked = false
}
}
else if(checkedTokens.length === 1 && checkedTokens[0].symbol === tokenSymbol) {
for (let j = 0; j<tempodel.count; j++) {
tempodel.get(j).checked = true
tempodel.get(j).allChecked = true
}
}
else {
for (let l =0; l<tempodel.count; l++) {
if(tempodel.get(l).symbol === tokenSymbol)
tempodel.get(l).checked = !tempodel.get(l).checked
}
}
for (let l =0; l<tempodel.count; l++) {
if(!tempodel.get(l).checked)
allChecked1 = false
}
for (let j =0; j<tempodel.count; j++) {
tempodel.get(j).allChecked = allChecked1
}
simulatedAssetsModel = tempodel
}
property var simulatedCollectiblesModel: CollectiblesModel {}
function toggleCollectibles(name) {
let tempodel = simulatedCollectiblesModel
let allChecked = true
let allChecked1 = true
let checkedTokens = []
simulatedCollectiblesModel = []
for (let k =0; k<tempodel.count; k++) {
if(!tempodel.get(k).checked)
allChecked = false
else {
checkedTokens.push(tempodel.get(k))
}
}
if(allChecked) {
for (let i = 0; i<tempodel.count; i++) {
if(tempodel.get(i).name === name) {
tempodel.get(i).checked = true
}
else
tempodel.get(i).checked = false
}
}
else if(checkedTokens.length === 1 && checkedTokens[0].name === name) {
for (let j = 0; j<tempodel.count; j++) {
tempodel.get(j).checked = true
tempodel.get(j).allChecked = true
}
}
else {
for (let l =0; l<tempodel.count; l++) {
if(tempodel.get(l).name === name)
tempodel.get(l).checked = !tempodel.get(l).checked
}
}
for (let l =0; l<tempodel.count; l++) {
if(!tempodel.get(l).checked)
allChecked1 = false
}
for (let j =0; j<tempodel.count; j++) {
tempodel.get(j).allChecked = allChecked1
}
simulatedCollectiblesModel = tempodel
}
property var recipeintModel: RecipientModel {} property var recipeintModel: RecipientModel {}
property var simulatedSavedList: recipeintModel.savedAddresses
property var simulatedRecentsList: recipeintModel.recents
function toggleSavedAddress(address) {
let tempodel = simulatedSavedList
let allChecked = true
let allChecked1 = true
let checkedTokens = []
simulatedSavedList = []
for (let k =0; k<tempodel.count; k++) {
if(!tempodel.get(k).checked)
allChecked = false
else {
checkedTokens.push(tempodel.get(k))
}
}
if(allChecked) {
for (let i = 0; i<tempodel.count; i++) {
if(tempodel.get(i).address === address) {
tempodel.get(i).checked = true
}
else
tempodel.get(i).checked = false
}
}
else if(checkedTokens.length === 1 && checkedTokens[0].address === address) {
for (let j = 0; j<tempodel.count; j++) {
tempodel.get(j).checked = true
tempodel.get(j).allChecked = true
}
}
else {
for (let l =0; l<tempodel.count; l++) {
if(tempodel.get(l).address === address)
tempodel.get(l).checked = !tempodel.get(l).checked
}
}
for (let l =0; l<tempodel.count; l++) {
if(!tempodel.get(l).checked)
allChecked1 = false
}
for (let j =0; j<tempodel.count; j++) {
tempodel.get(j).allChecked = allChecked1
}
simulatedSavedList = tempodel
}
function toggleRecents(address) {
let tempodel = simulatedRecentsList
let allChecked = true
let allChecked1 = true
let checkedTokens = []
simulatedRecentsList = []
for (let k =0; k<tempodel.count; k++) {
if(!tempodel.get(k).checked)
allChecked = false
else {
checkedTokens.push(tempodel.get(k))
}
}
if(allChecked) {
for (let i = 0; i<tempodel.count; i++) {
let addresstoFind = tempodel.get(i).to.toLowerCase() === d.store.overview.mixedcaseAddress.toLowerCase() ? tempodel.get(i).from : tempodel.get(i).to
if(addresstoFind === address) {
tempodel.get(i).checked = true
}
else
tempodel.get(i).checked = false
}
}
else if(checkedTokens.length === 1 && (checkedTokens[0].to.toLowerCase() === d.store.overview.mixedcaseAddress.toLowerCase() ? checkedTokens[0].from : checkedTokens[0].to) === address) {
for (let j = 0; j<tempodel.count; j++) {
tempodel.get(j).checked = true
tempodel.get(j).allChecked = true
}
}
else {
for (let l =0; l<tempodel.count; l++) {
let addresstoFind = tempodel.get(l).to.toLowerCase() === d.store.overview.mixedcaseAddress.toLowerCase() ? tempodel.get(l).from : tempodel.get(l).to
if(addresstoFind === address )
tempodel.get(l).checked = !tempodel.get(l).checked
}
}
for (let m =0; m<tempodel.count; m++) {
if(!tempodel.get(m).checked)
allChecked1 = false
}
for (let n =0; n<tempodel.count; n++) {
tempodel.get(n).allChecked = allChecked1
}
simulatedRecentsList = tempodel
}
property var store: QtObject { property var store: QtObject {
property var overview: ({ property var overview: ({
@ -333,6 +56,35 @@ SplitView {
return "" return ""
} }
} }
property var activityController: QtObject {
function setFilterTime(fromTimestamp, toTimestamp) {
console.warn("activityController:: setFilterTime:: fromTimestamp: ",fromTimestamp, " toTimestamp:: ",toTimestamp)
}
function setFilterType(typeFilters) {
console.warn("activityController:: setFilterType:: ",typeFilters)
}
function setFilterStatus(statusFilters) {
console.warn("activityController:: setFilterStatus:: ",statusFilters)
}
function setFilterAssets(tokensFilter) {
console.warn("activityController:: setFilterAssets:: ",tokensFilter)
}
function setFilterToAddresses(filters) {
console.warn("activityController:: setFilterToAddresses:: ",filters)
}
function updateFilter() {
console.warn("activityController:: updateFilter")
}
}
}
ActivityFiltersStore {
id: actvityStore
tokensList: WalletAssetsModel {}
collectiblesList: CollectiblesModel {}
savedAddressesModel: d.recipeintModel.savedAddresses
activityController: d.activityController
areTestNetworksEnabled: false
} }
Item { Item {
@ -344,133 +96,7 @@ SplitView {
width: 800 width: 800
anchors.centerIn: parent anchors.centerIn: parent
store: d.store store: d.store
fromTimestamp: d.fromTimestamp activityFilterStore: actvityStore
toTimestamp: d.toTimestamp
selectedTime: d.selectedTime
typeFilters: d.typeFilters
statusFilters: d.statusFilters
assetsList: d.simulatedAssetsModel
collectiblesList: d.simulatedCollectiblesModel
savedAddressList: d.simulatedSavedList
recentsList: d.simulatedRecentsList
onChangeSelectedTime: d.changeSelectedTime(selectedTime)
onSetCustomTimeRange: d.setCustomTimeRange(from, to)
onToggleType: d.toggleType(type)
onToggleStatus: d.toggleStatus(status)
onToggleToken: d.toggleToken(tokenSymbol)
onToggleCollectibles: d.toggleCollectibles(name)
onToggleSavedAddress: d.toggleSavedAddress(address)
onToggleRecents: d.toggleRecents(address)
}
}
LogsAndControlsPanel {
id: logsAndControlsPanel
SplitView.minimumHeight: 100
SplitView.preferredHeight: 200
logsView.logText: logs.logText
ButtonGroup {
buttons: periodRow.children
}
Column {
spacing: 20
Row {
id: periodRow
spacing: 20
RadioButton {
checked: true
text: "All"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.All}
}
RadioButton {
text: "Today"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.Today}
}
RadioButton {
text: "Yesterday"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.Yesterday}
}
RadioButton {
text: "ThisWeek"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.ThisWeek}
}
RadioButton {
text: "LastWeek"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.LastWeek}
}
RadioButton {
text: "ThisMonth"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.ThisMonth}
}
RadioButton {
text: "LastMonth"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.LastMonth}
}
RadioButton {
text: "Custom"
onCheckedChanged: if(checked) { d.selectedTime = Constants.TransactionTimePeriod.Custom}
}
}
Row {
spacing: 20
CheckBox {
text: "Send"
checked: d.typeFilters.includes(Constants.TransactionType.Send)
onClicked: d.toggleType(Constants.TransactionType.Send)
}
CheckBox {
text: "Receive"
checked: d.typeFilters.includes(Constants.TransactionType.Receive)
onClicked: d.toggleType(Constants.TransactionType.Receive)
}
CheckBox {
text: "Buy"
checked: d.typeFilters.includes(Constants.TransactionType.Buy)
onClicked: d.toggleType(Constants.TransactionType.Buy)
}
CheckBox {
text: "Swap"
checked: d.typeFilters.includes(Constants.TransactionType.Swap)
onClicked: d.toggleType(Constants.TransactionType.Swap)
}
CheckBox {
text: "Bridge"
checked: d.typeFilters.includes(Constants.TransactionType.Bridge)
onClicked: d.toggleType(Constants.TransactionType.Bridge)
}
}
Row {
spacing: 20
CheckBox {
text: "Failed"
checked: d.statusFilters.includes(Constants.TransactionStatus.Failed)
onClicked: d.toggleStatus(Constants.TransactionStatus.Failed)
}
CheckBox {
text: "Pending"
checked: d.statusFilters.includes(Constants.TransactionStatus.Pending)
onClicked: d.toggleStatus(Constants.TransactionStatus.Pending)
}
CheckBox {
text: "Complete"
checked: d.statusFilters.includes(Constants.TransactionStatus.Complete)
onClicked: d.toggleStatus(Constants.TransactionStatus.Complete)
}
CheckBox {
text: "Finished"
checked: d.statusFilters.includes(Constants.TransactionStatus.Finished)
onClicked: d.toggleStatus(Constants.TransactionStatus.Finished)
}
}
} }
} }
} }

View File

@ -9,16 +9,16 @@ ListModel {
iconSource: ModelsData.collectibles.anniversary, iconSource: ModelsData.collectibles.anniversary,
name: "Anniversary", name: "Anniversary",
category: TokenCategories.Category.Community, category: TokenCategories.Category.Community,
checked: true, imageUrl: ModelsData.collectibles.anniversary,
allChecked: true id: 1767698
}, },
{ {
key: "Anniversary2", key: "Anniversary2",
iconSource: ModelsData.collectibles.anniversary, iconSource: ModelsData.collectibles.anniversary,
name: "Anniversary2", name: "Anniversary2",
category: TokenCategories.Category.Community, category: TokenCategories.Category.Community,
checked: true, imageUrl: ModelsData.collectibles.anniversary,
allChecked: true id: 1767699
}, },
{ {
key: "CryptoKitties", key: "CryptoKitties",
@ -69,26 +69,28 @@ ListModel {
name: "Magicat-4" name: "Magicat-4"
} }
], ],
checked: true, imageUrl: ModelsData.collectibles.cryptoKitties,
allChecked: true id: 1767700
}, },
{ {
key: "SuperRare", key: "SuperRare",
iconSource: ModelsData.collectibles.superRare, iconSource: ModelsData.collectibles.superRare,
name: "SuperRare", name: "SuperRare",
category: TokenCategories.Category.Own, category: TokenCategories.Category.Own,
checked: true, imageUrl: ModelsData.collectibles.superRare,
allChecked: true id: 1767701
}, },
{ {
key: "Custom", key: "Custom",
iconSource: ModelsData.collectibles.custom, iconSource: ModelsData.collectibles.custom,
name: "Custom Collectible", name: "Custom Collectible",
category: TokenCategories.Category.General, category: TokenCategories.Category.General,
checked: true, imageUrl: ModelsData.collectibles.custom,
allChecked: true id: 1767764
} }
] ]
property bool isFetching: false
Component.onCompleted: append(data) Component.onCompleted: append(data)
} }

View File

@ -34,6 +34,7 @@ StatusListItem {
components: [ components: [
StatusCheckBox { StatusCheckBox {
id: checkBox id: checkBox
visible: !root.loading
tristate: true tristate: true
checkable: true checkable: true
spacing: 0 spacing: 0

View File

@ -13,25 +13,8 @@ import "../popups"
Flow { Flow {
id: root id: root
property var activityFilterStore
property var store property var store
property int selectedTime
property double fromTimestamp
property double toTimestamp
property var typeFilters
property var statusFilters
property var assetsList
property var collectiblesList
property var savedAddressList
property var recentsList
signal changeSelectedTime(int selectedTime)
signal setCustomTimeRange(string from, string to)
signal toggleType(int type)
signal toggleStatus(int status)
signal toggleToken(string tokenSymbol)
signal toggleCollectibles(string name)
signal toggleSavedAddress(string address)
signal toggleRecents(string address)
spacing: 8 spacing: 8
@ -47,53 +30,18 @@ Flow {
} }
ActivityFilterTagItem { ActivityFilterTagItem {
tagPrimaryLabel.text: { tagPrimaryLabel.text: LocaleUtils.formatDate(activityFilterStore.fromTimestamp)
var currDate = new Date; // current date
switch(root.selectedTime) {
case Constants.TransactionTimePeriod.Today:
return LocaleUtils.formatDate(currDate) // Today
case Constants.TransactionTimePeriod.Yesterday:
return LocaleUtils.formatDate(new Date().setDate(currDate.getDate() - 1)) // Yesterday
case Constants.TransactionTimePeriod.ThisWeek:
var firstDayOfCurrentWeek = currDate.getDate() - currDate.getDay()
return LocaleUtils.formatDate(currDate.setDate(firstDayOfCurrentWeek)) // This week
case Constants.TransactionTimePeriod.LastWeek:
return LocaleUtils.formatDate(new Date().setDate(currDate.getDate() - 7)) // Last week
case Constants.TransactionTimePeriod.ThisMonth:
return LocaleUtils.formatDate(currDate.setDate(1)) // This month
case Constants.TransactionTimePeriod.LastMonth:
currDate.setDate(1);
currDate.setMonth(currDate.getMonth()-1);
return LocaleUtils.formatDate(currDate) // Last month
case Constants.TransactionTimePeriod.Custom:
return LocaleUtils.formatDate(new Date(root.fromTimestamp)) // Custom
default:
return ""
}
}
tagSecondaryLabel.text: { tagSecondaryLabel.text: {
switch(root.selectedTime) { switch(activityFilterMenu.selectedTime) {
case Constants.TransactionTimePeriod.Today: case Constants.TransactionTimePeriod.Today:
case Constants.TransactionTimePeriod.Yesterday: case Constants.TransactionTimePeriod.Yesterday:
return "" return ""
case Constants.TransactionTimePeriod.ThisWeek:
case Constants.TransactionTimePeriod.LastWeek:
case Constants.TransactionTimePeriod.ThisMonth:
return LocaleUtils.formatDate(new Date)
case Constants.TransactionTimePeriod.LastMonth:
let x = new Date()
x.setDate(1);
x.setMonth(x.getMonth()-1);
x.setDate(new Date(x.getFullYear(), x.getMonth(), 0).getDate() + 1)
return LocaleUtils.formatDate(x)
case Constants.TransactionTimePeriod.Custom:
return LocaleUtils.formatDate(new Date(root.toTimestamp)) // Custom
default: default:
return "" return LocaleUtils.formatDate(activityFilterStore.toTimestamp)
} }
} }
middleLabel.text:{ middleLabel.text: {
switch(root.selectedTime) { switch(activityFilterMenu.selectedTime) {
case Constants.TransactionTimePeriod.Today: case Constants.TransactionTimePeriod.Today:
case Constants.TransactionTimePeriod.Yesterday: case Constants.TransactionTimePeriod.Yesterday:
return "" return ""
@ -101,17 +49,16 @@ Flow {
return qsTr("to") return qsTr("to")
} }
} }
iconAsset.icon: "history" iconAsset.icon: "history"
visible: root.selectedTime !== Constants.TransactionTimePeriod.All visible: activityFilterMenu.selectedTime !== Constants.TransactionTimePeriod.All
onClosed: root.changeSelectedTime(Constants.TransactionTimePeriod.All) onClosed: activityFilterStore.setSelectedTimestamp(Constants.TransactionTimePeriod.All)
} }
Repeater { Repeater {
model: activityFilterMenu.allTypesChecked ? 0: root.typeFilters model: activityFilterMenu.allTypesChecked ? 0: activityFilterStore.typeFilters
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
property int type: root.typeFilters[index] property int type: activityFilterStore.typeFilters[index]
tagPrimaryLabel.text: switch(root.typeFilters[index]) { tagPrimaryLabel.text: switch(activityFilterStore.typeFilters[index]) {
case Constants.TransactionType.Send: case Constants.TransactionType.Send:
return qsTr("Send") return qsTr("Send")
case Constants.TransactionType.Receive: case Constants.TransactionType.Receive:
@ -123,10 +70,10 @@ Flow {
case Constants.TransactionType.Bridge: case Constants.TransactionType.Bridge:
return qsTr("Bridge") return qsTr("Bridge")
default: default:
console.warn("Unhandled type :: ",root.typeFilters[index]) console.warn("Unhandled type :: ",activityFilterStore.typeFilters[index])
return "" return ""
} }
iconAsset.icon: switch(root.typeFilters[index]) { iconAsset.icon: switch(activityFilterStore.typeFilters[index]) {
case Constants.TransactionType.Send: case Constants.TransactionType.Send:
return "send" return "send"
case Constants.TransactionType.Receive: case Constants.TransactionType.Receive:
@ -138,18 +85,18 @@ Flow {
case Constants.TransactionType.Bridge: case Constants.TransactionType.Bridge:
return "bridge" return "bridge"
default: default:
console.warn("Unhandled type :: ",root.typeFilters[index]) console.warn("Unhandled type :: ",activityFilterStore.typeFilters[index])
return "" return ""
} }
onClosed: root.toggleType(type) onClosed: activityFilterStore.toggleType(type)
} }
} }
Repeater { Repeater {
model: activityFilterMenu.allStatusChecked ? 0 : root.statusFilters model: activityFilterMenu.allStatusChecked ? 0 : activityFilterStore.statusFilters
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
property int type: root.statusFilters[index] property int status: activityFilterStore.statusFilters[index]
tagPrimaryLabel.text: switch(root.statusFilters[index]) { tagPrimaryLabel.text: switch(activityFilterStore.statusFilters[index]) {
case Constants.TransactionStatus.Failed: case Constants.TransactionStatus.Failed:
return qsTr("Failed") return qsTr("Failed")
case Constants.TransactionStatus.Pending: case Constants.TransactionStatus.Pending:
@ -159,10 +106,10 @@ Flow {
case Constants.TransactionStatus.Finished: case Constants.TransactionStatus.Finished:
return qsTr("Finalised") return qsTr("Finalised")
default: default:
console.warn("Unhandled status :: ",root.statusFilters[index]) console.warn("Unhandled status :: ",activityFilterStore.statusFilters[index])
return "" return ""
} }
iconAsset.icon: switch(root.statusFilters[index]) { iconAsset.icon: switch(activityFilterStore.statusFilters[index]) {
case Constants.TransactionStatus.Failed: case Constants.TransactionStatus.Failed:
return Style.svg("transaction/failed") return Style.svg("transaction/failed")
case Constants.TransactionStatus.Pending: case Constants.TransactionStatus.Pending:
@ -172,96 +119,100 @@ Flow {
case Constants.TransactionStatus.Finished: case Constants.TransactionStatus.Finished:
return Style.svg("transaction/finished") return Style.svg("transaction/finished")
default: default:
console.warn("Unhandled status :: ",root.statusFilters[index]) console.warn("Unhandled status :: ",activityFilterStore.statusFilters[index])
return "" return ""
} }
iconAsset.color: "transparent" iconAsset.color: "transparent"
onClosed: root.toggleStatus(type) onClosed: activityFilterStore.toggleStatus(status, activityFilterMenu.allStatusChecked)
} }
} }
Repeater { Repeater {
model: root.assetsList model: activityFilterStore.tokensList
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
tagPrimaryLabel.text: symbol tagPrimaryLabel.text: symbol
iconAsset.icon: Constants.tokenIcon(symbol) iconAsset.icon: Constants.tokenIcon(symbol)
iconAsset.color: "transparent" iconAsset.color: "transparent"
visible: !allChecked && checked visible: !activityFilterMenu.allTokensChecked && activityFilterStore.tokensFilter.includes(symbol)
onClosed: root.toggleToken(symbol) onClosed: activityFilterStore.toggleToken(symbol)
} }
} }
Repeater { Repeater {
model: root.collectiblesList model: activityFilterStore.collectiblesList
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
tagPrimaryLabel.text: name tagPrimaryLabel.text: model.name
iconAsset.icon: model.iconSource iconAsset.icon: model.imageUrl
iconAsset.color: "transparent" iconAsset.color: "transparent"
visible: !allChecked && checked visible: !activityFilterMenu.allCollectiblesChecked && activityFilterStore.collectiblesFilter.includes(model.id)
onClosed: root.toggleCollectibles(name) onClosed: activityFilterStore.toggleCollectibles(model.id)
} }
} }
Repeater { Repeater {
model: root.recentsList model: activityFilterStore.recentsList
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
property int transactionType: to.toLowerCase() === root.store.overview.mixedcaseAddress.toLowerCase() ? Constants.TransactionType.Receive : Constants.TransactionType.Send property int transactionType: to.toLowerCase() === root.store.overview.mixedcaseAddress.toLowerCase() ? Constants.TransactionType.Receive : Constants.TransactionType.Send
tagPrimaryLabel.text: transactionType === Constants.TransactionType.Receive ? tagPrimaryLabel.text: transactionType === Constants.TransactionType.Receive ?
root.store.getNameForAddress(from) || StatusQUtils.Utils.elideText(from,6,4) : root.store.getNameForAddress(from) || StatusQUtils.Utils.elideText(from,6,4) :
root.store.getNameForAddress(to) || StatusQUtils.Utils.elideText(to,6,4) root.store.getNameForAddress(to) || StatusQUtils.Utils.elideText(to,6,4)
visible: !allChecked && checked visible: !activityFilterMenu.allRecentsChecked && activityFilterMenu.recentsFilters.includes(transactionType === Constants.TransactionType.Receive ? from : to)
onClosed: root.toggleRecents(transactionType === Constants.TransactionType.Receive ? from : to) onClosed: activityFilterStore.toggleRecents(transactionType === Constants.TransactionType.Receive ? from : to)
} }
} }
Repeater { Repeater {
model: root.savedAddressList model: activityFilterStore.savedAddressList
delegate: ActivityFilterTagItem { delegate: ActivityFilterTagItem {
tagPrimaryLabel.text: ens.length > 0 ? ens : chainShortNames + StatusQUtils.Utils.elideText(address,6,4) tagPrimaryLabel.text: ens.length > 0 ? ens : chainShortNames + StatusQUtils.Utils.elideText(address,6,4)
visible: !allChecked && checked visible: !activityFilterMenu.allSavedAddressesChecked && activityFilterMenu.savedAddressFilters.includes(address)
onClosed: root.toggleSavedAddress(address) onClosed: activityFilterStore.toggleSavedAddress(address)
} }
} }
ActivityFilterMenu { ActivityFilterMenu {
id: activityFilterMenu id: activityFilterMenu
selectedTime: root.selectedTime selectedTime: activityFilterStore.selectedTime
onSetSelectedTime: { onSetSelectedTime: {
if(selectedTime === Constants.TransactionTimePeriod.Custom) { if(selectedTime === Constants.TransactionTimePeriod.Custom) {
dialog.open() dialog.open()
} }
else else {
root.changeSelectedTime(selectedTime) activityFilterStore.setSelectedTimestamp(selectedTime)
}
} }
typeFilters: root.typeFilters typeFilters: activityFilterStore.typeFilters
onUpdateTypeFilter: root.toggleType(type) onUpdateTypeFilter: activityFilterStore.toggleType(type, allFiltersCount)
statusFilters: root.statusFilters statusFilters: activityFilterStore.statusFilters
onUpdateStatusFilter: root.toggleStatus(status) onUpdateStatusFilter: activityFilterStore.toggleStatus(status, allFiltersCount)
tokensList: root.assetsList tokensList: activityFilterStore.tokensList
collectiblesList: root.collectiblesList tokensFilter: activityFilterStore.tokensFilter
onUpdateTokensFilter: root.toggleToken(tokenSymbol) collectiblesList: activityFilterStore.collectiblesList
onUpdateCollectiblesFilter: root.toggleCollectibles(name) collectiblesFilter: activityFilterStore.collectiblesFilter
onUpdateTokensFilter: activityFilterStore.toggleToken(tokenSymbol)
onUpdateCollectiblesFilter: activityFilterStore.toggleCollectibles(id)
store: root.store store: root.store
recentsList: root.recentsList recentsList: activityFilterStore.recentsList
savedAddressList: root.savedAddressList recentsFilters: activityFilterStore.recentsFilters
onUpdateSavedAddressFilter: root.toggleSavedAddress(address) savedAddressList: activityFilterStore.savedAddressList
onUpdateRecentsFilter: root.toggleRecents(address) savedAddressFilters: activityFilterStore.savedAddressFilters
onUpdateSavedAddressFilter: activityFilterStore.toggleSavedAddress(address)
onUpdateRecentsFilter: activityFilterStore.toggleRecents(address)
} }
StatusDateRangePicker { StatusDateRangePicker {
id: dialog id: dialog
anchors.centerIn: parent anchors.centerIn: parent
// To-do sync with backend fromTimestamp: activityFilterStore.fromTimestamp
fromTimestamp: root.fromTimestamp// 7 days ago toTimestamp: activityFilterStore.toTimestamp
toTimestamp: root.toTimestamp
onNewRangeSet: { onNewRangeSet: {
root.setCustomTimeRange(fromTimestamp, toTimestamp) activityFilterStore.setCustomTimeRange(fromTimestamp, toTimestamp)
root.changeSelectedTime(Constants.TransactionTimePeriod.Custom) activityFilterStore.setSelectedTimestamp(Constants.TransactionTimePeriod.Custom)
} }
} }
} }

View File

@ -8,33 +8,46 @@ import "./filterSubMenus"
StatusMenu { StatusMenu {
id: root id: root
property var store
// Time filter // Time filter
property int selectedTime: ActivityFilterMenu.All property int selectedTime: ActivityFilterMenu.All
signal setSelectedTime(int selectedTime) signal setSelectedTime(int selectedTime)
// Type filter // Type filter
property var typeFilters: [] property var typeFilters: []
property bool allTypesChecked: typeMenu.allChecked readonly property bool allTypesChecked: typeMenu.allChecked
signal updateTypeFilter(int type) signal updateTypeFilter(int type, int allFiltersCount)
// Status filter // Status filter
property var statusFilters: [] property var statusFilters: []
property bool allStatusChecked: statusMenu.allChecked readonly property bool allStatusChecked: statusMenu.allChecked
signal updateStatusFilter(int status) signal updateStatusFilter(int status, int allFiltersCount)
// Assets filter // Tokens filter
property var tokensList: [] property var tokensList: []
property var collectiblesList property var tokensFilter: []
readonly property bool allTokensChecked: tokensMenu.allTokensChecked
signal updateTokensFilter(string tokenSymbol) signal updateTokensFilter(string tokenSymbol)
signal updateCollectiblesFilter(string name)
// Counterparty filter // Collectibles filter
property var store property var collectiblesList: []
property var collectiblesFilter: []
readonly property bool allCollectiblesChecked: tokensMenu.allCollectiblesChecked
signal updateCollectiblesFilter(double id)
// Recents filter
property var recentsList property var recentsList
property var savedAddressList property var recentsFilters
signal updateSavedAddressFilter(string address) readonly property bool allRecentsChecked: counterPartyMenu.allRecentsChecked
signal updateRecentsFilter(string address) signal updateRecentsFilter(string address)
// Collectibles filter
property var savedAddressList
property var savedAddressFilters
readonly property bool allSavedAddressesChecked: counterPartyMenu.allSavedAddressesChecked
signal updateSavedAddressFilter(string address)
implicitWidth: 176 implicitWidth: 176
// Filter By Period // Filter By Period
@ -57,14 +70,14 @@ StatusMenu {
id: typeMenu id: typeMenu
onBack: root.open() onBack: root.open()
typeFilters: root.typeFilters typeFilters: root.typeFilters
onActionTriggered: updateTypeFilter(type) onActionTriggered: updateTypeFilter(type, allFiltersCount)
closePolicy: root.closePolicy closePolicy: root.closePolicy
} }
ActivityStatusFilterSubMenu { ActivityStatusFilterSubMenu {
id: statusMenu id: statusMenu
onBack: root.open() onBack: root.open()
statusFilters: root.statusFilters statusFilters: root.statusFilters
onActionTriggered: updateStatusFilter(status) onActionTriggered: updateStatusFilter(status, allFiltersCount)
closePolicy: root.closePolicy closePolicy: root.closePolicy
} }
ActivityTokensFilterSubMenu { ActivityTokensFilterSubMenu {
@ -72,9 +85,11 @@ StatusMenu {
height: Math.min(439, tokensMenu.implicitHeight) height: Math.min(439, tokensMenu.implicitHeight)
onBack: root.open() onBack: root.open()
tokensList: root.tokensList tokensList: root.tokensList
tokensFilter: root.tokensFilter
collectiblesList: root.collectiblesList collectiblesList: root.collectiblesList
collectiblesFilter: root.collectiblesFilter
onTokenToggled: updateTokensFilter(tokenSymbol) onTokenToggled: updateTokensFilter(tokenSymbol)
onCollectibleToggled: updateCollectiblesFilter(name) onCollectibleToggled: updateCollectiblesFilter(id)
closePolicy: root.closePolicy closePolicy: root.closePolicy
} }
ActivityCounterpartyFilterSubMenu { ActivityCounterpartyFilterSubMenu {
@ -83,7 +98,9 @@ StatusMenu {
onBack: root.open() onBack: root.open()
store: root.store store: root.store
recentsList: root.recentsList recentsList: root.recentsList
recentsFilters: root.recentsFilters
savedAddressList: root.savedAddressList savedAddressList: root.savedAddressList
savedAddressFilters: root.savedAddressFilters
onSavedAddressToggled: root.updateSavedAddressFilter(address) onSavedAddressToggled: root.updateSavedAddressFilter(address)
onRecentsToggled: root.updateRecentsFilter(address) onRecentsToggled: root.updateRecentsFilter(address)
closePolicy: root.closePolicy closePolicy: root.closePolicy

View File

@ -20,18 +20,20 @@ import "../../controls"
StatusMenu { StatusMenu {
id: root id: root
property var recentsList
property var savedAddressList
property var store property var store
property var recentsList
property var recentsFilters
readonly property bool allRecentsChecked: recentsFilters.length === 0
property var savedAddressList
property var savedAddressFilters
readonly property bool allSavedAddressesChecked: savedAddressFilters.length === 0
signal back() signal back()
signal savedAddressToggled(string address) signal savedAddressToggled(string address)
signal recentsToggled(string address) signal recentsToggled(string address)
property var searchTokenSymbolByAddressFn: function (address) {
return ""
}
implicitWidth: 289 implicitWidth: 289
MenuBackButton { MenuBackButton {
@ -75,36 +77,34 @@ StatusMenu {
Repeater { Repeater {
model: root.recentsList model: root.recentsList
delegate: ActivityTypeCheckBox { delegate: ActivityTypeCheckBox {
readonly property int transactionType: model.to.toLowerCase() === store.overview.mixedcaseAddress.toLowerCase() ? Constants.TransactionType.Receive : Constants.TransactionType.Send readonly property int transactionType: model.activityEntry.recipient.toLowerCase() === store.overview.mixedcaseAddress.toLowerCase() ? Constants.TransactionType.Receive : Constants.TransactionType.Send
readonly property string fromName: store.getNameForAddress(model.from) readonly property string fromName: store.getNameForAddress(model.activityEntry.sender)
readonly property string toName: store.getNameForAddress(model.to) readonly property string toName: store.getNameForAddress(model.activityEntry.recipient)
width: parent.width width: parent.width
height: 44 height: 44
title: transactionType === Constants.TransactionType.Receive ? title: transactionType === Constants.TransactionType.Receive ?
fromName || StatusQUtils.Utils.elideText(model.from,6,4) : fromName || StatusQUtils.Utils.elideText(model.activityEntry.sender,6,4) :
toName || StatusQUtils.Utils.elideText(model.to,6,4) toName || StatusQUtils.Utils.elideText(model.activityEntry.recipient,6,4)
subTitle: { subTitle: {
if (transactionType === Constants.TransactionType.Receive) { if (transactionType === Constants.TransactionType.Receive) {
return fromName ? StatusQUtils.Utils.elideText(model.from,6,4) : "" return fromName ? StatusQUtils.Utils.elideText(model.activityEntry.sender,6,4) : ""
} else { } else {
return toName ? StatusQUtils.Utils.elideText(model.to,6,4): "" return toName ? StatusQUtils.Utils.elideText(model.activityEntry.recipient,6,4): ""
} }
} }
statusListItemSubTitle.elide: Text.ElideMiddle statusListItemSubTitle.elide: Text.ElideMiddle
statusListItemSubTitle.wrapMode: Text.NoWrap statusListItemSubTitle.wrapMode: Text.NoWrap
assetSettings.name: (transactionType === Constants.TransactionType.Receive ? fromName : toName) || "address" assetSettings.name: (transactionType === Constants.TransactionType.Receive ? fromName : toName) || "address"
assetSettings.isLetterIdenticon: transactionType === Constants.TransactionType.Receive ? assetSettings.isLetterIdenticon: transactionType === Constants.TransactionType.Receive ? !!fromName : !!toName
!!fromName :
!!toName
assetSettings.bgHeight: 32 assetSettings.bgHeight: 32
assetSettings.bgWidth: 32 assetSettings.bgWidth: 32
assetSettings.bgRadius: assetSettings.bgHeight/2 assetSettings.bgRadius: assetSettings.bgHeight/2
assetSettings.width: 16 assetSettings.width: 16
assetSettings.height: 16 assetSettings.height: 16
buttonGroup: recentsButtonGroup buttonGroup: recentsButtonGroup
allChecked: model.allChecked allChecked: root.allRecentsChecked
checked: model.checked checked: root.allRecentsChecked ? true : root.recentsFilters.includes(transactionType === Constants.TransactionType.Receive ? model.activityEntry.sender: model.activityEntry.recipient)
onActionTriggered: root.recentsToggled(transactionType === Constants.TransactionType.Receive ? model.from: model.to) onActionTriggered: root.recentsToggled(transactionType === Constants.TransactionType.Receive ? model.activityEntry.sender: model.activityEntry.recipient)
} }
} }
} }
@ -137,8 +137,8 @@ StatusMenu {
assetSettings.name: model.name assetSettings.name: model.name
assetSettings.isLetterIdenticon: true assetSettings.isLetterIdenticon: true
buttonGroup: savedButtonGroup buttonGroup: savedButtonGroup
allChecked: model.allChecked allChecked: root.allSavedAddressesChecked
checked: model.checked checked: root.allSavedAddressesChecked ? true : root.savedAddressFilters.includes(model.address)
onActionTriggered: root.savedAddressToggled(model.address) onActionTriggered: root.savedAddressToggled(model.address)
} }
} }

View File

@ -11,7 +11,8 @@ StatusMenu {
id: root id: root
property var statusFilters: [] property var statusFilters: []
readonly property bool allChecked: statusFilters.length === typeButtonGroup.buttons.length readonly property bool allChecked: statusFilters.length === 0
readonly property int allFiltersCount: typeButtonGroup.buttons.length
signal back() signal back()
signal actionTriggered(int status) signal actionTriggered(int status)
@ -37,7 +38,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionStatus.Failed type: Constants.TransactionStatus.Failed
checked: statusFilters.includes(type) checked: root.allChecked || statusFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -49,7 +50,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionStatus.Pending type: Constants.TransactionStatus.Pending
checked: statusFilters.includes(type) checked: root.allChecked || statusFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -61,7 +62,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionStatus.Complete type: Constants.TransactionStatus.Complete
checked: statusFilters.includes(type) checked: root.allChecked || statusFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -73,7 +74,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionStatus.Finished type: Constants.TransactionStatus.Finished
checked: statusFilters.includes(type) checked: root.allChecked || statusFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
} }

View File

@ -16,19 +16,27 @@ import utils 1.0
StatusMenu { StatusMenu {
id: root id: root
property var tokensList property var tokensFilter: []
property var collectiblesList property var tokensList: []
readonly property bool allTokensChecked: tokensFilter.length === 0
property var collectiblesList: []
property var collectiblesFilter: []
readonly property bool allCollectiblesChecked: collectiblesFilter.length === 0
signal back() signal back()
signal tokenToggled(string tokenSymbol) signal tokenToggled(string tokenSymbol)
signal collectibleToggled(string name) signal collectibleToggled(double id)
property var searchTokenSymbolByAddressFn: function (address) { property var searchTokenSymbolByAddressFn: function (address) { return "" }
return ""
}
implicitWidth: 289 implicitWidth: 289
QtObject {
id: d
property bool isFetching: root.collectiblesList.isFetching
}
MenuBackButton { MenuBackButton {
id: backButton id: backButton
width: parent.width width: parent.width
@ -82,14 +90,13 @@ StatusMenu {
Repeater { Repeater {
model: SortFilterProxyModel { model: SortFilterProxyModel {
sourceModel: root.tokensList sourceModel: root.tokensList
filters: [ filters: ExpressionFilter {
ExpressionFilter { enabled: root.tokensList.count > 0
expression: { expression: {
var tokenSymbolByAddress = root.searchTokenSymbolByAddressFn(tokensSearchBox.text) var tokenSymbolByAddress = root.searchTokenSymbolByAddressFn(tokensSearchBox.text)
return symbol.startsWith(tokensSearchBox.text.toUpperCase()) || name.toUpperCase().startsWith(tokensSearchBox.text.toUpperCase()) || (tokenSymbolByAddress!=="" && symbol.startsWith(tokenSymbolByAddress)) return symbol.startsWith(tokensSearchBox.text.toUpperCase()) || name.toUpperCase().startsWith(tokensSearchBox.text.toUpperCase()) || (tokenSymbolByAddress!=="" && symbol.startsWith(tokenSymbolByAddress))
}
} }
] }
} }
delegate: ActivityTypeCheckBox { delegate: ActivityTypeCheckBox {
Layout.fillWidth: true Layout.fillWidth: true
@ -99,8 +106,8 @@ StatusMenu {
assetSettings.name: model.symbol ? Constants.tokenIcon(symbol) : "" assetSettings.name: model.symbol ? Constants.tokenIcon(symbol) : ""
assetSettings.isImage: true assetSettings.isImage: true
buttonGroup: tokenButtonGroup buttonGroup: tokenButtonGroup
allChecked: model.allChecked allChecked: root.allTokensChecked
checked: model.checked checked: root.allTokensChecked || root.tokensFilter.includes(model.symbol)
onActionTriggered: root.tokenToggled(model.symbol) onActionTriggered: root.tokenToggled(model.symbol)
} }
} }
@ -130,27 +137,28 @@ StatusMenu {
Repeater { Repeater {
model: SortFilterProxyModel { model: SortFilterProxyModel {
sourceModel: root.collectiblesList sourceModel: root.collectiblesList
filters: [ filters: ExpressionFilter {
ExpressionFilter { enabled: root.collectiblesList.count > 0 && !!collectiblesSearchBox.text
expression: { expression: {
return model.name.toUpperCase().startsWith(collectiblesSearchBox.text.toUpperCase()) let searchText = collectiblesSearchBox.text.toUpperCase()
} return name.toUpperCase().startsWith(searchText)
} }
] }
} }
delegate: ActivityTypeCheckBox { delegate: ActivityTypeCheckBox {
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 44 Layout.preferredHeight: 44
title: model.name title: model.name
assetSettings.name: model.iconSource assetSettings.name: model.imageUrl
assetSettings.isImage: true
assetSettings.bgWidth: 32 assetSettings.bgWidth: 32
assetSettings.bgHeight: 32 assetSettings.bgHeight: 32
assetSettings.bgRadius: assetSettings.bgHeight/2 assetSettings.bgRadius: assetSettings.bgHeight/2
assetSettings.isImage: true
buttonGroup: collectibleButtonGroup buttonGroup: collectibleButtonGroup
allChecked: model.allChecked allChecked: root.allCollectiblesChecked
checked: model.checked checked: root.allCollectiblesChecked || root.collectiblesFilter.includes(model.id)
onActionTriggered: root.collectibleToggled(name) onActionTriggered: root.collectibleToggled(model.id)
loading: d.isFetching
} }
} }
} }

View File

@ -11,7 +11,8 @@ StatusMenu {
id: root id: root
property var typeFilters: [] property var typeFilters: []
readonly property bool allChecked: typeFilters.length === typeButtonGroup.buttons.length readonly property bool allChecked: typeFilters.length === 0
readonly property int allFiltersCount: typeButtonGroup.buttons.length
signal back() signal back()
signal actionTriggered(int type) signal actionTriggered(int type)
@ -36,7 +37,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionType.Send type: Constants.TransactionType.Send
checked: typeFilters.includes(type) checked: root.allChecked || typeFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -47,7 +48,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionType.Receive type: Constants.TransactionType.Receive
checked: typeFilters.includes(type) checked: root.allChecked || typeFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -58,7 +59,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionType.Buy type: Constants.TransactionType.Buy
checked: typeFilters.includes(type) checked: root.allChecked || typeFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -69,7 +70,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionType.Swap type: Constants.TransactionType.Swap
checked: typeFilters.includes(type) checked: root.allChecked || typeFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
@ -80,7 +81,7 @@ StatusMenu {
buttonGroup: typeButtonGroup buttonGroup: typeButtonGroup
allChecked: root.allChecked allChecked: root.allChecked
type: Constants.TransactionType.Bridge type: Constants.TransactionType.Bridge
checked: typeFilters.includes(type) checked: root.allChecked || typeFilters.includes(type)
onActionTriggered: root.actionTriggered(type) onActionTriggered: root.actionTriggered(type)
} }
} }

View File

@ -0,0 +1,176 @@
import QtQuick 2.13
import SortFilterProxyModel 0.2
import utils 1.0
QtObject {
id: root
property var activityController: walletSection.activityController
property bool filtersSet: fromTimestamp !== 0 || toTimestamp !== 0 ||
typeFilters.length !== 0 ||
statusFilters.length !== 0 ||
tokensFilter.length !== 0 ||
collectiblesFilter.length !== 0 ||
recentsFilters.length !== 0 ||
savedAddressFilters.length !== 0
// Time filters
property int selectedTime: Constants.TransactionTimePeriod.All
// To-do get this from the backend once oldest Tx timestamp is available
property double fromTimestamp
property double toTimestamp: new Date().valueOf()
function setSelectedTimestamp(selcTime) {
selectedTime = selcTime
var currDate = new Date() // current date
switch(selectedTime) {
case Constants.TransactionTimePeriod.All:
fromTimestamp = 0
toTimestamp = 0
break
case Constants.TransactionTimePeriod.Today:
fromTimestamp = currDate.valueOf() // Today
toTimestamp = fromTimestamp
break
case Constants.TransactionTimePeriod.Yesterday:
fromTimestamp = new Date().setDate(currDate.getDate() - 1).valueOf() // Yesterday
toTimestamp = fromTimestamp
break
case Constants.TransactionTimePeriod.ThisWeek:
var firstDayOfCurrentWeek = currDate.getDate() - currDate.getDay()
fromTimestamp = new Date().setDate(firstDayOfCurrentWeek).valueOf() // This week
toTimestamp = currDate.valueOf()
break
case Constants.TransactionTimePeriod.LastWeek:
fromTimestamp = new Date().setDate(currDate.getDate() - 7).valueOf() // Last week
toTimestamp = currDate.valueOf()
break
case Constants.TransactionTimePeriod.ThisMonth:
fromTimestamp = new Date().setDate(1).valueOf() // This month
toTimestamp = currDate.valueOf()
break
case Constants.TransactionTimePeriod.LastMonth:
let x = new Date()
x.setDate(1)
x.setMonth(x.getMonth()-1)
fromTimestamp = x.valueOf() // Last month
x.setDate(new Date(x.getFullYear(), x.getMonth(), 0).getDate() + 1)
toTimestamp = x.valueOf()
break
default:
return ""
}
activityController.setFilterTime(root.fromTimestamp/1000, root.toTimestamp/1000)
activityController.updateFilter()
}
function setCustomTimeRange(fromTimestamp, toTimestamp) {
root.fromTimestamp = fromTimestamp
root.toTimestamp = toTimestamp
activityController.setFilterTime(root.fromTimestamp/1000, root.toTimestamp/1000)
activityController.updateFilter()
}
// Type Filters
property var typeFilters: []
function toggleType(type, allFiltersCount) {
// update filters
typeFilters = toggleFilterState(typeFilters, type, allFiltersCount)
// Set backend values
activityController.setFilterType(JSON.stringify(typeFilters))
activityController.updateFilter()
}
// Status Filters
property var statusFilters: []
function toggleStatus(status, allFiltersCount) {
// update filters
statusFilters = toggleFilterState(statusFilters, status, allFiltersCount)
// Set backend values
activityController.setFilterStatus(JSON.stringify(statusFilters))
activityController.updateFilter()
}
// Tokens Filters
property var tokensList: walletSectionAssets.assets
property var tokensFilter: []
function toggleToken(symbol) {
// update filters
tokensFilter = toggleFilterState(tokensFilter, symbol, tokensList.count)
// Set backend values
activityController.setFilterAssets(JSON.stringify(tokensFilter))
activityController.updateFilter()
}
// Collectibles Filters
property var collectiblesList: walletSectionCollectibles.model
property var collectiblesFilter: []
function toggleCollectibles(id) {
// update filters
collectiblesFilter = toggleFilterState(collectiblesFilter, id, collectiblesList.count)
// To-do go side filtering is pending
// activityController.setFilterCollectibles(JSON.stringify(collectiblesFilter))
// activityController.updateFilter()
}
// To-do get correct model unaffected by filters from go side
property var recentsList: []
property var recentsFilters: []
function toggleRecents(address) {
// update filters
recentsFilters = toggleFilterState(recentsFilters, address, recentsList.count)
// Set backend values
activityController.setFilterToAddresses(JSON.stringify(recentsFilters.concat(savedAddressFilters)))
activityController.updateFilter()
}
property var savedAddressesModel: walletSectionSavedAddresses.model
property bool areTestNetworksEnabled: networksModule.areTestNetworksEnabled
property var savedAddressList: SortFilterProxyModel {
sourceModel: savedAddressesModel
filters: [
ValueFilter {
roleName: "isTest"
value: areTestNetworksEnabled
}
]
}
property var savedAddressFilters: []
function toggleSavedAddress(address) {
// update filters
savedAddressFilters = toggleFilterState(savedAddressFilters, address, savedAddressList.count)
// Set backend values
activityController.setFilterToAddresses(JSON.stringify(recentsFilters.concat(savedAddressFilters)))
activityController.updateFilter()
}
function toggleFilterState(filters, attribute, allFiltersCount) {
let tempFilters = filters
// if all were selected then only select one of them
if(tempFilters.length === 0) {
tempFilters = [attribute]
}
else {
// if last one is being deselected, select all
if(tempFilters.length === 1 && tempFilters[0] === attribute) {
tempFilters = []
}
else {
let index = tempFilters.indexOf(attribute)
if(index === -1) {
if(allFiltersCount === tempFilters.length + 1)
tempFilters = []
else
tempFilters.push(attribute)
}
else {
tempFilters.splice(index, 1)
}
}
}
return tempFilters
}
}

View File

@ -1 +1,2 @@
singleton RootStore 1.0 RootStore.qml singleton RootStore 1.0 RootStore.qml
ActivityFiltersStore 1.0 ActivityFiltersStore.qml

View File

@ -33,6 +33,7 @@ ColumnLayout {
QtObject { QtObject {
id: d id: d
property bool isLoading: false property bool isLoading: false
property var activityFiltersStore: WalletStores.ActivityFiltersStore{}
} }
Connections { Connections {
@ -58,7 +59,7 @@ ColumnLayout {
id: noTxs id: noTxs
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 42 Layout.preferredHeight: 42
visible: !d.isLoading && transactionListRoot.count === 0 visible: !d.isLoading && transactionListRoot.count === 0 && !d.activityFiltersStore.filtersSet
font.pixelSize: Style.current.primaryTextFontSize font.pixelSize: Style.current.primaryTextFontSize
text: qsTr("Activity for this account will appear here") text: qsTr("Activity for this account will appear here")
} }
@ -66,24 +67,11 @@ ColumnLayout {
// Tp-do make connections with nim once logic is ready // Tp-do make connections with nim once logic is ready
ActivityFilterPanel { ActivityFilterPanel {
id: filterComponent id: filterComponent
visible: !d.isLoading && transactionListRoot.count !== 0 visible: !d.isLoading && (transactionListRoot.count !== 0 || d.activityFiltersStore.filtersSet)
Layout.fillWidth: true Layout.fillWidth: true
Layout.preferredHeight: 50 Layout.preferredHeight: 50
store: RootStore activityFilterStore: d.activityFiltersStore
selectedTime: Constants.TransactionTimePeriod.All store: WalletStores.RootStore
typeFilters: [
Constants.TransactionType.Send,
Constants.TransactionType.Receive,
Constants.TransactionType.Buy,
Constants.TransactionType.Swap,
Constants.TransactionType.Bridge
]
statusFilters: [
Constants.TransactionStatus.Failed,
Constants.TransactionStatus.Pending,
Constants.TransactionStatus.Complete,
Constants.TransactionStatus.Finished
]
} }
Separator { Separator {