1/* 2 * SPDX-FileCopyrightText: 2021 Dimitris Kardarakos <dimkard@posteo.net> 3 * 4 * SPDX-License-Identifier: GPL-3.0-or-later 5 */ 6 7import QtQuick 2.7 8import QtQuick.Controls 2.5 as Controls2 9import QtQuick.Layouts 1.3 10import org.kde.kirigami 2.14 as Kirigami 11import org.kde.calindori 0.1 as Calindori 12import org.kde.people 1.0 as KPeople 13 14Kirigami.OverlaySheet { 15 id: root 16 17 property var selectedPersons: [] 18 property var preEditEmails: [] 19 20 signal editorCompleted (var selectedUris) 21 22 header: Kirigami.SearchField { 23 id: searchField 24 25 topInset: Kirigami.Units.smallSpacing 26 bottomInset: Kirigami.Units.smallSpacing 27 28 onTextChanged: filterModel.setFilterFixedString(text) 29 } 30 31 32 contentItem: ListView { 33 id: peopleList 34 35 clip: true 36 37 model: KPeople.PersonsSortFilterProxyModel { 38 id: filterModel 39 40 filterCaseSensitivity: Qt.CaseInsensitive 41 requiredProperties: ["email"] 42 43 44 Component.onCompleted: { 45 sourceModel = personsModel 46 sort(0); 47 } 48 } 49 50 Kirigami.PlaceholderMessage { 51 anchors.centerIn: parent 52 icon.name: "user" 53 text: i18n("No contacts found") 54 visible: peopleList.count === 0 55 } 56 57 delegate: Kirigami.DelegateRecycler { 58 sourceComponent: contactListDelegate 59 } 60 61 Component { 62 id: contactListDelegate 63 64 Kirigami.BasicListItem { 65 property var itemEmail: personData && personData.person && personData.person.contactCustomProperty("email") 66 checkable: true 67 enabled: model && root.preEditEmails.indexOf(itemEmail) === -1 68 checked: model && root.selectedPersons && root.selectedPersons.indexOf(model.personUri) >= 0 69 70 onCheckedChanged: { 71 if(!model) { 72 return; 73 } 74 75 if(checked) { 76 var uris = root.selectedPersons; 77 uris.push(model.personUri); 78 root.selectedPersons = uris; 79 } 80 else { 81 var uris = root.selectedPersons; 82 uris.pop(model.personUri); 83 root.selectedPersons = uris; 84 } 85 } 86 87 KPeople.PersonData { 88 id: personData 89 90 personUri: model && model.personUri 91 } 92 93 icon: model && model.decoration 94 label: model && model.display 95 subtitle: itemEmail 96 } 97 } 98 99 KPeople.PersonsModel { 100 id: personsModel 101 } 102 } 103 104 footer: RowLayout { 105 Item { 106 Layout.fillWidth: true 107 } 108 109 Controls2.ToolButton { 110 text: i18n("Add") 111 icon.name: 'contact-new-symbolic' 112 113 enabled: selectedPersons.length > 0 114 115 onClicked: { 116 editorCompleted(root.selectedPersons); 117 root.close(); 118 } 119 } 120 121 Controls2.ToolButton { 122 text: i18n("Cancel") 123 icon.name: 'dialog-cancel' 124 125 onClicked: { 126 root.close(); 127 } 128 } 129 } 130} 131