diff --git a/ui/StatusQ/include/StatusQ/permissionutilsinternal.h b/ui/StatusQ/include/StatusQ/permissionutilsinternal.h index 47fa028090..cab9226a3c 100644 --- a/ui/StatusQ/include/StatusQ/permissionutilsinternal.h +++ b/ui/StatusQ/include/StatusQ/permissionutilsinternal.h @@ -16,6 +16,8 @@ class PermissionUtilsInternal : public QObject public: explicit PermissionUtilsInternal(QObject* parent = nullptr); + Q_INVOKABLE QVariantMap getTokenByKey(QAbstractItemModel *model, const QVariant& keyValue) const; + //!< traverse the permissions @p model, and look for unique token keys recursively under holdingsListModel->key Q_INVOKABLE QStringList getUniquePermissionTokenKeys(QAbstractItemModel *model, int type) const; diff --git a/ui/StatusQ/src/permissionutilsinternal.cpp b/ui/StatusQ/src/permissionutilsinternal.cpp index 46be477a32..9a7bad9672 100644 --- a/ui/StatusQ/src/permissionutilsinternal.cpp +++ b/ui/StatusQ/src/permissionutilsinternal.cpp @@ -194,3 +194,36 @@ int /*PermissionTypes::Type*/ PermissionUtilsInternal::isEligibleToJoinAs(QAbstr return PermissionTypes::Type::None; } + +QVariantMap PermissionUtilsInternal::getTokenByKey(QAbstractItemModel *model, + const QVariant &keyValue) const +{ + if (!model) + return {}; + + const auto roles = model->roleNames(); + const auto keyRole = roles.key(QByteArrayLiteral("key"), -1); + const auto subItemsRole = roles.key(QByteArrayLiteral("subItems"), -1); + + const auto count = model->rowCount(); + for (int i = 0; i < count; i++) { + const auto modelIndex = model->index(i, 0); + if (keyRole != -1 && modelIndex.data(keyRole) == keyValue) { + QVariantMap result; + for (auto it = roles.cbegin(); it != roles.cend(); ++it) + result.insert(it.value(), modelIndex.data(it.key())); + return result; + } + + if (subItemsRole != -1) { + const auto subItemModel = qvariant_cast(modelIndex.data(subItemsRole)); + if (subItemModel) { + const auto subItem = getTokenByKey(subItemModel, keyValue); + if (!subItem.isEmpty()) + return subItem; + } + } + } + + return {}; +} diff --git a/ui/app/AppLayouts/Communities/helpers/PermissionsHelpers.qml b/ui/app/AppLayouts/Communities/helpers/PermissionsHelpers.qml index e72c3b4398..39cb7906d0 100644 --- a/ui/app/AppLayouts/Communities/helpers/PermissionsHelpers.qml +++ b/ui/app/AppLayouts/Communities/helpers/PermissionsHelpers.qml @@ -12,26 +12,7 @@ import utils 1.0 QtObject { function getTokenByKey(model, key) { - if (!model) - return null - - const count = model.rowCount() - - for (let i = 0; i < count; i++) { - const item = ModelUtils.get(model, i) - - if (item.key === key) - return item - - if (item.subItems) { - const subitem = getTokenByKey(item.subItems, key) - - if (subitem !== null) - return subitem - } - } - - return null + return Internal.PermissionUtils.getTokenByKey(model, key) } function getTokenNameByKey(model, key) { diff --git a/ui/app/AppLayouts/Communities/panels/SharedAddressesPermissionsPanel.qml b/ui/app/AppLayouts/Communities/panels/SharedAddressesPermissionsPanel.qml index 0204c1d986..555427b693 100644 --- a/ui/app/AppLayouts/Communities/panels/SharedAddressesPermissionsPanel.qml +++ b/ui/app/AppLayouts/Communities/panels/SharedAddressesPermissionsPanel.qml @@ -53,7 +53,7 @@ Rectangle { readonly property bool lostPermissionToJoin: root.isEditMode && joinPermissionsModel.count && !joinPermissionPanel.tokenCriteriaMet readonly property var uniquePermissionChannels: - root.permissionsModel && root.permissionsModel.count ? + d.channelsPermissionsModel.count ? PermissionsHelpers.getUniquePermissionChannels(root.permissionsModel, [PermissionTypes.Type.Read, PermissionTypes.Type.ViewAndPost]) : [] @@ -74,51 +74,102 @@ Rectangle { readonly property var tokenMasterPermissionsModel: SortFilterProxyModel { id: tokenMasterPermissionsModel sourceModel: root.permissionsModel - function filterPredicate(permissionType, tokenCriteriaMet) { - return (permissionType === Constants.permissionType.becomeTokenMaster) && tokenCriteriaMet - } - filters: FastExpressionFilter { - expression: tokenMasterPermissionsModel.filterPredicate(model.permissionType, model.tokenCriteriaMet) - expectedRoles: ["permissionType", "tokenCriteriaMet"] - } + filters: [ + ValueFilter { + roleName: "permissionType" + value: Constants.permissionType.becomeTokenMaster + }, + ValueFilter { + roleName: "tokenCriteriaMet" + value: true + } + ] } readonly property var adminPermissionsModel: SortFilterProxyModel { id: adminPermissionsModel sourceModel: root.permissionsModel - function filterPredicate(permissionType, tokenCriteriaMet, isPrivate) { - return (permissionType === Constants.permissionType.admin) && - (!isPrivate || (tokenCriteriaMet && isPrivate)) // visible or (hidden & met) - } - filters: FastExpressionFilter { - expression: adminPermissionsModel.filterPredicate(model.permissionType, model.tokenCriteriaMet, model.isPrivate) - expectedRoles: ["permissionType", "tokenCriteriaMet", "isPrivate"] - } + filters: [ + ValueFilter { + roleName: "permissionType" + value: Constants.permissionType.admin + }, + AnyOf { + ValueFilter { + roleName: "isPrivate" + value: false + } + AllOf { + ValueFilter { + roleName: "tokenCriteriaMet" + value: true + } + ValueFilter { + roleName: "isPrivate" + value: true + } + } + } + ] } readonly property var joinPermissionsModel: SortFilterProxyModel { id: joinPermissionsModel sourceModel: root.permissionsModel - function filterPredicate(permissionType, tokenCriteriaMet, isPrivate) { - return (permissionType === Constants.permissionType.member) && - (!isPrivate || (tokenCriteriaMet && isPrivate)) // visible or (hidden & met) - } - filters: FastExpressionFilter { - expression: joinPermissionsModel.filterPredicate(model.permissionType, model.tokenCriteriaMet, model.isPrivate) - expectedRoles: ["permissionType", "tokenCriteriaMet", "isPrivate"] - } + filters: [ + ValueFilter { + roleName: "permissionType" + value: Constants.permissionType.member + }, + AnyOf { + ValueFilter { + roleName: "isPrivate" + value: false + } + AllOf { + ValueFilter { + roleName: "tokenCriteriaMet" + value: true + } + ValueFilter { + roleName: "isPrivate" + value: true + } + } + } + ] } // used to check if there are any visible channel permissions readonly property var channelsPermissionsModel: SortFilterProxyModel { id: channelsPermissionsModel sourceModel: root.permissionsModel - function filterPredicate(permissionType, tokenCriteriaMet, isPrivate) { - return (permissionType === Constants.permissionType.read || permissionType === Constants.permissionType.viewAndPost) && - (!isPrivate || (tokenCriteriaMet && isPrivate)) // visible or (hidden & met) - } - filters: FastExpressionFilter { - expression: channelsPermissionsModel.filterPredicate(model.permissionType, model.tokenCriteriaMet, model.isPrivate) - expectedRoles: ["permissionType", "tokenCriteriaMet", "isPrivate"] - } + filters: [ + AnyOf { + ValueFilter { + roleName: "permissionType" + value: Constants.permissionType.read + } + ValueFilter { + roleName: "permissionType" + value: Constants.permissionType.viewAndPost + } + }, + AnyOf { + ValueFilter { + roleName: "isPrivate" + value: false + } + AllOf { + ValueFilter { + roleName: "tokenCriteriaMet" + value: true + } + ValueFilter { + roleName: "isPrivate" + value: true + } + } + } + ] } } @@ -277,7 +328,7 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter font.pixelSize: Theme.tertiaryTextFontSize text: model.text - color: model.available ? Theme.palette.successColor1 : Theme.palette.directColor1 + color: model.available ? Theme.palette.successColor1 : Theme.palette.baseColor1 } } } @@ -488,17 +539,22 @@ Rectangle { model: SortFilterProxyModel { id: channelPermissionsModel - sourceModel: root.permissionsModel - function filterPredicate(permissionType, tokenCriteriaMet, isPrivate, channelsListModel) { - return permissionType === channelPermsSubPanel.permissionType && - (!isPrivate || (tokenCriteriaMet && isPrivate)) && - ModelUtils.contains(channelsListModel, "key", channelPermsPanel.channelKey) // filter and group by channel "key" - } - filters: FastExpressionFilter { - expression: channelPermissionsModel.filterPredicate(model.permissionType, model.tokenCriteriaMet, - model.isPrivate, model.channelsListModel) - expectedRoles: ["permissionType", "tokenCriteriaMet", "isPrivate", "channelsListModel"] + sourceModel: d.channelsPermissionsModel + + function filterPredicate(channelsListModel) { + return ModelUtils.contains(channelsListModel, "key", channelPermsPanel.channelKey) } + + filters: [ + ValueFilter { + roleName: "permissionType" + value: channelPermsSubPanel.permissionType + }, + FastExpressionFilter { + expression: channelPermissionsModel.filterPredicate(model.channelsListModel) // filter and group by channel "key" + expectedRoles: ["channelsListModel"] + } + ] } delegate: ColumnLayout { Layout.column: 0 diff --git a/ui/app/AppLayouts/Communities/views/HoldingsSelectionModel.qml b/ui/app/AppLayouts/Communities/views/HoldingsSelectionModel.qml index 7c344bc272..3154613976 100644 --- a/ui/app/AppLayouts/Communities/views/HoldingsSelectionModel.qml +++ b/ui/app/AppLayouts/Communities/views/HoldingsSelectionModel.qml @@ -25,29 +25,26 @@ SortFilterProxyModel { FastExpressionRole { name: "text" - function getName(type, key) { + function getName(type, item, key) { if (type === Constants.TokenType.ENS) return key + return item ? item.symbol || item.shortName || item.name : "" + } + function getDecimals(type, item) { + if (type !== Constants.TokenType.ERC20) + return 0 + return item.decimals + } + + function getText(type, key, amount) { const model = type === Constants.TokenType.ERC20 ? assetsModel : collectiblesModel const item = PermissionsHelpers.getTokenByKey(model, key) - return item ? item.symbol || item.shortName || item.name : "" - } - - function getDecimals(type, key) { - if (type !== Constants.TokenType.ERC20) { - return 0 - } - const item = PermissionsHelpers.getTokenByKey(assetsModel, key) - return item.decimals - } - - function getText(type, key, amount) { - const name = getName(type, key) - const decimals = getDecimals(type, key) + const name = getName(type, item, key) + const decimals = getDecimals(type, item) return PermissionsHelpers.setHoldingsTextFormat( type, name, amount, decimals) @@ -89,7 +86,6 @@ SortFilterProxyModel { readonly property int none: OperatorsUtils.Operators.None expression: none - expectedRoles: [] } ] }