chore(MembersDropdown): Search behavior adjusted

This commit is contained in:
Michał Cieślak 2023-05-11 12:44:47 +02:00 committed by Michał
parent c290562ce1
commit 6fcb533b68
3 changed files with 54 additions and 43 deletions

View File

@ -152,12 +152,8 @@ SplitView {
} }
expression: { expression: {
membersDropdown.selectedKeys
membersDropdown.searchText membersDropdown.searchText
if (membersDropdown.selectedKeys.indexOf(model.pubKey) > -1)
return true
const filter = membersDropdown.searchText.toLowerCase() const filter = membersDropdown.searchText.toLowerCase()
return matchesAlias(model.alias.toLowerCase(), filter) return matchesAlias(model.alias.toLowerCase(), filter)
|| model.displayName.toLowerCase().includes(filter) || model.displayName.toLowerCase().includes(filter)
@ -175,7 +171,7 @@ SplitView {
onAddButtonClicked: { onAddButtonClicked: {
logs.logEvent("MembersDropdown::addButtonClicked, keys: " logs.logEvent("MembersDropdown::addButtonClicked, keys: "
+ membersDropdown.selectedKeys) + [...membersDropdown.selectedKeys])
} }
Component.onCompleted: open() Component.onCompleted: open()
@ -185,7 +181,7 @@ SplitView {
LogsAndControlsPanel { LogsAndControlsPanel {
SplitView.minimumHeight: 100 SplitView.minimumHeight: 100
SplitView.preferredHeight: 250 SplitView.preferredHeight: 320
logsView.logText: logs.logText logsView.logText: logs.logText
@ -343,7 +339,7 @@ SplitView {
Label { Label {
Layout.fillWidth: true Layout.fillWidth: true
text: `selected members: ${membersDropdown.selectedKeys}` text: `selected members: ${[...membersDropdown.selectedKeys]}`
wrapMode: Label.Wrap wrapMode: Label.Wrap
} }
} }

View File

@ -13,7 +13,7 @@ import shared.controls.delegates 1.0
StatusDropdown { StatusDropdown {
id: root id: root
property var selectedKeys: [] property var selectedKeys: new Set()
property bool forceButtonDisabled: false property bool forceButtonDisabled: false
property int maximumListHeight: 288 property int maximumListHeight: 288
@ -28,6 +28,33 @@ StatusDropdown {
Add, Update Add, Update
} }
Instantiator {
id: selectionChecker
model: root.model
property var keys: []
delegate: QtObject {
readonly property string key: model.pubKey
}
readonly property bool allSelected:
keys.every(key => root.selectedKeys.has(key))
onObjectAdded: {
const keysCopy = [...keys]
keysCopy.splice(index, 0, object.key)
keys = keysCopy
}
onObjectRemoved: {
const keysCopy = [...keys]
keysCopy.splice(index, 1)
keys = keysCopy
}
}
property int mode: MembersDropdown.Mode.Add property int mode: MembersDropdown.Mode.Add
signal backButtonClicked signal backButtonClicked
@ -145,7 +172,7 @@ StatusDropdown {
text: qsTr("Select all") text: qsTr("Select all")
font.weight: Font.Medium font.weight: Font.Medium
checked: root.selectedKeys.length === listView.count checked: selectionChecker.allSelected
leftSide: false leftSide: false
size: StatusCheckBox.Size.Small size: StatusCheckBox.Size.Small
@ -156,20 +183,15 @@ StatusDropdown {
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
onClicked: { onClicked: {
if (listView.headerItem.checked) { const currentKeys = selectionChecker.keys
root.selectedKeys = [] const keysSet = new Set([...root.selectedKeys])
return
}
const count = root.model.rowCount() if (listView.headerItem.checked)
const keys = [] currentKeys.forEach(key => keysSet.delete(key))
else
currentKeys.forEach(key => keysSet.add(key))
for (let i = 0; i < count; i++) { root.selectedKeys = keysSet
const key = ModelUtils.get(root.model, i, "pubKey")
keys.push(key)
}
root.selectedKeys = keys
} }
} }
} }
@ -188,14 +210,12 @@ StatusDropdown {
color: "transparent" color: "transparent"
onClicked: { onClicked: {
const index = root.selectedKeys.indexOf(model.pubKey) const selectedKeysCopy = new Set([...root.selectedKeys])
const selectedKeysCopy = Object.assign(
[], root.selectedKeys)
if (index === -1) if (root.selectedKeys.has(model.pubKey))
selectedKeysCopy.push(model.pubKey) selectedKeysCopy.delete(model.pubKey)
else else
selectedKeysCopy.splice(index, 1) selectedKeysCopy.add(model.pubKey)
root.selectedKeys = selectedKeysCopy root.selectedKeys = selectedKeysCopy
} }
@ -205,7 +225,7 @@ StatusDropdown {
id: contactCheckbox id: contactCheckbox
size: StatusCheckBox.Size.Small size: StatusCheckBox.Size.Small
checked: root.selectedKeys.indexOf(model.pubKey) > -1 checked: root.selectedKeys.has(model.pubKey)
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
@ -246,7 +266,7 @@ StatusDropdown {
return false return false
if (root.mode === MembersDropdown.Mode.Add) if (root.mode === MembersDropdown.Mode.Add)
return root.selectedKeys.length > 0 return root.selectedKeys.size > 0
return true return true
} }
@ -255,8 +275,8 @@ StatusDropdown {
if (root.mode === MembersDropdown.Mode.Update) if (root.mode === MembersDropdown.Mode.Update)
return qsTr("Update members") return qsTr("Update members")
return root.selectedKeys.length > 0 return root.selectedKeys.size > 0
? qsTr("Add %n member(s)", "", root.selectedKeys.length) ? qsTr("Add %n member(s)", "", root.selectedKeys.size)
: qsTr("Add") : qsTr("Add")
} }

View File

@ -244,18 +244,17 @@ StatusScrollView {
filters: ExpressionFilter { filters: ExpressionFilter {
id: selectedKeysFilter id: selectedKeysFilter
property var keys: [] property var keys: new Set()
expression: keys.indexOf(model.pubKey) !== -1 expression: keys.has(model.pubKey)
} }
} }
onRemoveMemberRequested: { onRemoveMemberRequested: {
const pubKey = ModelUtils.get(membersModel, index, "pubKey") const pubKey = ModelUtils.get(membersModel, index, "pubKey")
const keyIndex = selectedKeysFilter.keys.indexOf(pubKey)
selectedKeysFilter.keys.splice(keyIndex, 1) selectedKeysFilter.keys.delete(pubKey)
selectedKeysFilter.keys = selectedKeysFilter.keys selectedKeysFilter.keys = new Set([...selectedKeysFilter.keys])
} }
onAddAddressesRequested: (addresses_) => { onAddAddressesRequested: (addresses_) => {
@ -309,7 +308,7 @@ StatusScrollView {
recipientTypeSelectionDropdown.close() recipientTypeSelectionDropdown.close()
membersDropdown.selectedKeys = selectedKeysFilter.keys membersDropdown.selectedKeys = selectedKeysFilter.keys
const hasSelection = selectedKeysFilter.keys.length !== 0 const hasSelection = selectedKeysFilter.keys.size !== 0
membersDropdown.mode = hasSelection membersDropdown.mode = hasSelection
? MembersDropdown.Mode.Update ? MembersDropdown.Mode.Update
@ -324,7 +323,7 @@ StatusScrollView {
forceButtonDisabled: forceButtonDisabled:
mode === MembersDropdown.Mode.Update && mode === MembersDropdown.Mode.Update &&
JSON.stringify(selectedKeys) === JSON.stringify(selectedKeysFilter.keys) [...selectedKeys].sort().join() === [...selectedKeysFilter.keys].sort().join()
model: SortFilterProxyModel { model: SortFilterProxyModel {
sourceModel: membersModel sourceModel: membersModel
@ -338,12 +337,8 @@ StatusScrollView {
} }
expression: { expression: {
membersDropdown.selectedKeys
membersDropdown.searchText membersDropdown.searchText
if (membersDropdown.selectedKeys.indexOf(model.pubKey) > -1)
return true
const filter = membersDropdown.searchText.toLowerCase() const filter = membersDropdown.searchText.toLowerCase()
return matchesAlias(model.alias.toLowerCase(), filter) return matchesAlias(model.alias.toLowerCase(), filter)
|| model.displayName.toLowerCase().includes(filter) || model.displayName.toLowerCase().includes(filter)
@ -394,7 +389,7 @@ StatusScrollView {
const addresses_ = ModelUtils.modelToArray( const addresses_ = ModelUtils.modelToArray(
addresses, ["address"]).map(e => e.address) addresses, ["address"]).map(e => e.address)
const pubKeys = selectedKeysFilter.keys const pubKeys = [...selectedKeysFilter.keys]
root.airdropClicked(airdropTokens, addresses_, pubKeys) root.airdropClicked(airdropTokens, addresses_, pubKeys)
} }