21template<
typename Rows,
typename Project>
22QVariantList projectRows(
const Rows& rows, Project project) {
24 out.reserve(
static_cast<int>(rows.size()));
25 for (
const auto& row : rows) {
26 out.push_back(project(row));
31template<
typename Rows>
32bool containsId(
const Rows& rows,
const QString&
id) {
37 return std::any_of(rows.begin(), rows.end(), [&](
const auto& row) {
38 return row.id == target;
42void prependEmptyDropdownRow(QVariantList& rows,
const QString& display) {
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()) {
58QVariantList
toVariantList(
const std::vector<std::string>& values) {
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()) {
73 : QObject(parent), store_(store) {}
76 return store_.dataRevision();
84 return projectRows(store_.snapshot().properties,
89 return projectRows(store_.snapshot().contracts,
94 return projectRows(store_.snapshot().analyses,
103 return projectRows(store_.snapshot().statements,
109 for (QVariant& rowValue : rows) {
110 QVariantMap row = rowValue.toMap();
111 const QString statementId =
113 row.insert(QStringLiteral(
"transactions"),
123 if (statementId.isEmpty()) {
127 for (
const auto& transaction : store_.snapshot().transactions) {
128 if (transaction.statementId == target) {
137 if (target.empty()) {
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;
145 if (it == transactions.end()) {
149 *it, contractTypeForId(QString::fromStdString(it->contractId)));
153 const QVariantMap& transaction,
const QVariantMap& changes)
const {
154 if (!store_.reader()) {
184 const auto selection = store_.reader()->transactionCatalogSelection(change);
186 QVariantMap next = transaction;
188 QString::fromStdString(selection.actorId));
190 QString::fromStdString(selection.contractId));
192 toVariantList(selection.propertyIds));
198 prependEmptyDropdownRow(rows, tr(
"No actor"));
208 prependEmptyDropdownRow(rows, tr(
"No contract"));
213 return projectRows(store_.snapshot().importLogs,
218 return projectRows(store_.snapshot().exportLogs,
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) {
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)) {
242 const auto& logs = store_.snapshot().exportLogs;
243 const QString trimmedId =
id.trimmed();
244 if (!trimmedId.isEmpty()) {
247 std::find_if(logs.begin(), logs.end(), [&](
const auto& log) {
248 return log.id == idStd;
250 if (it != logs.end()) {
251 return QString::fromStdString(it->targetPath);
258 if (!store_.reader()) {
261 return QString::fromStdString(
266 if (!store_.reader()) {
269 return QString::fromStdString(
274 const QString& name,
const QString& type,
const QStringList& actorIds,
275 const QStringList& propertyIds)
const {
276 if (!store_.reader()) {
279 return QString::fromStdString(
281 ->contractIdentityBySignature(
288 return store_.reader()
289 ? QString::fromStdString(store_.reader()->nextContractName())
290 : QStringLiteral(
"Contract 1");
294 return containsId(store_.snapshot().actors,
id);
298 return containsId(store_.snapshot().properties,
id);
302 return containsId(store_.snapshot().contracts,
id);
306 return containsId(store_.snapshot().statements,
id);
310 return containsId(store_.snapshot().transactions,
id);
314 return containsId(store_.snapshot().analyses,
id);
318 return containsId(store_.snapshot().annuals,
id);
321QString WorkspaceSelectors::contractTypeForId(
const QString& contractId)
const {
323 if (target.empty()) {
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;
331 return it == contracts.end() ? QString() : QString::fromStdString(it->type);
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.
std::string contractId
Selected contract id.
std::string actorId
Selected actor id.