2022-06-09 15:27:14 +00:00
|
|
|
|
import QtQuick 2.14
|
2023-01-17 12:22:28 +00:00
|
|
|
|
import QtQuick.Controls 2.14
|
2022-06-09 15:27:14 +00:00
|
|
|
|
import QtQuick.Layouts 1.14
|
|
|
|
|
|
|
|
|
|
import StatusQ.Core 0.1
|
|
|
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
|
import StatusQ.Components 0.1
|
|
|
|
|
import StatusQ.Controls 0.1
|
2022-11-25 17:35:30 +00:00
|
|
|
|
import StatusQ.Core.Utils 0.1
|
2022-06-09 15:27:14 +00:00
|
|
|
|
|
2022-12-06 11:19:20 +00:00
|
|
|
|
import AppLayouts.Chat.helpers 1.0
|
2022-06-09 15:27:14 +00:00
|
|
|
|
import utils 1.0
|
|
|
|
|
import shared.panels 1.0
|
|
|
|
|
|
2022-09-07 09:40:25 +00:00
|
|
|
|
import SortFilterProxyModel 0.2
|
|
|
|
|
|
2023-01-17 12:22:28 +00:00
|
|
|
|
import AppLayouts.Chat.panels.communities 1.0
|
2022-12-06 11:19:20 +00:00
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
import "../../../Chat/controls/community"
|
|
|
|
|
|
2022-12-13 13:09:38 +00:00
|
|
|
|
StatusScrollView {
|
2022-06-09 15:27:14 +00:00
|
|
|
|
id: root
|
|
|
|
|
|
2022-12-20 00:54:50 +00:00
|
|
|
|
property var rootStore
|
2022-11-25 17:35:30 +00:00
|
|
|
|
property var store
|
2022-12-20 00:54:50 +00:00
|
|
|
|
|
2022-11-25 17:35:30 +00:00
|
|
|
|
property int viewWidth: 560 // by design
|
2022-11-24 16:23:54 +00:00
|
|
|
|
property bool isEditState: false
|
2023-02-08 10:13:16 +00:00
|
|
|
|
readonly property bool dirty: {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
const trick = d.triggerDirtyTool // Trick: Used to force the reevaluation of dirty when an item of the list is updated
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
|
|
|
|
// Holdings:
|
2023-01-27 09:22:04 +00:00
|
|
|
|
if (d.checkIfHoldingsDirty())
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
// Channels
|
|
|
|
|
if (d.checkIfInDirty())
|
|
|
|
|
return true
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
|
|
|
|
// Permissions:
|
|
|
|
|
let dirtyPermissionObj = false
|
|
|
|
|
if(root.permissionObject && d.dirtyValues.permissionObject.key !== null) {
|
|
|
|
|
dirtyPermissionObj = (d.dirtyValues.permissionObject.key !== root.permissionObject.key) ||
|
|
|
|
|
(d.dirtyValues.permissionObject.text !== root.permissionObject.text) ||
|
|
|
|
|
(d.dirtyValues.permissionObject.imageSource !== root.permissionObject.imageSource)
|
2023-01-27 09:22:04 +00:00
|
|
|
|
} else {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
dirtyPermissionObj = d.dirtyValues.permissionObject.key !== null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
return dirtyPermissionObj || d.dirtyValues.isPrivateDirty
|
2022-11-24 16:23:54 +00:00
|
|
|
|
}
|
2023-02-08 10:13:16 +00:00
|
|
|
|
|
|
|
|
|
function saveChanges() {
|
|
|
|
|
d.saveChanges()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resetChanges() {
|
|
|
|
|
d.loadInitValues()
|
|
|
|
|
}
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
|
|
|
|
property int permissionIndex
|
|
|
|
|
|
2023-01-12 11:31:08 +00:00
|
|
|
|
// roles: type, key, name, amount, imageSource
|
2022-11-24 16:23:54 +00:00
|
|
|
|
property var holdingsModel: ListModel {}
|
|
|
|
|
|
|
|
|
|
// roles: key, text, imageSource
|
|
|
|
|
property var permissionObject
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
// roles: itemId, text, emoji, color
|
2022-11-24 16:23:54 +00:00
|
|
|
|
property var channelsModel: ListModel {}
|
|
|
|
|
|
|
|
|
|
property bool isPrivate
|
2022-08-23 08:46:37 +00:00
|
|
|
|
|
2022-11-25 17:35:30 +00:00
|
|
|
|
signal permissionCreated()
|
2022-08-23 08:46:37 +00:00
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
QtObject {
|
|
|
|
|
id: d
|
2022-12-20 00:54:50 +00:00
|
|
|
|
|
2023-01-19 17:36:06 +00:00
|
|
|
|
readonly property int maxHoldingsItems: 5
|
|
|
|
|
|
2022-12-20 00:54:50 +00:00
|
|
|
|
readonly property int dropdownHorizontalOffset: 4
|
|
|
|
|
readonly property int dropdownVerticalOffset: 1
|
|
|
|
|
|
2022-09-09 22:09:37 +00:00
|
|
|
|
property int permissionType: PermissionTypes.Type.None
|
2023-01-20 11:15:05 +00:00
|
|
|
|
|
|
|
|
|
readonly property bool isCommunityPermission:
|
|
|
|
|
permissionType === PermissionTypes.Type.Admin ||
|
|
|
|
|
permissionType === PermissionTypes.Type.Member
|
|
|
|
|
|
2023-01-20 11:22:04 +00:00
|
|
|
|
onPermissionTypeChanged: {
|
|
|
|
|
if (permissionType === PermissionTypes.Type.Admin) {
|
|
|
|
|
d.dirtyValues.isPrivateDirty = (root.isPrivate === false)
|
|
|
|
|
} else {
|
|
|
|
|
if (permissionType === PermissionTypes.Type.Moderator) {
|
|
|
|
|
d.dirtyValues.isPrivateDirty = (root.isPrivate === false)
|
|
|
|
|
} else {
|
|
|
|
|
d.dirtyValues.isPrivateDirty = (root.isPrivate === true)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-20 11:15:05 +00:00
|
|
|
|
onIsCommunityPermissionChanged: {
|
|
|
|
|
if (isCommunityPermission) {
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.dirtyValues.channelsModel.clear()
|
2023-01-20 11:15:05 +00:00
|
|
|
|
inSelector.wholeCommunitySelected = true
|
|
|
|
|
inSelector.itemsModel = inModelCommunity
|
|
|
|
|
} else {
|
|
|
|
|
inSelector.itemsModel = 0
|
|
|
|
|
inSelector.wholeCommunitySelected = false
|
2023-01-27 09:22:04 +00:00
|
|
|
|
inSelector.itemsModel = d.dirtyValues.channelsModel
|
2023-01-20 11:15:05 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
// Trick: Used to force the reevaluation of dirty when an item of the list is updated
|
|
|
|
|
property int triggerDirtyTool: 0
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
|
|
|
|
property QtObject dirtyValues: QtObject {
|
|
|
|
|
property ListModel holdingsModel: ListModel {}
|
2023-01-27 09:22:04 +00:00
|
|
|
|
property ListModel channelsModel: ListModel {}
|
|
|
|
|
|
2022-11-24 16:23:54 +00:00
|
|
|
|
property QtObject permissionObject: QtObject {
|
|
|
|
|
property var key: null
|
|
|
|
|
property string text: ""
|
|
|
|
|
property string imageSource: ""
|
|
|
|
|
}
|
|
|
|
|
property bool isPrivateDirty: false
|
|
|
|
|
|
2023-01-24 21:49:07 +00:00
|
|
|
|
function getIndexOfKey(key) {
|
|
|
|
|
const count = holdingsModel.count
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++)
|
|
|
|
|
if (holdingsModel.get(i).key === key)
|
|
|
|
|
return i
|
|
|
|
|
|
|
|
|
|
return -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getTokenKeysAndAmounts() {
|
|
|
|
|
const keysAndAmounts = []
|
|
|
|
|
const count = holdingsModel.count
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
|
|
|
const item = holdingsModel.get(i)
|
|
|
|
|
|
|
|
|
|
if (item.type === HoldingTypes.Type.Ens)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
keysAndAmounts.push({ key: item.key, amount: item.amount })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return keysAndAmounts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function getEnsNames() {
|
|
|
|
|
const names = []
|
|
|
|
|
const count = holdingsModel.count
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
|
|
|
const item = holdingsModel.get(i)
|
|
|
|
|
|
|
|
|
|
if (item.type !== HoldingTypes.Type.Ens)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
names.push(item.name)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return names
|
|
|
|
|
}
|
|
|
|
|
|
2022-11-24 16:23:54 +00:00
|
|
|
|
// TODO: Channels
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function saveChanges() {
|
|
|
|
|
|
|
|
|
|
root.store.editPermission(root.permissionIndex,
|
|
|
|
|
d.dirtyValues.holdingsModel,
|
|
|
|
|
d.dirtyValues.permissionObject,
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.dirtyValues.channelsModel,
|
2022-11-24 16:23:54 +00:00
|
|
|
|
d.dirtyValues.isPrivateDirty ? !root.isPrivate : root.isPrivate)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function loadInitValues() {
|
|
|
|
|
// Holdings:
|
|
|
|
|
d.dirtyValues.holdingsModel.clear()
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
|
|
|
|
if (root.holdingsModel) {
|
|
|
|
|
for (let i = 0; i < root.holdingsModel.count; i++) {
|
|
|
|
|
const item = root.holdingsModel.get(i)
|
|
|
|
|
|
|
|
|
|
const initItem = {
|
|
|
|
|
type: item.type,
|
|
|
|
|
key: item.key,
|
|
|
|
|
name: item.name,
|
|
|
|
|
amount: item.amount,
|
|
|
|
|
imageSource: item.imageSource
|
2022-11-24 16:23:54 +00:00
|
|
|
|
}
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
|
|
|
|
if (item.shortName)
|
|
|
|
|
initItem.shortName = item.shortName
|
|
|
|
|
|
2022-11-24 16:23:54 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.append(initItem)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Permissions:
|
|
|
|
|
d.dirtyValues.permissionObject.key = root.permissionObject ? root.permissionObject.key : null
|
|
|
|
|
d.dirtyValues.permissionObject.text = root.permissionObject ? root.permissionObject.text : ""
|
|
|
|
|
d.dirtyValues.permissionObject.imageSource = root.permissionObject ? root.permissionObject.imageSource : ""
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.permissionType = root.permissionObject ? root.permissionObject.key : PermissionTypes.Type.None
|
|
|
|
|
|
|
|
|
|
// Channels
|
|
|
|
|
d.dirtyValues.channelsModel.clear()
|
|
|
|
|
|
|
|
|
|
if (root.channelsModel) {
|
|
|
|
|
for (let c = 0; c < root.channelsModel.count; c++) {
|
|
|
|
|
const item = root.channelsModel.get(c)
|
|
|
|
|
|
|
|
|
|
const initItem = {
|
|
|
|
|
itemId: item.itemId,
|
|
|
|
|
text: item.text,
|
|
|
|
|
emoji: item.emoji,
|
|
|
|
|
color: item.color,
|
|
|
|
|
operator: OperatorsUtils.Operators.None
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
d.dirtyValues.channelsModel.append(initItem)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (root.channelsModel && (root.channelsModel.count || d.dirtyValues.permissionObject.key === null)) {
|
|
|
|
|
inSelector.wholeCommunitySelected = false
|
|
|
|
|
inSelector.itemsModel = d.dirtyValues.channelsModel
|
|
|
|
|
} else {
|
|
|
|
|
inSelector.wholeCommunitySelected = true
|
|
|
|
|
inSelector.itemsModel = inModelCommunity
|
|
|
|
|
}
|
2022-11-24 16:23:54 +00:00
|
|
|
|
|
|
|
|
|
// Is private permission
|
|
|
|
|
d.dirtyValues.isPrivateDirty = false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function checkIfHoldingsDirty() {
|
2023-01-27 09:22:04 +00:00
|
|
|
|
if (!root.holdingsModel)
|
|
|
|
|
return d.dirtyValues.holdingsModel.count !== 0
|
|
|
|
|
|
|
|
|
|
if (root.holdingsModel.count !== d.dirtyValues.holdingsModel.count)
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
// Check element by element
|
|
|
|
|
const count = root.holdingsModel.count
|
|
|
|
|
let equals = 0
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
|
|
|
const item1 = root.holdingsModel.get(i)
|
|
|
|
|
|
|
|
|
|
for (let j = 0; j < count; j++) {
|
|
|
|
|
const item2 = d.dirtyValues.holdingsModel.get(j)
|
|
|
|
|
|
|
|
|
|
if (item1.key === item2.key
|
|
|
|
|
&& item1.name === item2.name
|
|
|
|
|
&& item1.shortName === item2.shortName
|
|
|
|
|
&& item1.amount === item2.amount) {
|
|
|
|
|
equals++
|
2022-11-24 16:23:54 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
|
|
|
|
return equals !== count
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function checkIfInDirty() {
|
|
|
|
|
if (!root.channelsModel)
|
|
|
|
|
return d.dirtyValues.channelsModel.count !== 0
|
|
|
|
|
|
|
|
|
|
if (root.channelsModel.count !== d.dirtyValues.channelsModel.count)
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
const count = root.channelsModel.count
|
|
|
|
|
let equals = 0
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
|
|
|
const item1 = root.channelsModel.get(i)
|
|
|
|
|
|
|
|
|
|
for (let j = 0; j < count; j++) {
|
|
|
|
|
const item2 = d.dirtyValues.channelsModel.get(j)
|
|
|
|
|
|
|
|
|
|
if (item1.itemId === item2.itemId
|
|
|
|
|
&& item1.text === item2.text
|
|
|
|
|
&& item1.emoji === item2.emoji
|
|
|
|
|
&& item1.color === item2.color) {
|
|
|
|
|
equals++
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-11-24 16:23:54 +00:00
|
|
|
|
}
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
|
|
|
|
return equals !== count
|
2022-11-24 16:23:54 +00:00
|
|
|
|
}
|
2023-01-18 19:54:14 +00:00
|
|
|
|
|
|
|
|
|
function holdingsTextFormat(type, name, amount) {
|
|
|
|
|
return CommunityPermissionsHelpers.setHoldingsTextFormat(type, name, amount)
|
|
|
|
|
}
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
contentWidth: mainLayout.width
|
|
|
|
|
contentHeight: mainLayout.height
|
|
|
|
|
|
2022-11-24 16:23:54 +00:00
|
|
|
|
onPermissionObjectChanged: d.loadInitValues()
|
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
ColumnLayout {
|
|
|
|
|
id: mainLayout
|
2022-11-25 17:35:30 +00:00
|
|
|
|
width: root.viewWidth
|
2022-06-09 15:27:14 +00:00
|
|
|
|
spacing: 0
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
CurveSeparatorWithText {
|
|
|
|
|
Layout.alignment: Qt.AlignLeft
|
|
|
|
|
Layout.leftMargin: 14
|
|
|
|
|
text: qsTr("Anyone")
|
|
|
|
|
}
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
StatusItemSelector {
|
|
|
|
|
id: tokensSelector
|
2023-01-18 19:54:14 +00:00
|
|
|
|
|
2023-01-24 21:49:07 +00:00
|
|
|
|
property int editedIndex: -1
|
2023-01-18 19:54:14 +00:00
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
icon: Style.svg("contact_verified")
|
|
|
|
|
title: qsTr("Who holds")
|
|
|
|
|
defaultItemText: qsTr("Example: 10 SNT")
|
2022-12-21 13:59:43 +00:00
|
|
|
|
tagLeftPadding: 2
|
|
|
|
|
asset.height: 28
|
|
|
|
|
asset.width: asset.height
|
2023-01-19 17:36:06 +00:00
|
|
|
|
addButton.visible: itemsModel.count < d.maxHoldingsItems
|
2022-09-07 09:40:25 +00:00
|
|
|
|
itemsModel: SortFilterProxyModel {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
sourceModel: d.dirtyValues.holdingsModel
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
proxyRoles: [
|
|
|
|
|
ExpressionRole {
|
|
|
|
|
name: "text"
|
|
|
|
|
// Direct call for singleton function is not handled properly by SortFilterProxyModel that's why `holdingsTextFormat` is used instead.
|
|
|
|
|
expression: d.holdingsTextFormat(model.type, model.name, model.amount)
|
|
|
|
|
},
|
|
|
|
|
ExpressionRole {
|
|
|
|
|
name: "operator"
|
|
|
|
|
|
|
|
|
|
// Direct call for singleton enum is not handled properly by SortFilterProxyModel.
|
|
|
|
|
readonly property int none: OperatorsUtils.Operators.None
|
|
|
|
|
|
|
|
|
|
expression: none
|
|
|
|
|
}
|
|
|
|
|
]
|
2022-09-07 09:40:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HoldingsDropdown {
|
2022-06-09 15:27:14 +00:00
|
|
|
|
id: dropdown
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
2022-08-23 08:46:37 +00:00
|
|
|
|
store: root.store
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
2023-01-12 11:31:08 +00:00
|
|
|
|
function addItem(type, item, amount) {
|
2022-09-07 09:40:25 +00:00
|
|
|
|
const key = item.key
|
2022-11-25 17:35:30 +00:00
|
|
|
|
const name = item.shortName ? item.shortName : item.name
|
2022-09-07 09:40:25 +00:00
|
|
|
|
const imageSource = item.iconSource.toString()
|
|
|
|
|
|
2023-01-12 11:31:08 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.append({ type, key, name, amount, imageSource })
|
2022-09-07 09:40:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-24 21:49:07 +00:00
|
|
|
|
function prepareUpdateIndex(key) {
|
|
|
|
|
const itemIndex = tokensSelector.editedIndex
|
|
|
|
|
const existingIndex = d.dirtyValues.getIndexOfKey(key)
|
|
|
|
|
|
|
|
|
|
if (itemIndex !== -1 && existingIndex !== -1 && itemIndex !== existingIndex) {
|
|
|
|
|
const previousKey = d.dirtyValues.holdingsModel.get(itemIndex).key
|
|
|
|
|
d.dirtyValues.holdingsModel.remove(existingIndex)
|
|
|
|
|
return d.dirtyValues.getIndexOfKey(previousKey)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (itemIndex === -1) {
|
|
|
|
|
return existingIndex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return itemIndex
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onOpened: {
|
|
|
|
|
usedTokens = d.dirtyValues.getTokenKeysAndAmounts()
|
|
|
|
|
usedEnsNames = d.dirtyValues.getEnsNames().filter(item => item !== ensDomainName)
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-12 13:18:52 +00:00
|
|
|
|
onAddAsset: {
|
2023-01-18 19:54:14 +00:00
|
|
|
|
const modelItem = CommunityPermissionsHelpers.getTokenByKey(store.assetsModel, key)
|
2023-01-12 13:18:52 +00:00
|
|
|
|
addItem(HoldingTypes.Type.Asset, modelItem, amount)
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onAddCollectible: {
|
2023-01-18 19:54:14 +00:00
|
|
|
|
const modelItem = CommunityPermissionsHelpers.getTokenByKey(store.collectiblesModel, key)
|
2023-01-12 11:31:08 +00:00
|
|
|
|
addItem(HoldingTypes.Type.Collectible, modelItem, amount)
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onAddEns: {
|
2023-01-24 21:49:07 +00:00
|
|
|
|
const key = "ENS_" + domain
|
2023-01-17 22:56:58 +00:00
|
|
|
|
const icon = Style.svg("profile/ensUsernames")
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
2023-01-17 23:03:08 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.append({type: HoldingTypes.Type.Ens, key, name: domain, amount: 1, imageSource: icon })
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
|
2023-01-12 13:18:52 +00:00
|
|
|
|
onUpdateAsset: {
|
2023-01-24 21:49:07 +00:00
|
|
|
|
const itemIndex = prepareUpdateIndex(key)
|
|
|
|
|
|
2023-01-18 19:54:14 +00:00
|
|
|
|
const modelItem = CommunityPermissionsHelpers.getTokenByKey(store.assetsModel, key)
|
2022-11-25 17:35:30 +00:00
|
|
|
|
const name = modelItem.shortName ? modelItem.shortName : modelItem.name
|
2022-09-07 09:40:25 +00:00
|
|
|
|
const imageSource = modelItem.iconSource.toString()
|
|
|
|
|
|
2023-01-24 21:49:07 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.set(itemIndex, { type: HoldingTypes.Type.Asset, key, name, amount, imageSource })
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.triggerDirtyTool++
|
2022-06-09 15:27:14 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
|
|
|
|
onUpdateCollectible: {
|
2023-01-24 21:49:07 +00:00
|
|
|
|
const itemIndex = prepareUpdateIndex(key)
|
|
|
|
|
|
2023-01-18 19:54:14 +00:00
|
|
|
|
const modelItem = CommunityPermissionsHelpers.getTokenByKey(store.collectiblesModel, key)
|
2022-09-07 09:40:25 +00:00
|
|
|
|
const name = modelItem.name
|
|
|
|
|
const imageSource = modelItem.iconSource.toString()
|
|
|
|
|
|
2023-01-24 21:49:07 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.set(itemIndex, { type: HoldingTypes.Type.Collectible, key, name, amount, imageSource })
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.triggerDirtyTool++
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onUpdateEns: {
|
2023-01-24 21:49:07 +00:00
|
|
|
|
const key = "ENS_" + domain
|
2023-01-17 22:56:58 +00:00
|
|
|
|
const icon = Style.svg("profile/ensUsernames")
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
2023-01-17 23:03:08 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.set(tokensSelector.editedIndex, { type: HoldingTypes.Type.Ens, key, name: domain, amount: 1, imageSource: icon })
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.triggerDirtyTool++
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onRemoveClicked: {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
d.dirtyValues.holdingsModel.remove(tokensSelector.editedIndex)
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.close()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addButton.onClicked: {
|
|
|
|
|
dropdown.parent = tokensSelector.addButton
|
2022-12-20 00:54:50 +00:00
|
|
|
|
dropdown.x = tokensSelector.addButton.width + d.dropdownHorizontalOffset
|
2022-09-07 09:40:25 +00:00
|
|
|
|
dropdown.y = 0
|
2023-01-18 19:54:14 +00:00
|
|
|
|
dropdown.open()
|
2023-01-24 21:49:07 +00:00
|
|
|
|
|
|
|
|
|
editedIndex = -1
|
2022-09-07 09:40:25 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onItemClicked: {
|
|
|
|
|
if (mouse.button !== Qt.LeftButton)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
dropdown.parent = item
|
2022-12-20 00:54:50 +00:00
|
|
|
|
dropdown.x = mouse.x + d.dropdownHorizontalOffset
|
|
|
|
|
dropdown.y = d.dropdownVerticalOffset
|
2022-09-07 09:40:25 +00:00
|
|
|
|
|
|
|
|
|
const modelItem = tokensSelector.itemsModel.get(index)
|
|
|
|
|
|
|
|
|
|
switch(modelItem.type) {
|
2023-01-12 13:18:52 +00:00
|
|
|
|
case HoldingTypes.Type.Asset:
|
|
|
|
|
dropdown.assetKey = modelItem.key
|
|
|
|
|
dropdown.assetAmount = modelItem.amount
|
2022-09-07 09:40:25 +00:00
|
|
|
|
break
|
|
|
|
|
case HoldingTypes.Type.Collectible:
|
|
|
|
|
dropdown.collectibleKey = modelItem.key
|
|
|
|
|
dropdown.collectibleAmount = modelItem.amount
|
|
|
|
|
break
|
|
|
|
|
case HoldingTypes.Type.Ens:
|
|
|
|
|
dropdown.ensDomainName = modelItem.name
|
|
|
|
|
break
|
|
|
|
|
default:
|
|
|
|
|
console.warn("Unsupported holdings type.")
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-15 10:12:38 +00:00
|
|
|
|
dropdown.setActiveTab(modelItem.type)
|
2023-01-18 19:54:14 +00:00
|
|
|
|
dropdown.openUpdateFlow()
|
2022-09-15 10:12:38 +00:00
|
|
|
|
|
2022-09-07 09:40:25 +00:00
|
|
|
|
editedIndex = index
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Rectangle {
|
|
|
|
|
Layout.leftMargin: 16
|
|
|
|
|
Layout.preferredWidth: 2
|
|
|
|
|
Layout.preferredHeight: 24
|
|
|
|
|
color: Style.current.separator
|
|
|
|
|
}
|
|
|
|
|
StatusItemSelector {
|
2022-09-09 22:09:37 +00:00
|
|
|
|
id: permissionsSelector
|
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
icon: Style.svg("profile/security")
|
|
|
|
|
iconSize: 24
|
2022-09-09 22:09:37 +00:00
|
|
|
|
useIcons: true
|
2022-06-09 15:27:14 +00:00
|
|
|
|
title: qsTr("Is allowed to")
|
|
|
|
|
defaultItemText: qsTr("Example: View and post")
|
2022-11-24 16:23:54 +00:00
|
|
|
|
itemsModel: d.dirtyValues.permissionObject.key ? d.dirtyValues.permissionObject : null
|
2022-09-09 22:09:37 +00:00
|
|
|
|
|
2022-11-24 16:23:54 +00:00
|
|
|
|
addButton.visible: !root.permissionObject
|
2022-09-09 22:09:37 +00:00
|
|
|
|
|
|
|
|
|
PermissionsDropdown {
|
|
|
|
|
id: permissionsDropdown
|
|
|
|
|
|
|
|
|
|
initialPermissionType: d.permissionType
|
2023-01-20 11:22:04 +00:00
|
|
|
|
enableAdminPermission: root.store.isOwner
|
2022-09-09 22:09:37 +00:00
|
|
|
|
|
|
|
|
|
onDone: {
|
2023-01-20 11:15:05 +00:00
|
|
|
|
if (d.permissionType === permissionType) {
|
|
|
|
|
permissionsDropdown.close()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-09 22:09:37 +00:00
|
|
|
|
d.permissionType = permissionType
|
2022-11-24 16:23:54 +00:00
|
|
|
|
d.dirtyValues.permissionObject.key = permissionType
|
|
|
|
|
d.dirtyValues.permissionObject.text = title
|
|
|
|
|
d.dirtyValues.permissionObject.imageSource = asset
|
2022-09-09 22:09:37 +00:00
|
|
|
|
permissionsDropdown.close()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addButton.onClicked: {
|
|
|
|
|
permissionsDropdown.mode = PermissionsDropdown.Mode.Add
|
|
|
|
|
permissionsDropdown.parent = permissionsSelector.addButton
|
2022-12-20 00:54:50 +00:00
|
|
|
|
permissionsDropdown.x = permissionsSelector.addButton.width
|
|
|
|
|
+ d.dropdownHorizontalOffset
|
2022-09-09 22:09:37 +00:00
|
|
|
|
permissionsDropdown.y = 0
|
|
|
|
|
permissionsDropdown.open()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onItemClicked: {
|
|
|
|
|
if (mouse.button !== Qt.LeftButton)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
permissionsDropdown.mode = PermissionsDropdown.Mode.Update
|
|
|
|
|
permissionsDropdown.parent = item
|
2022-12-20 00:54:50 +00:00
|
|
|
|
permissionsDropdown.x = mouse.x + d.dropdownHorizontalOffset
|
|
|
|
|
permissionsDropdown.y = d.dropdownVerticalOffset
|
2022-09-09 22:09:37 +00:00
|
|
|
|
permissionsDropdown.open()
|
|
|
|
|
}
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
Rectangle {
|
|
|
|
|
Layout.leftMargin: 16
|
|
|
|
|
Layout.preferredWidth: 2
|
|
|
|
|
Layout.preferredHeight: 24
|
|
|
|
|
color: Style.current.separator
|
|
|
|
|
}
|
|
|
|
|
StatusItemSelector {
|
2022-12-20 00:54:50 +00:00
|
|
|
|
id: inSelector
|
|
|
|
|
|
2023-01-20 11:15:05 +00:00
|
|
|
|
readonly property bool editable: !d.isCommunityPermission
|
|
|
|
|
|
|
|
|
|
addButton.visible: editable
|
|
|
|
|
itemsClickable: editable
|
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
Layout.fillWidth: true
|
2023-01-20 11:15:05 +00:00
|
|
|
|
icon: d.isCommunityPermission ? Style.svg("communities") : Style.svg("create-category")
|
2022-06-09 15:27:14 +00:00
|
|
|
|
iconSize: 24
|
|
|
|
|
title: qsTr("In")
|
|
|
|
|
defaultItemText: qsTr("Example: `#general` channel")
|
2022-12-20 00:54:50 +00:00
|
|
|
|
|
|
|
|
|
useLetterIdenticons: !wholeCommunitySelected || !inDropdown.communityImage
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
tagLeftPadding: wholeCommunitySelected ? 2 : 6
|
|
|
|
|
asset.width: wholeCommunitySelected ? 28 : 20
|
|
|
|
|
asset.height: asset.width
|
|
|
|
|
|
2022-12-20 00:54:50 +00:00
|
|
|
|
property bool wholeCommunitySelected: false
|
|
|
|
|
|
2023-01-20 11:15:05 +00:00
|
|
|
|
function openInDropdown(parent, x, y) {
|
|
|
|
|
inDropdown.parent = parent
|
|
|
|
|
inDropdown.x = x
|
|
|
|
|
inDropdown.y = y
|
|
|
|
|
|
|
|
|
|
const selectedChannels = []
|
|
|
|
|
|
|
|
|
|
if (!inSelector.wholeCommunitySelected)
|
2023-01-27 09:22:04 +00:00
|
|
|
|
for (let i = 0; i < d.dirtyValues.channelsModel.count; i++)
|
|
|
|
|
selectedChannels.push(d.dirtyValues.channelsModel.get(i).itemId)
|
2023-01-20 11:15:05 +00:00
|
|
|
|
|
|
|
|
|
inDropdown.setSelectedChannels(selectedChannels)
|
|
|
|
|
inDropdown.open()
|
|
|
|
|
}
|
|
|
|
|
|
2022-12-20 00:54:50 +00:00
|
|
|
|
ListModel {
|
|
|
|
|
id: inModelCommunity
|
|
|
|
|
|
|
|
|
|
readonly property string colorWorkaround: inDropdown.communityData.color
|
|
|
|
|
|
|
|
|
|
Component.onCompleted: {
|
|
|
|
|
append({
|
|
|
|
|
imageSource: inDropdown.communityData.image,
|
|
|
|
|
text: inDropdown.communityData.name,
|
2023-01-27 09:22:04 +00:00
|
|
|
|
operator: OperatorsUtils.Operators.None,
|
|
|
|
|
color: ""
|
2022-12-20 00:54:50 +00:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
setProperty(0, "color", colorWorkaround)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
InDropdown {
|
|
|
|
|
id: inDropdown
|
|
|
|
|
|
|
|
|
|
model: root.rootStore.chatCommunitySectionModule.model
|
|
|
|
|
|
|
|
|
|
readonly property var communityData: rootStore.mainModuleInst.activeSection
|
|
|
|
|
|
|
|
|
|
communityName: communityData.name
|
|
|
|
|
communityImage: communityData.image
|
|
|
|
|
communityColor: communityData.color
|
|
|
|
|
|
|
|
|
|
onChannelsSelected: {
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.dirtyValues.channelsModel.clear()
|
2022-12-20 00:54:50 +00:00
|
|
|
|
inSelector.itemsModel = 0
|
|
|
|
|
inSelector.wholeCommunitySelected = false
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
channels.forEach(channel => {
|
|
|
|
|
d.dirtyValues.channelsModel.append({
|
2022-12-20 00:54:50 +00:00
|
|
|
|
itemId: channel.itemId,
|
|
|
|
|
text: "#" + channel.name,
|
|
|
|
|
emoji: channel.emoji,
|
|
|
|
|
color: channel.color,
|
|
|
|
|
operator: OperatorsUtils.Operators.None
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2023-01-27 09:22:04 +00:00
|
|
|
|
inSelector.itemsModel = d.dirtyValues.channelsModel
|
2022-12-20 00:54:50 +00:00
|
|
|
|
close()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onCommunitySelected: {
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.dirtyValues.channelsModel.clear()
|
2022-12-20 00:54:50 +00:00
|
|
|
|
inSelector.wholeCommunitySelected = true
|
|
|
|
|
inSelector.itemsModel = inModelCommunity
|
|
|
|
|
close()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addButton.onClicked: {
|
|
|
|
|
inDropdown.acceptMode = InDropdown.AcceptMode.Add
|
|
|
|
|
openInDropdown(inSelector.addButton,
|
|
|
|
|
inSelector.addButton.width + d.dropdownHorizontalOffset, 0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onItemClicked: {
|
|
|
|
|
if (mouse.button !== Qt.LeftButton)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
inDropdown.acceptMode = InDropdown.AcceptMode.Update
|
|
|
|
|
openInDropdown(item, mouse.x + d.dropdownHorizontalOffset,
|
|
|
|
|
d.dropdownVerticalOffset)
|
|
|
|
|
}
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
Separator {
|
|
|
|
|
Layout.topMargin: 24
|
|
|
|
|
}
|
|
|
|
|
RowLayout {
|
|
|
|
|
Layout.topMargin: 12
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
Layout.leftMargin: 16
|
|
|
|
|
Layout.rightMargin: Layout.leftMargin
|
|
|
|
|
spacing: 16
|
|
|
|
|
StatusRoundIcon {
|
2022-08-11 11:55:08 +00:00
|
|
|
|
asset.name: "hide"
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
ColumnLayout {
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
StatusBaseText {
|
2023-01-20 11:22:04 +00:00
|
|
|
|
text: qsTr("Hide permission")
|
2022-06-09 15:27:14 +00:00
|
|
|
|
color: Theme.palette.directColor1
|
|
|
|
|
font.pixelSize: 15
|
|
|
|
|
}
|
|
|
|
|
StatusBaseText {
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
Layout.fillHeight: true
|
2023-01-20 11:22:04 +00:00
|
|
|
|
text: qsTr("Make this permission hidden from members who don’t meet it’s requirements")
|
2022-06-09 15:27:14 +00:00
|
|
|
|
color: Theme.palette.baseColor1
|
|
|
|
|
font.pixelSize: 15
|
|
|
|
|
lineHeight: 1.2
|
|
|
|
|
wrapMode: Text.WordWrap
|
|
|
|
|
elide: Text.ElideRight
|
|
|
|
|
clip: true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
StatusSwitch {
|
2023-01-20 11:22:04 +00:00
|
|
|
|
enabled: d.permissionType !== PermissionTypes.Type.Admin
|
2022-11-24 16:23:54 +00:00
|
|
|
|
checked: d.dirtyValues.isPrivateDirty ? !root.isPrivate : root.isPrivate
|
|
|
|
|
onToggled: d.dirtyValues.isPrivateDirty = (root.isPrivate !== checked)
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-01-17 12:22:28 +00:00
|
|
|
|
|
2023-01-23 15:50:34 +00:00
|
|
|
|
PermissionConflictWarningPanel{
|
|
|
|
|
id: conflictPanel
|
2023-01-27 09:22:04 +00:00
|
|
|
|
|
2023-01-23 15:50:34 +00:00
|
|
|
|
visible: store.permissionConflict.exists
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
Layout.topMargin: 50 // by desing
|
|
|
|
|
holdings: store.permissionConflict.holdings
|
|
|
|
|
permissions: store.permissionConflict.permissions
|
|
|
|
|
channels: store.permissionConflict.channels
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-09 15:27:14 +00:00
|
|
|
|
StatusButton {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
visible: !root.isEditState
|
2023-01-23 15:50:34 +00:00
|
|
|
|
Layout.topMargin: conflictPanel.visible ? conflictPanel.Layout.topMargin : 24 // by design
|
2022-06-09 15:27:14 +00:00
|
|
|
|
text: qsTr("Create permission")
|
2023-01-27 09:22:04 +00:00
|
|
|
|
enabled: d.dirtyValues.holdingsModel.count > 0
|
|
|
|
|
&& d.dirtyValues.permissionObject.key !== null
|
|
|
|
|
&& (d.dirtyValues.channelsModel.count > 0 || d.isCommunityPermission)
|
2022-06-09 15:27:14 +00:00
|
|
|
|
Layout.preferredHeight: 44
|
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
|
Layout.fillWidth: true
|
2022-08-23 08:46:37 +00:00
|
|
|
|
onClicked: {
|
2022-11-24 16:23:54 +00:00
|
|
|
|
root.store.createPermission(d.dirtyValues.holdingsModel,
|
|
|
|
|
d.dirtyValues.permissionObject,
|
|
|
|
|
d.dirtyValues.isPrivateDirty ? !root.isPrivate : root.isPrivate,
|
2023-01-27 09:22:04 +00:00
|
|
|
|
d.dirtyValues.channelsModel)
|
2022-11-25 17:35:30 +00:00
|
|
|
|
root.permissionCreated()
|
2022-08-23 08:46:37 +00:00
|
|
|
|
}
|
2022-06-09 15:27:14 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|