File indexing completed on 2024-11-10 12:55:20

0001 /*
0002    SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "adminusersmodel.h"
0008 #include "ruqola_debug.h"
0009 #include "utils.h"
0010 #include <KLocalizedString>
0011 
0012 AdminUsersModel::AdminUsersModel(QObject *parent)
0013     : DirectoryUsersModel(parent)
0014 {
0015 }
0016 
0017 AdminUsersModel::~AdminUsersModel() = default;
0018 
0019 Users::ParseType AdminUsersModel::parseType() const
0020 {
0021     return Users::ParseType::Administrator;
0022 }
0023 
0024 void AdminUsersModel::insertElement(const QJsonObject &obj)
0025 {
0026     User user;
0027     const QJsonObject userObj = obj[QLatin1String("user")].toObject();
0028     user.parseUserRestApi(userObj, {});
0029     if (user.isValid()) {
0030         const int numberOfElement = mUsers.count();
0031         mUsers.appendUser(user); // TODO useful ?
0032         beginInsertRows(QModelIndex(), numberOfElement, mUsers.count() - 1);
0033         endInsertRows();
0034         checkFullList(); // TODO verify it
0035     }
0036 }
0037 
0038 void AdminUsersModel::removeElement(const QString &identifier)
0039 {
0040     const int userCount = mUsers.count();
0041     for (int i = 0; i < userCount; ++i) {
0042         if (mUsers.at(i).userId() == identifier) {
0043             beginRemoveRows(QModelIndex(), i, i);
0044             mUsers.takeAt(i);
0045             mUsers.setTotal(mUsers.count()); // Update total
0046             endRemoveRows();
0047             Q_EMIT totalChanged();
0048             break;
0049         }
0050     }
0051 }
0052 
0053 void AdminUsersModel::updateElement(const QJsonObject &userObj)
0054 {
0055     const int roomCount = mUsers.count();
0056     const QJsonObject obj = userObj[QLatin1String("user")].toObject();
0057     const QString identifier{obj.value(QStringLiteral("_id")).toString()};
0058     for (int i = 0; i < roomCount; ++i) {
0059         if (mUsers.at(i).userId() == identifier) {
0060             beginRemoveRows(QModelIndex(), i, i);
0061             mUsers.takeAt(i);
0062             endRemoveRows();
0063             User newUser;
0064             newUser.parseUserRestApi(obj, {} /*, mRocketChatAccount->roleInfo()*/); // TODO necessary ?
0065             beginInsertRows(QModelIndex(), i, i);
0066             mUsers.insertUser(i, newUser);
0067             endInsertRows();
0068             break;
0069         }
0070     }
0071 }
0072 
0073 bool AdminUsersModel::setData(const QModelIndex &id, const QVariant &value, int role)
0074 {
0075     if (!id.isValid()) {
0076         qCWarning(RUQOLA_LOG) << "ERROR: invalid index";
0077         return false;
0078     }
0079     const int idx = id.row();
0080     User &user = mUsers[idx];
0081     switch (role) {
0082     case AdminUsersRoles::ActiveUser: {
0083         user.setActive(value.toBool());
0084         const QModelIndex newIndex = index(id.row(), AdminUsersModel::ActiveUserDisplay);
0085         Q_EMIT dataChanged(newIndex, newIndex);
0086         return true;
0087     }
0088     case AdminUsersRoles::Name:
0089     case AdminUsersRoles::UserName:
0090     case AdminUsersRoles::Email:
0091     case AdminUsersRoles::Roles:
0092     case AdminUsersRoles::Status:
0093     case AdminUsersRoles::UserId:
0094     case AdminUsersRoles::ActiveUserDisplay:
0095     case AdminUsersRoles::Administrator:
0096         return false;
0097     }
0098     return false;
0099 }
0100 
0101 QVariant AdminUsersModel::headerData(int section, Qt::Orientation orientation, int role) const
0102 {
0103     if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
0104         switch (static_cast<AdminUsersRoles>(section)) {
0105         case AdminUsersModel::Name:
0106             return i18n("Name");
0107         case AdminUsersModel::UserName:
0108             return i18n("UserName");
0109         case AdminUsersModel::Email:
0110             return i18n("Email");
0111         case AdminUsersModel::Roles:
0112             return i18n("Role");
0113         case AdminUsersModel::ActiveUserDisplay:
0114             return i18n("Disabled");
0115         case AdminUsersModel::Status:
0116             return i18n("Status");
0117         case AdminUsersModel::UserId:
0118         case AdminUsersModel::ActiveUser:
0119         case AdminUsersRoles::Administrator:
0120             return {};
0121         }
0122     }
0123     return {};
0124 }
0125 
0126 int AdminUsersModel::columnCount(const QModelIndex &parent) const
0127 {
0128     Q_UNUSED(parent)
0129     constexpr int val = static_cast<int>(AdminUsersModel::LastColumn) + 1;
0130     return val;
0131 }
0132 
0133 QList<int> AdminUsersModel::hideColumns() const
0134 {
0135     return {AdminUsersRoles::UserId, AdminUsersRoles::ActiveUser, AdminUsersRoles::Administrator};
0136 }
0137 
0138 QVariant AdminUsersModel::data(const QModelIndex &index, int role) const
0139 {
0140     if (index.row() < 0 || index.row() >= mUsers.count()) {
0141         return {};
0142     }
0143     if (role != Qt::DisplayRole) {
0144         return {};
0145     }
0146 
0147     const User &user = mUsers.at(index.row());
0148     const int col = index.column();
0149     switch (static_cast<AdminUsersRoles>(col)) {
0150     case AdminUsersRoles::Name:
0151         return user.name();
0152     case AdminUsersRoles::UserName:
0153         return user.userName();
0154     case AdminUsersRoles::Email:
0155         return user.userEmailsInfo().email;
0156     case AdminUsersRoles::Roles:
0157         return user.i18nRoles().join(QLatin1Char(','));
0158     case AdminUsersRoles::Status:
0159         return Utils::displaytextFromPresenceStatus(user.status());
0160     case AdminUsersRoles::ActiveUserDisplay:
0161         return user.active() ? i18n("Active") : i18n("Disabled");
0162     case AdminUsersRoles::ActiveUser:
0163         return user.active();
0164     case AdminUsersRoles::UserId:
0165         return user.userId();
0166     case AdminUsersRoles::Administrator:
0167         return user.roles().contains(QStringLiteral("admin"));
0168     }
0169     return {};
0170 }
0171 
0172 #include "moc_adminusersmodel.cpp"