mirror of
https://github.com/status-im/status-desktop.git
synced 2025-01-23 21:11:55 +00:00
87d3dcb113
The duplicate permission detection was not working because the channel selection cannot be dirty when the channel selector is disabled.
303 lines
11 KiB
QML
303 lines
11 KiB
QML
import QtQuick 2.15
|
|
import QtQuick.Controls 2.15
|
|
|
|
import AppLayouts.Communities.controls 1.0
|
|
import AppLayouts.Communities.layouts 1.0
|
|
import AppLayouts.Communities.views 1.0
|
|
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Controls 0.1
|
|
import StatusQ.Core.Utils 0.1
|
|
|
|
import utils 1.0
|
|
import shared.popups 1.0
|
|
|
|
StackView {
|
|
id: root
|
|
|
|
required property var permissionsModel
|
|
required property var assetsModel
|
|
required property var collectiblesModel
|
|
required property var channelsModel
|
|
property bool showChannelSelector: true
|
|
property alias initialPage: initialItem
|
|
|
|
// id, name, image, color, owner properties expected
|
|
required property var communityDetails
|
|
|
|
property int viewWidth: 560 // by design
|
|
property string previousPageName: depth > 1 ? qsTr("Permissions") : ""
|
|
|
|
signal createPermissionRequested(int permissionType, var holdings,
|
|
var channels, bool isPrivate)
|
|
signal updatePermissionRequested(string key, int permissionType,
|
|
var holdings, var channels, bool isPrivate)
|
|
signal removePermissionRequested(string key)
|
|
signal navigateToMintTokenSettings(bool isAssetType)
|
|
|
|
function navigateBack() {
|
|
if (depth === 2 && currentItem.toast.active)
|
|
currentItem.toast.notifyDirty()
|
|
else
|
|
pop(StackView.Immediate)
|
|
}
|
|
|
|
function pushEditView(properties) {
|
|
root.push(newPermissionView, properties, StackView.Immediate);
|
|
}
|
|
|
|
// Community Permissions possible view contents:
|
|
initialItem: SettingsPage {
|
|
id: initialItem
|
|
implicitWidth: 0
|
|
|
|
title: qsTr("Permissions")
|
|
|
|
buttons: StatusButton {
|
|
objectName: "addNewItemButton"
|
|
|
|
text: qsTr("Add new permission")
|
|
|
|
onClicked: root.push(newPermissionView, StackView.Immediate)
|
|
}
|
|
|
|
contentItem: StatusScrollView {
|
|
contentHeight: (permissionsView.height + topPadding)
|
|
topPadding: permissionsView.topPadding
|
|
padding: 0
|
|
PermissionsView {
|
|
id: permissionsView
|
|
permissionsModel: root.permissionsModel
|
|
assetsModel: root.assetsModel
|
|
collectiblesModel: root.collectiblesModel
|
|
channelsModel: root.channelsModel
|
|
communityDetails: root.communityDetails
|
|
|
|
viewWidth: root.viewWidth
|
|
|
|
onEditPermissionRequested: {
|
|
const item = ModelUtils.get(root.permissionsModel, index)
|
|
|
|
const properties = {
|
|
permissionKeyToEdit: item.key,
|
|
holdingsToEditModel: item.holdingsListModel,
|
|
channelsToEditModel: item.channelsListModel,
|
|
permissionTypeToEdit: item.permissionType,
|
|
isPrivateToEditValue: item.isPrivate
|
|
}
|
|
|
|
root.pushEditView(properties);
|
|
}
|
|
|
|
onDuplicatePermissionRequested: {
|
|
const item = ModelUtils.get(root.permissionsModel, index)
|
|
|
|
const properties = {
|
|
holdingsToEditModel: item.holdingsListModel,
|
|
channelsToEditModel: item.channelsListModel,
|
|
permissionTypeToEdit: item.permissionType,
|
|
isPrivateToEditValue: item.isPrivate
|
|
}
|
|
|
|
root.pushEditView(properties);
|
|
}
|
|
|
|
onRemovePermissionRequested: {
|
|
const key = ModelUtils.get(root.permissionsModel, index, "key")
|
|
root.removePermissionRequested(key)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: newPermissionView
|
|
|
|
SettingsPage {
|
|
id: newPermissionViewPage
|
|
implicitWidth: 0
|
|
title: isEditState ? qsTr("Edit permission") : qsTr("New permission")
|
|
|
|
property alias isSaveEnabled: editPermissionView.saveEnabled
|
|
property alias isPrivateToEditValue: editPermissionView.isPrivate
|
|
property alias permissionTypeToEdit: editPermissionView.permissionType
|
|
property alias holdingsToEditModel: editPermissionView.selectedHoldingsModel
|
|
property alias channelsToEditModel: editPermissionView.selectedChannelsModel
|
|
|
|
property bool holdingsRequired: editPermissionView.dirtyValues.holdingsRequired
|
|
|
|
property string permissionKeyToEdit
|
|
readonly property bool isEditState: !!permissionKeyToEdit
|
|
|
|
readonly property alias toast: settingsDirtyToastMessage
|
|
|
|
function resetChanges() {
|
|
editPermissionView.resetChanges();
|
|
}
|
|
function updatePermission() {
|
|
editPermissionView.saveChanges();
|
|
}
|
|
function createPermission() {
|
|
editPermissionView.createPermissionClicked();
|
|
}
|
|
|
|
contentItem: EditPermissionView {
|
|
id: editPermissionView
|
|
|
|
viewWidth: root.viewWidth
|
|
|
|
assetsModel: root.assetsModel
|
|
collectiblesModel: root.collectiblesModel
|
|
channelsModel: root.channelsModel
|
|
communityDetails: root.communityDetails
|
|
showChannelSelector: root.showChannelSelector
|
|
isEditState: newPermissionViewPage.isEditState
|
|
holdingsRequired: selectedHoldingsModel
|
|
? selectedHoldingsModel.count > 0 : false
|
|
|
|
permissionDuplicated: {
|
|
// dependencies
|
|
holdingsTracker.revision
|
|
channelsTracker.revision
|
|
editPermissionView.dirtyValues.permissionType
|
|
editPermissionView.dirtyValues.isPrivate
|
|
const model = root.permissionsModel
|
|
const count = model.rowCount()
|
|
|
|
for (let i = 0; i < count; i++) {
|
|
const item = ModelUtils.get(model, i)
|
|
|
|
if (newPermissionViewPage.permissionKeyToEdit === item.key)
|
|
continue
|
|
|
|
const holdings = item.holdingsListModel
|
|
const channels = item.channelsListModel
|
|
const permissionType = item.permissionType
|
|
|
|
const same = (a, b) => ModelUtils.checkEqualitySet(a, b, ["key"])
|
|
|
|
if (holdings.rowCount() === 0)
|
|
if (dirtyValues.holdingsRequired)
|
|
continue
|
|
else
|
|
return true
|
|
|
|
if (holdings.rowCount() !== 0 && !dirtyValues.holdingsRequired)
|
|
continue
|
|
|
|
const channelsModel = showChannelSelector ?
|
|
dirtyValues.selectedChannelsModel :
|
|
selectedChannelsModel
|
|
|
|
if (same(dirtyValues.selectedHoldingsModel, holdings)
|
|
&& same(channelsModel, channels)
|
|
&& dirtyValues.permissionType === permissionType)
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
permissionTypeLimitReached: {
|
|
const type = dirtyValues.permissionType
|
|
const limit = PermissionTypes.getPermissionsCountLimit(type)
|
|
|
|
if (limit === -1)
|
|
return false
|
|
|
|
const model = root.permissionsModel
|
|
const count = model.rowCount()
|
|
let sameTypeCount = 0
|
|
|
|
for (let i = 0; i < count; i++)
|
|
if (type === ModelUtils.get(model, i, "permissionType"))
|
|
sameTypeCount++
|
|
|
|
return limit <= sameTypeCount
|
|
}
|
|
|
|
onCreatePermissionClicked: {
|
|
const holdings = dirtyValues.holdingsRequired ?
|
|
ModelUtils.modelToArray(
|
|
dirtyValues.selectedHoldingsModel,
|
|
["key", "type", "amount"]) : []
|
|
|
|
const channels = root.showChannelSelector ?
|
|
ModelUtils.modelToArray(
|
|
dirtyValues.selectedChannelsModel, ["key"]) :
|
|
ModelUtils.modelToArray(selectedChannelsModel, ["key"])
|
|
|
|
root.createPermissionRequested(
|
|
dirtyValues.permissionType, holdings, channels,
|
|
dirtyValues.isPrivate)
|
|
|
|
if (root.showChannelSelector) {
|
|
root.pop(StackView.Immediate)
|
|
}
|
|
}
|
|
|
|
onNavigateToMintTokenSettings: root.navigateToMintTokenSettings(isAssetType)
|
|
|
|
function saveChanges() {
|
|
const holdings = dirtyValues.holdingsRequired ?
|
|
ModelUtils.modelToArray(
|
|
dirtyValues.selectedHoldingsModel,
|
|
["key", "type", "amount"])
|
|
: []
|
|
|
|
const channels = ModelUtils.modelToArray(
|
|
dirtyValues.selectedChannelsModel, ["key"])
|
|
|
|
root.updatePermissionRequested(
|
|
newPermissionViewPage.permissionKeyToEdit,
|
|
dirtyValues.permissionType, holdings, channels,
|
|
dirtyValues.isPrivate)
|
|
}
|
|
|
|
ModelChangeTracker {
|
|
id: holdingsTracker
|
|
|
|
model: editPermissionView.dirtyValues.selectedHoldingsModel
|
|
}
|
|
|
|
ModelChangeTracker {
|
|
id: channelsTracker
|
|
|
|
model: editPermissionView.dirtyValues.selectedChannelsModel
|
|
}
|
|
}
|
|
|
|
SettingsDirtyToastMessage {
|
|
id: settingsDirtyToastMessage
|
|
|
|
z: 1
|
|
anchors {
|
|
bottom: parent.bottom
|
|
horizontalCenter: parent.horizontalCenter
|
|
bottomMargin: 16
|
|
}
|
|
|
|
saveChangesText: qsTr("Update permission")
|
|
cancelChangesText: qsTr("Revert changes")
|
|
|
|
saveChangesButtonEnabled: editPermissionView.saveEnabled
|
|
|
|
onSaveChangesClicked: {
|
|
editPermissionView.saveChanges()
|
|
root.pop(StackView.Immediate)
|
|
}
|
|
|
|
onResetChangesClicked: editPermissionView.resetChanges()
|
|
|
|
Component.onCompleted: {
|
|
// delay to avoid toast blinking on entry
|
|
settingsDirtyToastMessage.active = Qt.binding(
|
|
() => editPermissionView.isEditState &&
|
|
editPermissionView.dirty &&
|
|
root.showChannelSelector)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|