22#include " view-utils.hpp"
33#include < QJsonArray>
44#include < QJsonObject>
5+ #include < QJSValue>
6+ #include < qcontainerfwd.h>
7+ #include < qstringliteral.h>
58#include < utility>
69
710ExtensionFormModel::ExtensionFormModel (NotifyFn notify, QObject *parent)
@@ -54,7 +57,14 @@ void ExtensionFormModel::setFieldValue(int index, const QVariant &value) {
5457 auto &item = m_items[index];
5558 if (!item.isField ()) return ;
5659
57- item.userValue = QJsonValue::fromVariant (value);
60+ // TODO: find out why Form.TagPicker tags would break without that
61+ QVariant normalizedValue = value;
62+
63+ if (value.metaType ().id () == qMetaTypeId<QJSValue>()) {
64+ normalizedValue = value.value <QJSValue>().toVariant ();
65+ }
66+
67+ item.userValue = QJsonValue::fromVariant (normalizedValue);
5868 item.hasUserValue = true ;
5969 emit dataChanged (createIndex (index, 0 ), createIndex (index, 0 ), {ValueRole});
6070
@@ -99,6 +109,23 @@ void ExtensionFormModel::setFilePaths(int index, const QVariantList &paths) {
99109 if (item.onChange ) { m_notify (*item.onChange , QJsonArray{arr}); }
100110}
101111
112+ void ExtensionFormModel::setPickedItems (int index, const QVariantList &pickedItems) {
113+ if (index < 0 || std::cmp_greater_equal (index, m_items.size ())) return ;
114+ auto &item = m_items[index];
115+ if (item.type != FormItemData::Type::TagPicker) return ;
116+
117+ QJsonArray arr;
118+ for (const auto &t : pickedItems) {
119+ arr.append (t.toString ());
120+ }
121+
122+ item.userValue = arr;
123+ item.hasUserValue = true ;
124+ emit dataChanged (createIndex (index, 0 ), createIndex (index, 0 ), {ValueRole});
125+
126+ if (item.onChange ) { m_notify (*item.onChange , QJsonArray{arr}); }
127+ }
128+
102129void ExtensionFormModel::dropdownSearchTextChanged (int index, const QString &text) {
103130 if (index < 0 || std::cmp_greater_equal (index, m_items.size ())) return ;
104131 const auto &item = m_items[index];
@@ -255,6 +282,7 @@ ExtensionFormModel::FormItemData::Type ExtensionFormModel::fieldType(const FormM
255282 if (dynamic_cast <const FormModel::TextAreaField *>(&field)) return FormItemData::Type::TextArea;
256283 if (dynamic_cast <const FormModel::FilePickerField *>(&field)) return FormItemData::Type::FilePicker;
257284 if (dynamic_cast <const FormModel::DatePickerField *>(&field)) return FormItemData::Type::DatePicker;
285+ if (dynamic_cast <const FormModel::TagPickerField *>(&field)) return FormItemData::Type::TagPicker;
258286 return FormItemData::Type::Text;
259287}
260288
@@ -280,6 +308,8 @@ QVariantMap ExtensionFormModel::buildFieldData(const FormModel::IField &field) {
280308 if (f->min ) data[" min" ] = *f->min ;
281309 if (f->max ) data[" max" ] = *f->max ;
282310 data[" includeTime" ] = f->type .value_or (" date" ) == " dateTime" ;
311+ } else if (auto *f = dynamic_cast <const FormModel::TagPickerField *>(&field)) {
312+ data[" items" ] = qml::convertTagPickerItems (f->m_items );
283313 }
284314
285315 return data;
@@ -305,6 +335,8 @@ QString ExtensionFormModel::FormItemData::typeString() const {
305335 return QStringLiteral (" description" );
306336 case Type::Separator:
307337 return QStringLiteral (" separator" );
338+ case Type::TagPicker:
339+ return QStringLiteral (" tagpicker" );
308340 }
309341 return QStringLiteral (" text" );
310342}
0 commit comments