FOSSredder 0.5.0
Loading...
Searching...
No Matches
WorkspaceSelectors.cpp
Go to the documentation of this file.
1
5
7
8#include <algorithm>
9#include <cstddef>
10#include <vector>
11
16
17namespace ui {
18
19namespace {
20
21template<typename Rows, typename Project>
22QVariantList projectRows(const Rows& rows, Project project) {
23 QVariantList out;
24 out.reserve(static_cast<int>(rows.size()));
25 for (const auto& row : rows) {
26 out.push_back(project(row));
27 }
28 return out;
29}
30
31template<typename Rows>
32bool containsId(const Rows& rows, const QString& id) {
33 const std::string target = strings::toStdString(id.trimmed());
34 if (target.empty()) {
35 return false;
36 }
37 return std::any_of(rows.begin(), rows.end(), [&](const auto& row) {
38 return row.id == target;
39 });
40}
41
42void prependEmptyDropdownRow(QVariantList& rows, const QString& display) {
43 rows.push_front(workspace_payloads::dropdownRow({}, display));
44}
45
46std::vector<std::string> toStdStringVector(const QVariantList& values) {
47 std::vector<std::string> out;
48 out.reserve(static_cast<std::size_t>(values.size()));
49 for (const auto& value : values) {
50 const QString text = value.toString().trimmed();
51 if (!text.isEmpty()) {
52 out.push_back(strings::toStdString(text));
53 }
54 }
55 return out;
56}
57
58QVariantList toVariantList(const std::vector<std::string>& values) {
59 QVariantList out;
60 out.reserve(static_cast<int>(values.size()));
61 for (const auto& value : values) {
62 const QString text = QString::fromStdString(value).trimmed();
63 if (!text.isEmpty()) {
64 out.push_back(text);
65 }
66 }
67 return out;
68}
69
70} // namespace
71
73 : QObject(parent), store_(store) {}
74
76 return store_.dataRevision();
77}
78
79QVariantList WorkspaceSelectors::actorRows() const {
80 return projectRows(store_.snapshot().actors, workspace_payloads::actorRow);
81}
82
84 return projectRows(store_.snapshot().properties,
86}
87
89 return projectRows(store_.snapshot().contracts,
91}
92
94 return projectRows(store_.snapshot().analyses,
96}
97
98QVariantList WorkspaceSelectors::annualRows() const {
99 return projectRows(store_.snapshot().annuals, workspace_payloads::annualRow);
100}
101
103 return projectRows(store_.snapshot().statements,
105}
106
108 QVariantList rows = statementRows();
109 for (QVariant& rowValue : rows) {
110 QVariantMap row = rowValue.toMap();
111 const QString statementId =
112 row.value(payload::keys::common::kId).toString();
113 row.insert(QStringLiteral("transactions"),
114 statementTransactionRows(statementId));
115 rowValue = row;
116 }
117 return rows;
118}
119
120QVariantList
121WorkspaceSelectors::statementTransactionRows(const QString& statementId) const {
122 QVariantList out;
123 if (statementId.isEmpty()) {
124 return out;
125 }
126 const std::string target = strings::toStdString(statementId);
127 for (const auto& transaction : store_.snapshot().transactions) {
128 if (transaction.statementId == target) {
129 out.push_back(workspace_payloads::statementTransactionRow(transaction));
130 }
131 }
132 return out;
133}
134
135QVariantMap WorkspaceSelectors::transactionRowById(const QString& id) const {
136 const std::string target = strings::toStdString(id.trimmed());
137 if (target.empty()) {
138 return {};
139 }
140 const auto& transactions = store_.snapshot().transactions;
141 const auto it = std::find_if(transactions.begin(), transactions.end(),
142 [&](const auto& tx) {
143 return tx.id == target;
144 });
145 if (it == transactions.end()) {
146 return {};
147 }
149 *it, contractTypeForId(QString::fromStdString(it->contractId)));
150}
151
153 const QVariantMap& transaction, const QVariantMap& changes) const {
154 if (!store_.reader()) {
155 return transaction;
156 }
157
160 transaction.value(payload::keys::transaction::kActorId)
161 .toString()
162 .trimmed());
165 .toString()
166 .trimmed());
167 change.current.propertyIds = toStdStringVector(
168 transaction.value(payload::keys::transaction::kPropertyIds).toList());
169
170 change.contractChanged =
172 change.actorChanged = changes.contains(payload::keys::transaction::kActorId);
173 change.propertiesChanged =
177 .toString()
178 .trimmed());
180 changes.value(payload::keys::transaction::kActorId).toString().trimmed());
181 change.propertyIds = toStdStringVector(
182 changes.value(payload::keys::transaction::kPropertyIds).toList());
183
184 const auto selection = store_.reader()->transactionCatalogSelection(change);
185
186 QVariantMap next = transaction;
188 QString::fromStdString(selection.actorId));
190 QString::fromStdString(selection.contractId));
192 toVariantList(selection.propertyIds));
193 return next;
194}
195
197 QVariantList rows = actorRows();
198 prependEmptyDropdownRow(rows, tr("No actor"));
199 return rows;
200}
201
203 return propertyRows();
204}
205
207 QVariantList rows = contractRows();
208 prependEmptyDropdownRow(rows, tr("No contract"));
209 return rows;
210}
211
213 return projectRows(store_.snapshot().importLogs,
215}
216
218 return projectRows(store_.snapshot().exportLogs,
220}
221
223 QStringList ids;
224 const auto& logs = store_.snapshot().importLogs;
225 ids.reserve(static_cast<int>(logs.size()));
226 for (const auto& entry : logs) {
227 if (!entry.draftAttached) {
228 continue;
229 }
230 const QString draftId = QString::fromStdString(entry.draftId);
231 const QString logId = QString::fromStdString(entry.id);
232 const QString id = !draftId.isEmpty() ? draftId : logId;
233 if (id.isEmpty() || ids.contains(id)) {
234 continue;
235 }
236 ids.push_back(id);
237 }
238 return ids;
239}
240
241QString WorkspaceSelectors::exportLogTargetPath(const QString& id) const {
242 const auto& logs = store_.snapshot().exportLogs;
243 const QString trimmedId = id.trimmed();
244 if (!trimmedId.isEmpty()) {
245 const std::string idStd = strings::toStdString(trimmedId);
246 const auto it =
247 std::find_if(logs.begin(), logs.end(), [&](const auto& log) {
248 return log.id == idStd;
249 });
250 if (it != logs.end()) {
251 return QString::fromStdString(it->targetPath);
252 }
253 }
254 return {};
255}
256
257QString WorkspaceSelectors::actorIdByName(const QString& name) const {
258 if (!store_.reader()) {
259 return {};
260 }
261 return QString::fromStdString(
262 store_.reader()->actorIdentityByName(strings::toStdString(name)).id);
263}
264
265QString WorkspaceSelectors::propertyIdByName(const QString& name) const {
266 if (!store_.reader()) {
267 return {};
268 }
269 return QString::fromStdString(
270 store_.reader()->propertyIdentityByName(strings::toStdString(name)).id);
271}
272
274 const QString& name, const QString& type, const QStringList& actorIds,
275 const QStringList& propertyIds) const {
276 if (!store_.reader()) {
277 return {};
278 }
279 return QString::fromStdString(
280 store_.reader()
281 ->contractIdentityBySignature(
283 strings::toStdList(actorIds), strings::toStdList(propertyIds))
284 .id);
285}
286
288 return store_.reader()
289 ? QString::fromStdString(store_.reader()->nextContractName())
290 : QStringLiteral("Contract 1");
291}
292
293bool WorkspaceSelectors::hasActorId(const QString& id) const {
294 return containsId(store_.snapshot().actors, id);
295}
296
297bool WorkspaceSelectors::hasPropertyId(const QString& id) const {
298 return containsId(store_.snapshot().properties, id);
299}
300
301bool WorkspaceSelectors::hasContractId(const QString& id) const {
302 return containsId(store_.snapshot().contracts, id);
303}
304
305bool WorkspaceSelectors::hasStatementId(const QString& id) const {
306 return containsId(store_.snapshot().statements, id);
307}
308
309bool WorkspaceSelectors::hasTransactionId(const QString& id) const {
310 return containsId(store_.snapshot().transactions, id);
311}
312
313bool WorkspaceSelectors::hasAnalysisId(const QString& id) const {
314 return containsId(store_.snapshot().analyses, id);
315}
316
317bool WorkspaceSelectors::hasAnnualId(const QString& id) const {
318 return containsId(store_.snapshot().annuals, id);
319}
320
321QString WorkspaceSelectors::contractTypeForId(const QString& contractId) const {
322 const std::string target = strings::toStdString(contractId.trimmed());
323 if (target.empty()) {
324 return {};
325 }
326 const auto& contracts = store_.snapshot().contracts;
327 const auto it = std::find_if(contracts.begin(), contracts.end(),
328 [&](const auto& contract) {
329 return contract.id == target;
330 });
331 return it == contracts.end() ? QString() : QString::fromStdString(it->type);
332}
333
334} // namespace ui
Declarations for the UI PayloadKeys component.
Declarations for the UI payload mapper helpers.
Declares lightweight conversions between common Qt string types and standard strings.
Declares workspace-specific QML payload builders.
Declares read-only workspace selectors for QML payloads.
bool hasActorId(const QString &id) const
Checks whether an actor id exists.
QVariantList importLogRows() const
Returns import log rows for the import sidebar.
bool hasAnnualId(const QString &id) const
Checks whether an annual id exists.
QVariantList propertyDropdownRows() const
Returns property dropdown rows.
QString nextContractName() const
Returns the next generated contract name.
QString propertyIdByName(const QString &name) const
Looks up a property id by display name.
bool hasContractId(const QString &id) const
Checks whether a contract id exists.
QString exportLogTargetPath(const QString &id) const
Resolves an export log target path.
QVariantList analysisRows() const
Returns analysis rows for QML views.
int dataRevision() const noexcept
Returns the current workspace data revision.
QVariantList contractDropdownRows() const
Returns contract dropdown rows including the empty option.
QVariantList annualRows() const
Returns annual rows for QML views.
QVariantList actorDropdownRows() const
Returns actor dropdown rows including the empty option.
WorkspaceSelectors(WorkspaceStore &store, QObject *parent=nullptr)
Creates selectors for a workspace store.
QVariantList statementRows() const
Returns statement rows without embedded transactions.
bool hasAnalysisId(const QString &id) const
Checks whether an analysis id exists.
bool hasStatementId(const QString &id) const
Checks whether a statement id exists.
QVariantList propertyRows() const
Returns property rows for QML tables and dropdowns.
QVariantMap transactionRowById(const QString &id) const
Looks up a transaction row by id.
QVariantList contractRows() const
Returns contract rows for QML tables and dropdowns.
QVariantList actorRows() const
Returns actor rows for QML tables and dropdowns.
QString contractIdBySignature(const QString &name, const QString &type, const QStringList &actorIds, const QStringList &propertyIds) const
Looks up a contract id by unique signature.
QStringList attachedImportDraftIds() const
Returns ids of import logs that have attached statement drafts.
QVariantList statementRowsWithTransactions() const
Returns statement rows with their transaction rows embedded.
QString actorIdByName(const QString &name) const
Looks up an actor id by display name.
bool hasPropertyId(const QString &id) const
Checks whether a property id exists.
QVariantMap transactionFormWithCatalogSelection(const QVariantMap &transaction, const QVariantMap &changes) const
Applies catalog-dependent transaction form selection changes.
QVariantList statementTransactionRows(const QString &statementId) const
Returns transactions belonging to a statement.
QVariantList exportLogRows() const
Returns export log rows for the export sidebar.
bool hasTransactionId(const QString &id) const
Checks whether a transaction id exists.
Owns the current UI-side workspace snapshot and revision lifecycle.
QVariantList toVariantList(const QVariant &value)
Converts a QVariant value to a QVariantList.
std::vector< std::string > toStdList(const QStringList &values)
Converts a Qt string list into a standard string vector.
std::string toStdString(const QString &value)
Converts a QString to a UTF-8 encoded std::string.
QVariantMap transactionRow(const core::ports::workspace::TransactionSnapshot &transaction, const QString &contractType={})
Builds a transaction row.
QVariantMap statementTransactionRow(const core::ports::workspace::TransactionSnapshot &transaction)
Builds a lightweight statement transaction row.
QVariantMap contractRow(const core::ports::workspace::ContractSnapshot &contract)
Builds a contract row.
QVariantMap propertyRow(const core::ports::workspace::PropertySnapshot &property)
Builds a property row.
QVariantMap actorRow(const core::ports::workspace::ActorSnapshot &actor)
Builds an actor row.
QVariantMap annualRow(const core::ports::workspace::AnnualSnapshot &annual)
Builds an annual row.
QVariantMap importLogRow(const core::ports::workspace::ImportLogSnapshot &log)
Builds an import log row.
QVariantMap exportLogRow(const core::ports::workspace::ExportLogSnapshot &log)
Builds an export log row.
QVariantMap statementRow(const core::ports::workspace::StatementSnapshot &statement)
Builds a statement row.
QVariantMap analysisRow(const core::ports::workspace::AnalysisSnapshot &analysis)
Builds an analysis row.
QVariantMap dropdownRow(const QString &id, const QString &display, const QString &name={}, const QString &type={}, const QVariantList &actorIds={}, const QVariantList &propertyIds={}, const QString &allocatableMode=QStringLiteral("mixed"))
Builds a dropdown row.
Catalog selection change request for transaction forms.
bool propertiesChanged
True when propertyIds contains user-selected properties.
bool contractChanged
True when contractId contains a user-selected contract.
std::string actorId
New actor id when actorChanged is true.
TransactionCatalogSelection current
Current transaction catalog selection.
std::string contractId
New contract id when contractChanged is true.
bool actorChanged
True when actorId contains a user-selected actor.
std::vector< std::string > propertyIds
New property ids when propertiesChanged is true.
std::vector< std::string > propertyIds
Selected property ids.