diff --git a/storybook/pages/ActivityFilterMenuPage.qml b/storybook/pages/ActivityFilterMenuPage.qml index d37089ab37..2cc0ba8daa 100644 --- a/storybook/pages/ActivityFilterMenuPage.qml +++ b/storybook/pages/ActivityFilterMenuPage.qml @@ -5,6 +5,7 @@ import QtQuick.Layouts 1.14 import AppLayouts.Wallet.controls 1.0 import AppLayouts.Wallet.popups 1.0 import AppLayouts.Wallet.panels 1.0 +import AppLayouts.Wallet.stores 1.0 import AppLayouts.stores 1.0 import StatusQ.Core 0.1 @@ -31,285 +32,7 @@ SplitView { QtObject { 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 0 ? ens : chainShortNames + StatusQUtils.Utils.elideText(address,6,4) - visible: !allChecked && checked - onClosed: root.toggleSavedAddress(address) + visible: !activityFilterMenu.allSavedAddressesChecked && activityFilterMenu.savedAddressFilters.includes(address) + onClosed: activityFilterStore.toggleSavedAddress(address) } } ActivityFilterMenu { id: activityFilterMenu - selectedTime: root.selectedTime + selectedTime: activityFilterStore.selectedTime onSetSelectedTime: { if(selectedTime === Constants.TransactionTimePeriod.Custom) { dialog.open() } - else - root.changeSelectedTime(selectedTime) + else { + activityFilterStore.setSelectedTimestamp(selectedTime) + } } - typeFilters: root.typeFilters - onUpdateTypeFilter: root.toggleType(type) + typeFilters: activityFilterStore.typeFilters + onUpdateTypeFilter: activityFilterStore.toggleType(type, allFiltersCount) - statusFilters: root.statusFilters - onUpdateStatusFilter: root.toggleStatus(status) + statusFilters: activityFilterStore.statusFilters + onUpdateStatusFilter: activityFilterStore.toggleStatus(status, allFiltersCount) - tokensList: root.assetsList - collectiblesList: root.collectiblesList - onUpdateTokensFilter: root.toggleToken(tokenSymbol) - onUpdateCollectiblesFilter: root.toggleCollectibles(name) + tokensList: activityFilterStore.tokensList + tokensFilter: activityFilterStore.tokensFilter + collectiblesList: activityFilterStore.collectiblesList + collectiblesFilter: activityFilterStore.collectiblesFilter + onUpdateTokensFilter: activityFilterStore.toggleToken(tokenSymbol) + onUpdateCollectiblesFilter: activityFilterStore.toggleCollectibles(id) store: root.store - recentsList: root.recentsList - savedAddressList: root.savedAddressList - onUpdateSavedAddressFilter: root.toggleSavedAddress(address) - onUpdateRecentsFilter: root.toggleRecents(address) + recentsList: activityFilterStore.recentsList + recentsFilters: activityFilterStore.recentsFilters + savedAddressList: activityFilterStore.savedAddressList + savedAddressFilters: activityFilterStore.savedAddressFilters + onUpdateSavedAddressFilter: activityFilterStore.toggleSavedAddress(address) + onUpdateRecentsFilter: activityFilterStore.toggleRecents(address) } StatusDateRangePicker { id: dialog anchors.centerIn: parent - // To-do sync with backend - fromTimestamp: root.fromTimestamp// 7 days ago - toTimestamp: root.toTimestamp + fromTimestamp: activityFilterStore.fromTimestamp + toTimestamp: activityFilterStore.toTimestamp onNewRangeSet: { - root.setCustomTimeRange(fromTimestamp, toTimestamp) - root.changeSelectedTime(Constants.TransactionTimePeriod.Custom) + activityFilterStore.setCustomTimeRange(fromTimestamp, toTimestamp) + activityFilterStore.setSelectedTimestamp(Constants.TransactionTimePeriod.Custom) } } } diff --git a/ui/app/AppLayouts/Wallet/popups/ActivityFilterMenu.qml b/ui/app/AppLayouts/Wallet/popups/ActivityFilterMenu.qml index 11da5daab2..cc88a9b61b 100644 --- a/ui/app/AppLayouts/Wallet/popups/ActivityFilterMenu.qml +++ b/ui/app/AppLayouts/Wallet/popups/ActivityFilterMenu.qml @@ -8,33 +8,46 @@ import "./filterSubMenus" StatusMenu { id: root + property var store + // Time filter property int selectedTime: ActivityFilterMenu.All signal setSelectedTime(int selectedTime) // Type filter property var typeFilters: [] - property bool allTypesChecked: typeMenu.allChecked - signal updateTypeFilter(int type) + readonly property bool allTypesChecked: typeMenu.allChecked + signal updateTypeFilter(int type, int allFiltersCount) // Status filter property var statusFilters: [] - property bool allStatusChecked: statusMenu.allChecked - signal updateStatusFilter(int status) + readonly property bool allStatusChecked: statusMenu.allChecked + signal updateStatusFilter(int status, int allFiltersCount) - // Assets filter + // Tokens filter property var tokensList: [] - property var collectiblesList + property var tokensFilter: [] + readonly property bool allTokensChecked: tokensMenu.allTokensChecked signal updateTokensFilter(string tokenSymbol) - signal updateCollectiblesFilter(string name) - // Counterparty filter - property var store + // Collectibles filter + property var collectiblesList: [] + property var collectiblesFilter: [] + readonly property bool allCollectiblesChecked: tokensMenu.allCollectiblesChecked + signal updateCollectiblesFilter(double id) + + // Recents filter property var recentsList - property var savedAddressList - signal updateSavedAddressFilter(string address) + property var recentsFilters + readonly property bool allRecentsChecked: counterPartyMenu.allRecentsChecked signal updateRecentsFilter(string address) + // Collectibles filter + property var savedAddressList + property var savedAddressFilters + readonly property bool allSavedAddressesChecked: counterPartyMenu.allSavedAddressesChecked + signal updateSavedAddressFilter(string address) + implicitWidth: 176 // Filter By Period @@ -57,14 +70,14 @@ StatusMenu { id: typeMenu onBack: root.open() typeFilters: root.typeFilters - onActionTriggered: updateTypeFilter(type) + onActionTriggered: updateTypeFilter(type, allFiltersCount) closePolicy: root.closePolicy } ActivityStatusFilterSubMenu { id: statusMenu onBack: root.open() statusFilters: root.statusFilters - onActionTriggered: updateStatusFilter(status) + onActionTriggered: updateStatusFilter(status, allFiltersCount) closePolicy: root.closePolicy } ActivityTokensFilterSubMenu { @@ -72,9 +85,11 @@ StatusMenu { height: Math.min(439, tokensMenu.implicitHeight) onBack: root.open() tokensList: root.tokensList + tokensFilter: root.tokensFilter collectiblesList: root.collectiblesList + collectiblesFilter: root.collectiblesFilter onTokenToggled: updateTokensFilter(tokenSymbol) - onCollectibleToggled: updateCollectiblesFilter(name) + onCollectibleToggled: updateCollectiblesFilter(id) closePolicy: root.closePolicy } ActivityCounterpartyFilterSubMenu { @@ -83,7 +98,9 @@ StatusMenu { onBack: root.open() store: root.store recentsList: root.recentsList + recentsFilters: root.recentsFilters savedAddressList: root.savedAddressList + savedAddressFilters: root.savedAddressFilters onSavedAddressToggled: root.updateSavedAddressFilter(address) onRecentsToggled: root.updateRecentsFilter(address) closePolicy: root.closePolicy diff --git a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityCounterpartyFilterSubMenu.qml b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityCounterpartyFilterSubMenu.qml index 00ce3bd5df..713f7396ed 100644 --- a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityCounterpartyFilterSubMenu.qml +++ b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityCounterpartyFilterSubMenu.qml @@ -20,18 +20,20 @@ import "../../controls" StatusMenu { id: root - property var recentsList - property var savedAddressList 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 savedAddressToggled(string address) signal recentsToggled(string address) - property var searchTokenSymbolByAddressFn: function (address) { - return "" - } - implicitWidth: 289 MenuBackButton { @@ -75,36 +77,34 @@ StatusMenu { Repeater { model: root.recentsList delegate: ActivityTypeCheckBox { - readonly property int transactionType: model.to.toLowerCase() === store.overview.mixedcaseAddress.toLowerCase() ? Constants.TransactionType.Receive : Constants.TransactionType.Send - readonly property string fromName: store.getNameForAddress(model.from) - readonly property string toName: store.getNameForAddress(model.to) + 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.activityEntry.sender) + readonly property string toName: store.getNameForAddress(model.activityEntry.recipient) width: parent.width height: 44 title: transactionType === Constants.TransactionType.Receive ? - fromName || StatusQUtils.Utils.elideText(model.from,6,4) : - toName || StatusQUtils.Utils.elideText(model.to,6,4) + fromName || StatusQUtils.Utils.elideText(model.activityEntry.sender,6,4) : + toName || StatusQUtils.Utils.elideText(model.activityEntry.recipient,6,4) subTitle: { 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 { - return toName ? StatusQUtils.Utils.elideText(model.to,6,4): "" + return toName ? StatusQUtils.Utils.elideText(model.activityEntry.recipient,6,4): "" } } statusListItemSubTitle.elide: Text.ElideMiddle statusListItemSubTitle.wrapMode: Text.NoWrap assetSettings.name: (transactionType === Constants.TransactionType.Receive ? fromName : toName) || "address" - assetSettings.isLetterIdenticon: transactionType === Constants.TransactionType.Receive ? - !!fromName : - !!toName + assetSettings.isLetterIdenticon: transactionType === Constants.TransactionType.Receive ? !!fromName : !!toName assetSettings.bgHeight: 32 assetSettings.bgWidth: 32 assetSettings.bgRadius: assetSettings.bgHeight/2 assetSettings.width: 16 assetSettings.height: 16 buttonGroup: recentsButtonGroup - allChecked: model.allChecked - checked: model.checked - onActionTriggered: root.recentsToggled(transactionType === Constants.TransactionType.Receive ? model.from: model.to) + allChecked: root.allRecentsChecked + 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.activityEntry.sender: model.activityEntry.recipient) } } } @@ -137,8 +137,8 @@ StatusMenu { assetSettings.name: model.name assetSettings.isLetterIdenticon: true buttonGroup: savedButtonGroup - allChecked: model.allChecked - checked: model.checked + allChecked: root.allSavedAddressesChecked + checked: root.allSavedAddressesChecked ? true : root.savedAddressFilters.includes(model.address) onActionTriggered: root.savedAddressToggled(model.address) } } diff --git a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityStatusFilterSubMenu.qml b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityStatusFilterSubMenu.qml index 54b7472d53..43b217797e 100644 --- a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityStatusFilterSubMenu.qml +++ b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityStatusFilterSubMenu.qml @@ -11,7 +11,8 @@ StatusMenu { id: root 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 actionTriggered(int status) @@ -37,7 +38,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionStatus.Failed - checked: statusFilters.includes(type) + checked: root.allChecked || statusFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -49,7 +50,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionStatus.Pending - checked: statusFilters.includes(type) + checked: root.allChecked || statusFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -61,7 +62,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionStatus.Complete - checked: statusFilters.includes(type) + checked: root.allChecked || statusFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -73,7 +74,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionStatus.Finished - checked: statusFilters.includes(type) + checked: root.allChecked || statusFilters.includes(type) onActionTriggered: root.actionTriggered(type) } } diff --git a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTokensFilterSubMenu.qml b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTokensFilterSubMenu.qml index 52958b901d..c6460b2381 100644 --- a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTokensFilterSubMenu.qml +++ b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTokensFilterSubMenu.qml @@ -16,19 +16,27 @@ import utils 1.0 StatusMenu { id: root - property var tokensList - property var collectiblesList + property var tokensFilter: [] + 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 tokenToggled(string tokenSymbol) - signal collectibleToggled(string name) + signal collectibleToggled(double id) - property var searchTokenSymbolByAddressFn: function (address) { - return "" - } + property var searchTokenSymbolByAddressFn: function (address) { return "" } implicitWidth: 289 + QtObject { + id: d + property bool isFetching: root.collectiblesList.isFetching + } + MenuBackButton { id: backButton width: parent.width @@ -82,14 +90,13 @@ StatusMenu { Repeater { model: SortFilterProxyModel { sourceModel: root.tokensList - filters: [ - ExpressionFilter { - expression: { - var tokenSymbolByAddress = root.searchTokenSymbolByAddressFn(tokensSearchBox.text) - return symbol.startsWith(tokensSearchBox.text.toUpperCase()) || name.toUpperCase().startsWith(tokensSearchBox.text.toUpperCase()) || (tokenSymbolByAddress!=="" && symbol.startsWith(tokenSymbolByAddress)) - } + filters: ExpressionFilter { + enabled: root.tokensList.count > 0 + expression: { + var tokenSymbolByAddress = root.searchTokenSymbolByAddressFn(tokensSearchBox.text) + return symbol.startsWith(tokensSearchBox.text.toUpperCase()) || name.toUpperCase().startsWith(tokensSearchBox.text.toUpperCase()) || (tokenSymbolByAddress!=="" && symbol.startsWith(tokenSymbolByAddress)) } - ] + } } delegate: ActivityTypeCheckBox { Layout.fillWidth: true @@ -99,8 +106,8 @@ StatusMenu { assetSettings.name: model.symbol ? Constants.tokenIcon(symbol) : "" assetSettings.isImage: true buttonGroup: tokenButtonGroup - allChecked: model.allChecked - checked: model.checked + allChecked: root.allTokensChecked + checked: root.allTokensChecked || root.tokensFilter.includes(model.symbol) onActionTriggered: root.tokenToggled(model.symbol) } } @@ -130,27 +137,28 @@ StatusMenu { Repeater { model: SortFilterProxyModel { sourceModel: root.collectiblesList - filters: [ - ExpressionFilter { - expression: { - return model.name.toUpperCase().startsWith(collectiblesSearchBox.text.toUpperCase()) - } + filters: ExpressionFilter { + enabled: root.collectiblesList.count > 0 && !!collectiblesSearchBox.text + expression: { + let searchText = collectiblesSearchBox.text.toUpperCase() + return name.toUpperCase().startsWith(searchText) } - ] + } } delegate: ActivityTypeCheckBox { Layout.fillWidth: true Layout.preferredHeight: 44 title: model.name - assetSettings.name: model.iconSource + assetSettings.name: model.imageUrl + assetSettings.isImage: true assetSettings.bgWidth: 32 assetSettings.bgHeight: 32 assetSettings.bgRadius: assetSettings.bgHeight/2 - assetSettings.isImage: true buttonGroup: collectibleButtonGroup - allChecked: model.allChecked - checked: model.checked - onActionTriggered: root.collectibleToggled(name) + allChecked: root.allCollectiblesChecked + checked: root.allCollectiblesChecked || root.collectiblesFilter.includes(model.id) + onActionTriggered: root.collectibleToggled(model.id) + loading: d.isFetching } } } diff --git a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTypeFilterSubMenu.qml b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTypeFilterSubMenu.qml index 6ae9ddad96..fee508c040 100644 --- a/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTypeFilterSubMenu.qml +++ b/ui/app/AppLayouts/Wallet/popups/filterSubMenus/ActivityTypeFilterSubMenu.qml @@ -11,7 +11,8 @@ StatusMenu { id: root 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 actionTriggered(int type) @@ -36,7 +37,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionType.Send - checked: typeFilters.includes(type) + checked: root.allChecked || typeFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -47,7 +48,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionType.Receive - checked: typeFilters.includes(type) + checked: root.allChecked || typeFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -58,7 +59,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionType.Buy - checked: typeFilters.includes(type) + checked: root.allChecked || typeFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -69,7 +70,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionType.Swap - checked: typeFilters.includes(type) + checked: root.allChecked || typeFilters.includes(type) onActionTriggered: root.actionTriggered(type) } @@ -80,7 +81,7 @@ StatusMenu { buttonGroup: typeButtonGroup allChecked: root.allChecked type: Constants.TransactionType.Bridge - checked: typeFilters.includes(type) + checked: root.allChecked || typeFilters.includes(type) onActionTriggered: root.actionTriggered(type) } } diff --git a/ui/app/AppLayouts/Wallet/stores/ActivityFiltersStore.qml b/ui/app/AppLayouts/Wallet/stores/ActivityFiltersStore.qml new file mode 100644 index 0000000000..b8af6d73e0 --- /dev/null +++ b/ui/app/AppLayouts/Wallet/stores/ActivityFiltersStore.qml @@ -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 + } +} diff --git a/ui/app/AppLayouts/Wallet/stores/qmldir b/ui/app/AppLayouts/Wallet/stores/qmldir index 3b0c907239..fd12c5a1e8 100644 --- a/ui/app/AppLayouts/Wallet/stores/qmldir +++ b/ui/app/AppLayouts/Wallet/stores/qmldir @@ -1 +1,2 @@ singleton RootStore 1.0 RootStore.qml +ActivityFiltersStore 1.0 ActivityFiltersStore.qml diff --git a/ui/imports/shared/views/HistoryView.qml b/ui/imports/shared/views/HistoryView.qml index a995492c5f..615d4f26c7 100644 --- a/ui/imports/shared/views/HistoryView.qml +++ b/ui/imports/shared/views/HistoryView.qml @@ -33,6 +33,7 @@ ColumnLayout { QtObject { id: d property bool isLoading: false + property var activityFiltersStore: WalletStores.ActivityFiltersStore{} } Connections { @@ -58,7 +59,7 @@ ColumnLayout { id: noTxs Layout.fillWidth: true Layout.preferredHeight: 42 - visible: !d.isLoading && transactionListRoot.count === 0 + visible: !d.isLoading && transactionListRoot.count === 0 && !d.activityFiltersStore.filtersSet font.pixelSize: Style.current.primaryTextFontSize text: qsTr("Activity for this account will appear here") } @@ -66,24 +67,11 @@ ColumnLayout { // Tp-do make connections with nim once logic is ready ActivityFilterPanel { id: filterComponent - visible: !d.isLoading && transactionListRoot.count !== 0 + visible: !d.isLoading && (transactionListRoot.count !== 0 || d.activityFiltersStore.filtersSet) Layout.fillWidth: true Layout.preferredHeight: 50 - store: RootStore - selectedTime: Constants.TransactionTimePeriod.All - 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 - ] + activityFilterStore: d.activityFiltersStore + store: WalletStores.RootStore } Separator {