/** * @RDE_HEADER@ * ExerciseManagement - Exercise Edit Party Dialog * $Id$ * $HeadURL$ * $Author$ * Created by Christian Ehrlicher, SLSE, 2016-02-29 */ #include "exm_edit_party_dialog.h" #include "ui_exm_edit_party_dialog.h" #include #include #include #include #include #include #include #include #include #include namespace ExerciseManagement { ExerciseEditPartyDialog::ExerciseEditPartyDialog(const int operatorId, const int exerciseId, const QString &menuGroup, QWidget *parent) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel) , m_operatorId(operatorId) , m_exerciseId(exerciseId) , m_visiblePartiesChanged(false) , m_adlerVisiblePartiesChanged(false) , m_menuGroup(menuGroup) , m_visiblePartiesModel(nullptr) , m_adlerVisiblePartiesModel(nullptr) , m_opmDtc(nullptr) , m_opmFtc(nullptr) , m_ui(new Ui::ExerciseEditPartyDialog) , m_logger(getLogger("exerciseEditPartyDialog")) , m_requestHelper(new LtsUtils::RequestHelper(this)) { setNoTopicLock(); m_ui->setupUi(this); setOnlineHelpFilename(QStringLiteral("Administrator-Operator-Parties")); } bool ExerciseEditPartyDialog::init(LtsSession::LtsSessionDataDds *session) { if (!session->getDtc(m_opmDtc)) return false; if (!session->getFtc(m_opmFtc)) return false; m_visiblePartiesModel = new ExerciseEditVisiblePartiesModel(m_operatorId, m_exerciseId, this); if (!m_visiblePartiesModel->init(session)) return false; m_ui->tvVisibleParties->setModel(m_visiblePartiesModel); m_ui->tvVisibleParties->resizeColumnsToContent(); m_ui->tvVisibleParties->setSortIndicator(ExerciseEditVisiblePartiesModel::Columns::ColId, Qt::SortOrder::AscendingOrder); m_ui->tvVisibleParties->setSortingEnabled(false); m_adlerVisiblePartiesModel = new ExerciseEditAdlerVisiblePartiesModel(m_operatorId, m_exerciseId, this); if (!m_adlerVisiblePartiesModel->init(session)) return false; m_ui->tvAdlerVisibleParties->setModel(m_adlerVisiblePartiesModel); m_ui->tvAdlerVisibleParties->resizeColumnsToContent(); m_ui->tvAdlerVisibleParties->setSortIndicator(ExerciseEditAdlerVisiblePartiesModel::Columns::ColId, Qt::SortOrder::AscendingOrder); m_ui->tvAdlerVisibleParties->setSortingEnabled(false); #ifndef LTS_DEBUG m_ui->tvVisibleParties->hideColumn(ExerciseEditVisiblePartiesModel::Columns::ColId); m_ui->tvAdlerVisibleParties->hideColumn(ExerciseEditVisiblePartiesModel::Columns::ColId); #endif connect(m_ui->tvVisibleParties, &LtsDataView::LtsDataView::doubleClicked, m_visiblePartiesModel, &ExerciseEditVisiblePartiesModel::switchCheckbox); connect(m_ui->tvAdlerVisibleParties, &LtsDataView::LtsDataView::doubleClicked, this, &ExerciseEditPartyDialog::onDoubleClicked); connect(m_visiblePartiesModel, &ExerciseEditVisiblePartiesModel::dataChanged, this, [this](const QModelIndex &index) { m_visiblePartiesChanged = true; slotChangesMade(); onSwitchCheckbox(index);}); connect(m_adlerVisiblePartiesModel, &ExerciseEditAdlerVisiblePartiesModel::dataChanged, this, [this]() { m_adlerVisiblePartiesChanged = true; slotChangesMade();}); #ifdef LTS_DEBUG m_ui->tvVisibleParties->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_ui->tvVisibleParties, &LtsDataView::LtsDataView::customContextMenuRequested, this, &ExerciseEditPartyDialog::onContextMenuRequested); #endif setAdlerVisiblePartiesUncheckable(); return true; } bool ExerciseEditPartyDialog::operatorUpdateVisiblePartiesByExercise(const OperatorManagement::OperatorUpdateVisiblePartiesByExerciseRequest &req) { DEBUG_LOG(m_logger) << LOGFUNCTION; return m_requestHelper->startSingleRequest([this, req]() { return m_opmFtc->operatorUpdateVisiblePartiesByExerciseRequest(req, this); }); } ExerciseEditPartyDialog::~ExerciseEditPartyDialog() { delete m_ui; } void ExerciseEditPartyDialog::retranslate() { translate(m_ui, m_opmDtc->user(m_operatorId), tr("EX:%1 Operator ").arg(m_exerciseId)); } QByteArray ExerciseEditPartyDialog::adlerVisiblePartiesToJson() const { QJsonArray adlerVisiblePartiesArray; QJsonObject adlerVisiblePartiesObject; // pool and support are in the list (always available); adlerVisiblePartiesArray.append(0); // pool adlerVisiblePartiesArray.append(1); // O/C Service; const QVector &checkedParties = m_adlerVisiblePartiesModel->getCheckedIds(); for (const int id : checkedParties) adlerVisiblePartiesArray.append(id); adlerVisiblePartiesObject[QStringLiteral("adlerAllowed")] = adlerVisiblePartiesArray; QJsonDocument adlerVisiblePartiesDocument(adlerVisiblePartiesObject); return adlerVisiblePartiesDocument.toJson(QJsonDocument::Compact); } void ExerciseEditPartyDialog::setAdlerVisiblePartiesUncheckable() { const QVector &uncheckedParties = m_visiblePartiesModel->getUncheckedIds(); QVector rowIds; for (const int id : uncheckedParties) { int rowId = m_adlerVisiblePartiesModel->findRowForPartyId(id); if (rowId < 0) continue; rowIds.append(rowId); } m_adlerVisiblePartiesModel->setUncheckedPartyIds(rowIds); } //Private Slots bool ExerciseEditPartyDialog::apply() { DEBUG_LOG(m_logger) << LOGFUNCTION; if (m_operatorId <= 0) // user not exists return true; //updateData OperatorManagement::OperatorUpdateVisiblePartiesByExerciseRequest req; req.id(m_operatorId); req.exerciseId(m_exerciseId); if (!m_visiblePartiesChanged && !m_adlerVisiblePartiesChanged) return false; QSet visiblePartyIds = m_visiblePartiesModel->getCheckedIds().toList().toSet(); // check if pool and support are in the list (always available); visiblePartyIds.insert(0); // pool visiblePartyIds.insert(1); // O/C Service; const QVector hiddenPartyIds = m_visiblePartiesModel->getUncheckedIds(); for (const int visible : visiblePartyIds) DEBUG_LOG(m_logger) << "visible party: " << visible; for (const int hidden : hiddenPartyIds) DEBUG_LOG(m_logger) << "hidden party: " << hidden; req.hiddenParties().set({}); req.visibleParties().set({}); std::copy(hiddenPartyIds.begin(), hiddenPartyIds.end(), std::back_inserter(req.hiddenParties().get())); std::copy(visiblePartyIds.begin(), visiblePartyIds.end(), std::back_inserter(req.visibleParties().get())); req.properties(adlerVisiblePartiesToJson().toStdString()); DEBUG_LOG(m_logger) << "----------------- opId: " << req.id() << ", exId:" << req.exerciseId() << ", req.hiddenParties.size:" << hiddenPartyIds.size() << "adlerVisibleParties: " << req.properties(); return operatorUpdateVisiblePartiesByExercise(req); } void ExerciseEditPartyDialog::onContextMenuRequested(const QPoint &position) { QMenu menu(m_ui->tvVisibleParties); menu.addAction(tr("Select All"), this, &ExerciseEditPartyDialog::onSelectAllParties); menu.addAction(tr("Unselect All"), this, &ExerciseEditPartyDialog::onUnselectAllParties); menu.exec(m_ui->tvVisibleParties->mapToGlobal(position)); } void ExerciseEditPartyDialog::onSelectAllParties() { m_visiblePartiesModel->selectAll(); m_visiblePartiesModel->update(); } void ExerciseEditPartyDialog::onUnselectAllParties() { m_visiblePartiesModel->unselectAll(); m_visiblePartiesModel->update(); } void ExerciseEditPartyDialog::onSwitchCheckbox(const QModelIndex &index) { if (!index.isValid()) { return; } DEBUG_LOG(m_logger) << LOGFUNCTION << "index.row():" << index.row(); const QPair row = m_visiblePartiesModel->getRowData(index.row()); QPair rowAdler = m_adlerVisiblePartiesModel->getRowData(index.row()); rowAdler.first = row.first; setAdlerVisiblePartiesUncheckable(); m_adlerVisiblePartiesModel->setRowData(index.row(), rowAdler); } void ExerciseEditPartyDialog::onDoubleClicked(const QModelIndex &index) { if (!index.isValid()) { return; } DEBUG_LOG(m_logger) << LOGFUNCTION << "index.row():" << index.row(); // if the party is not checked, you can not get this one for ADLER bool isChecked = m_visiblePartiesModel->getRowData(index.row()).first; if (!isChecked) return; QPair row = m_adlerVisiblePartiesModel->getRowData(index.row()); row.first = !row.first; m_adlerVisiblePartiesModel->setRowData(index.row(), row); } }