diff --git a/domain-server/resources/web/settings/describe.json b/domain-server/resources/web/settings/describe.json
index 2c0440ac01..227b6bf0cd 100644
--- a/domain-server/resources/web/settings/describe.json
+++ b/domain-server/resources/web/settings/describe.json
@@ -1,7 +1,7 @@
{
"audio": {
"label": "Audio",
- "types": [0],
+ "assignment-types": [0],
"settings": {
"unattenuated-zone": {
"label": "Unattenuated Zone",
diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml
index 15ce842f30..3bb669b32e 100644
--- a/domain-server/resources/web/settings/index.shtml
+++ b/domain-server/resources/web/settings/index.shtml
@@ -18,10 +18,12 @@
<% if(setting.type) %>
<% if (setting.type === "checkbox") { %>
- <% var checked_box = (_.isUndefined(values[group_key][setting_key]) ? setting.default : values[group_key][setting_key]) %>
+ <% var checked_box = (values[group_key] || {})[setting_key] || setting.default %>
>
<% } else { %>
-
+
<% } %>
diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp
index 4229e45191..d7e2e05ca8 100644
--- a/domain-server/src/DomainServerSettingsManager.cpp
+++ b/domain-server/src/DomainServerSettingsManager.cpp
@@ -11,9 +11,12 @@
#include
#include
+#include
#include
#include
+#include
+#include
#include
#include "DomainServerSettingsManager.h"
@@ -38,6 +41,9 @@ DomainServerSettingsManager::DomainServerSettingsManager() :
_settingsMap = QJsonDocument::fromJson(configFile.readAll()).toVariant().toMap();
}
+const QString DESCRIPTION_SETTINGS_KEY = "settings";
+const QString SETTING_DEFAULT_KEY = "default";
+
bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection, const QUrl &url) {
if (connection->requestOperation() == QNetworkAccessManager::PostOperation && url.path() == "/settings.json") {
// this is a POST operation to change one or more settings
@@ -57,20 +63,75 @@ bool DomainServerSettingsManager::handleHTTPRequest(HTTPConnection* connection,
return true;
} else if (connection->requestOperation() == QNetworkAccessManager::GetOperation && url.path() == "/settings.json") {
// this is a GET operation for our settings
- // combine the description object and our current settings map
- QJsonObject combinedObject;
- combinedObject["descriptions"] = _descriptionObject;
- combinedObject["values"] = QJsonDocument::fromVariant(_settingsMap).object();
- connection->respond(HTTPConnection::StatusCode200, QJsonDocument(combinedObject).toJson(), "application/json");
+ // check if there is a query parameter for settings affecting a particular type of assignment
+ const QString SETTINGS_TYPE_QUERY_KEY = "type";
+ QUrlQuery settingsQuery(url);
+ QString typeValue = settingsQuery.queryItemValue(SETTINGS_TYPE_QUERY_KEY);
+
+ QJsonObject responseObject;
+
+ if (typeValue.isEmpty()) {
+ // combine the description object and our current settings map
+ responseObject["descriptions"] = _descriptionObject;
+ responseObject["values"] = QJsonDocument::fromVariant(_settingsMap).object();
+ } else {
+ // convert the string type value to a QJsonValue
+ QJsonValue queryType = QJsonValue(typeValue.toInt());
+
+ const QString AFFECTED_TYPES_JSON_KEY = "assignment-types";
+
+ // enumerate the groups in the description object to find which settings to pass
+ foreach(const QString& group, _descriptionObject.keys()) {
+ QJsonObject groupObject = _descriptionObject[group].toObject();
+ QJsonObject groupSettingsObject = groupObject[DESCRIPTION_SETTINGS_KEY].toObject();
+
+ QJsonObject groupResponseObject;
+
+
+ foreach(const QString& settingKey, groupSettingsObject.keys()) {
+ QJsonObject settingObject = groupSettingsObject[settingKey].toObject();
+
+ QJsonArray affectedTypesArray = settingObject[AFFECTED_TYPES_JSON_KEY].toArray();
+ if (affectedTypesArray.isEmpty()) {
+ affectedTypesArray = groupObject[AFFECTED_TYPES_JSON_KEY].toArray();
+ }
+
+ if (affectedTypesArray.contains(queryType)) {
+ // this is a setting we should include in the responseObject
+
+ // we need to check if the settings map has a value for this setting
+ QVariant variantValue;
+ QVariant settingsMapGroupValue = _settingsMap.value(group);
+
+ if (!settingsMapGroupValue.isNull()) {
+ variantValue = settingsMapGroupValue.toMap().value(settingKey);
+ }
+
+ if (variantValue.isNull()) {
+ // no value for this setting, pass the default
+ groupResponseObject[settingKey] = settingObject[SETTING_DEFAULT_KEY];
+ } else {
+ groupResponseObject[settingKey] = QJsonValue::fromVariant(variantValue);
+ }
+ }
+ }
+
+ if (!groupResponseObject.isEmpty()) {
+ // set this group's object to the constructed object
+ responseObject[group] = groupResponseObject;
+ }
+ }
+
+ }
+
+ connection->respond(HTTPConnection::StatusCode200, QJsonDocument(responseObject).toJson(), "application/json");
return true;
}
return false;
}
-const QString DESCRIPTION_SETTINGS_KEY = "settings";
-
void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject,
QVariantMap& settingsVariant,
QJsonObject descriptionObject) {
@@ -94,7 +155,6 @@ void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJ
settingsVariant[key] = QVariantMap();
}
-
recurseJSONObjectAndOverwriteSettings(rootValue.toObject(),
*reinterpret_cast(settingsVariant[key].data()),
nextDescriptionObject[DESCRIPTION_SETTINGS_KEY].toObject());