From e6dee30a6ac4b5cb1a93b1c6f0396f1795a78f4c Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Oct 2014 16:01:43 -0700 Subject: [PATCH 01/16] handle drawing a table for array values --- .../resources/describe-settings.json | 11 ++++--- domain-server/resources/web/js/settings.js | 32 +++++++++++++++---- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 30d843c7eb..a2df9e23be 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -68,10 +68,13 @@ "numbered": false, "can_add": true, "can_delete": true, - "key": { - "name": "username", - "label": "Username" - } + "columns": [ + { + "name": "username", + "label": "Username", + "can_set": true + } + ] } ] }, diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index c2b2babbb2..5318e50d7f 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -285,13 +285,19 @@ function makeTable(setting, setting_name, setting_value) { // Column names html += "" - if (setting.number === true) { + + if (setting.numbered === true) { html += "#" // Row number } - html += "" + setting.key.label + "" // Key + + if (setting.key) { + html += "" + setting.key.label + "" // Key + } + _.each(setting.columns, function(col) { html += "" + col.label + "" // Data }) + if (setting.can_delete === true || setting.can_add === true) { html += "+/-" // Buttons } @@ -301,10 +307,15 @@ function makeTable(setting, setting_name, setting_value) { var row_num = 1 _.each(setting_value, function(row, name) { html += "" + if (setting.numbered === true) { html += "" + row_num + "" } - html += "" + name + "" + + if (setting.key) { + html += "" + name + "" + } + _.each(setting.columns, function(col) { html += "" if (row.hasOwnProperty(col.name)) { @@ -312,6 +323,7 @@ function makeTable(setting, setting_name, setting_value) { } html += "" }) + if (setting.can_delete === true) { html += "" } else if (setting.can_add === true) { @@ -333,17 +345,23 @@ function makeTable(setting, setting_name, setting_value) { function makeTableInputs(setting) { var html = "" + if (setting.numbered === true) { html += "" } - html += "\ - \ - " + + if (setting.key) { + html += "\ + \ + " + } + _.each(setting.columns, function(col) { html += "\ - \ + \ " }) + html += "" html += "" From 01e6acda39fe3f5842ce4ab3715c8687e5c6ad2d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Oct 2014 16:52:04 -0700 Subject: [PATCH 02/16] changes to allow an array setting via table --- domain-server/resources/web/css/style.css | 1 + domain-server/resources/web/js/settings.js | 192 ++++++++++++--------- 2 files changed, 111 insertions(+), 82 deletions(-) diff --git a/domain-server/resources/web/css/style.css b/domain-server/resources/web/css/style.css index 4c365ed110..2da27ed900 100644 --- a/domain-server/resources/web/css/style.css +++ b/domain-server/resources/web/css/style.css @@ -82,4 +82,5 @@ td.buttons { td.buttons .glyphicon { display: block; text-align: center; + font-size: 16px; } diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 5318e50d7f..4f51312068 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -88,80 +88,7 @@ $(document).ready(function(){ }) $('#settings-form').on('click', '.add-row', function(){ - var row = $(this).parents("tr") - var data = row.parent().children(".row-data") - - // Check key spaces - var name = row.children(".key").children("input").val() - if (name.indexOf(' ') !== -1) { - showErrorMessage("Error", "Key contains spaces") - return - } - // Check keys with the same name - var equals = false; - _.each(data.children(".key"), function(element) { - if ($(element).text() === name) { - equals = true - return - } - }) - if (equals) { - showErrorMessage("Error", "Two keys cannot be identical") - return - } - - // Check empty fields - var empty = false; - _.each(row.children(".row-data").children("input"), function(element) { - if ($(element).val().length === 0) { - empty = true - return - } - }) - if (empty) { - showErrorMessage("Error", "Empty field(s)") - return - } - - var input_clone = row.clone() - // Change input row to data row - var full_name = row.parents("table").attr("name") + "." + name - row.attr("class", "row-data") - - _.each(row.children(), function(element) { - if ($(element).hasClass("number")) { // Index row - var numbers = data.children(".number") - if (numbers.length > 0) { - $(element).html(parseInt(numbers.last().text()) + 1) - } else { - $(element).html(1) - } - } else if ($(element).hasClass("buttons")) { // Change buttons - var prevSpan = $(element).parent().prev().children(".buttons").children("span") - var span = $(element).children("span") - if (prevSpan.hasClass("del-row")) { - span.removeClass("glyphicon-ok add-row") - span.addClass("glyphicon-remove del-row") - } else { - span.remove() - } - } else if ($(element).hasClass("key")) { - var input = $(element).children("input") - $(element).html(input.val()) - input.remove() - } else if($(element).hasClass("row-data")) { // Hide inputs - var input = $(element).children("input") - input.attr("type", "hidden") - input.attr("name", full_name + "." + $(element).attr("name")) - input.attr("value", input.val()) - input.attr("data-changed", "true") - - $(element).html($(element).html() + input.val()) - } else { - console.log("Unknown table element") - } - }) - row.parent().append(input_clone) + addTableRow(this); }) $('#settings-form').on('click', '.del-row', function(){ @@ -279,9 +206,12 @@ $('body').on('click', '.save-button', function(e){ }); function makeTable(setting, setting_name, setting_value) { + var isArray = !_.has(setting, 'key') + var html = "" html += "" + setting.help + "" - html += "" + html += "
" // Column names html += "" @@ -303,24 +233,31 @@ function makeTable(setting, setting_name, setting_value) { } html += "" - // Rows + // populate rows in the table from existing values var row_num = 1 - _.each(setting_value, function(row, name) { - html += "" + + _.each(setting_value, function(row, indexOrName) { + html += "" if (setting.numbered === true) { html += "" } if (setting.key) { - html += "" + html += "" } _.each(setting.columns, function(col) { html += "" }) @@ -333,7 +270,7 @@ function makeTable(setting, setting_name, setting_value) { row_num++ }) - // Inputs + // populate inputs in the table for new values, if we can add if (setting.can_add === true) { html += makeTableInputs(setting) } @@ -392,6 +329,97 @@ function badgeSidebarForDifferences(changedInput) { $("a[href='#" + panelParentID + "'] .badge").html(badgeValue); } +function addTableRow(add_glyphicon) { + var row = $(add_glyphicon).closest('tr') + + var table = row.parents('table') + var isArray = table.data('setting-type') === 'array' + + var data = row.parent().children(".row-data") + + if (!isArray) { + // Check key spaces + var name = row.children(".key").children("input").val() + if (name.indexOf(' ') !== -1) { + showErrorMessage("Error", "Key contains spaces") + return + } + // Check keys with the same name + var equals = false; + _.each(data.children(".key"), function(element) { + if ($(element).text() === name) { + equals = true + return + } + }) + if (equals) { + showErrorMessage("Error", "Two keys cannot be identical") + return + } + } + + // Check empty fields + var empty = false; + _.each(row.children(".row-data").children("input"), function(element) { + if ($(element).val().length === 0) { + empty = true + return + } + }) + if (empty) { + showErrorMessage("Error", "Empty field(s)") + return + } + + var input_clone = row.clone() + + // Change input row to data row + var setting_name = row.parents("table").attr("name") + var full_name = setting_name + "." + name + row.attr("class", "row-data") + + _.each(row.children(), function(element) { + if ($(element).hasClass("numbered")) { // Index row + var numbers = data.children(".numbered") + if (numbers.length > 0) { + $(element).html(parseInt(numbers.last().text()) + 1) + } else { + $(element).html(1) + } + } else if ($(element).hasClass("buttons")) { // Change buttons + var prevSpan = $(element).parent().prev().children(".buttons").children("span") + var span = $(element).children("span") + if (prevSpan.hasClass("del-row")) { + span.removeClass("glyphicon-ok add-row") + span.addClass("glyphicon-remove del-row") + } else { + span.remove() + } + } else if ($(element).hasClass("key")) { + var input = $(element).children("input") + $(element).html(input.val()) + input.remove() + } else if ($(element).hasClass("row-data")) { // Hide inputs + var input = $(element).children("input") + input.attr("type", "hidden") + + if (isArray) { + input.attr("name", setting_name) + } else { + input.attr("name", full_name + "." + $(element).attr("name")) + } + + input.attr("value", input.val()) + input.attr("data-changed", "true") + + $(element).html($(element).html() + input.val()) + } else { + console.log("Unknown table element") + } + }) + row.parent().append(input_clone) +} + function showRestartModal() { $('#restart-modal').modal({ backdrop: 'static', From 1fa0d8df72d516612f376b14d31565c9140fef38 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Oct 2014 16:56:41 -0700 Subject: [PATCH 03/16] change the add and remove style for glyphs in settings --- domain-server/resources/web/css/style.css | 2 +- domain-server/resources/web/js/settings.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/resources/web/css/style.css b/domain-server/resources/web/css/style.css index 2da27ed900..2766da0830 100644 --- a/domain-server/resources/web/css/style.css +++ b/domain-server/resources/web/css/style.css @@ -82,5 +82,5 @@ td.buttons { td.buttons .glyphicon { display: block; text-align: center; - font-size: 16px; + font-size: 12px; } diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 4f51312068..c7ebc96a65 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -299,7 +299,7 @@ function makeTableInputs(setting) { " }) - html += "" + html += "" html += "" return html From ed6b62cea428fe1a915d7c7487e787b76013aff8 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 8 Oct 2014 17:07:31 -0700 Subject: [PATCH 04/16] clear a row value after it is added to the table --- domain-server/resources/web/js/settings.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index c7ebc96a65..e29f30601b 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -92,9 +92,20 @@ $(document).ready(function(){ }) $('#settings-form').on('click', '.del-row', function(){ - var row = $(this).parents("tr") - row.empty() - row.html(""); + var row = $(this).parents('tr') + + var table = row.parents('table') + var isArray = table.data('setting-type') === 'array' + + if (!isArray) { + // this is a hash row, so we empty it but leave the hidden input blank so it is cleared when we save + row.empty() + row.html(""); + } else { + // just remove this row completely - the removal of the hidden input will remove it from the array on post + row.remove() + } + }) $('#settings-form').on('change', 'input', function(){ @@ -417,6 +428,11 @@ function addTableRow(add_glyphicon) { console.log("Unknown table element") } }) + + input_clone.find('input').each(function(){ + $(this).val('') + }); + row.parent().append(input_clone) } From 188320a7b724a567e22466ed1bf87b1ce2b7e6f6 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 09:37:24 -0700 Subject: [PATCH 05/16] badge sidebar for table removal --- domain-server/resources/web/js/settings.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index e29f30601b..ce8dc7ef44 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -94,18 +94,20 @@ $(document).ready(function(){ $('#settings-form').on('click', '.del-row', function(){ var row = $(this).parents('tr') - var table = row.parents('table') + var table = $(row).closest('table') var isArray = table.data('setting-type') === 'array' if (!isArray) { // this is a hash row, so we empty it but leave the hidden input blank so it is cleared when we save row.empty() row.html(""); - } else { + } else { // just remove this row completely - the removal of the hidden input will remove it from the array on post row.remove() + + // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated + badgeSidebarForDifferences($(table)) } - }) $('#settings-form').on('change', 'input', function(){ @@ -264,9 +266,9 @@ function makeTable(setting, setting_name, setting_value) { if (isArray) { html += row // for arrays we add a hidden input to this td so that values can be posted appropriately - html += "" + html += "" } else if (row.hasOwnProperty(col.name)) { - html += row[col.name] + html += row[col.name] } html += "" @@ -326,7 +328,7 @@ function badgeSidebarForDifferences(changedInput) { var badgeValue = 0 - for (var setting in panelJSON) { + for (var setting in Settings.initialValues[panelParentID]) { if (panelJSON[setting] != Settings.initialValues[panelParentID][setting]) { badgeValue += 1 } From 90c73dc9e1f21d429d2228ae3fc4d7b538e81ac1 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 09:47:53 -0700 Subject: [PATCH 06/16] post an empty array to remove an array from settings --- domain-server/resources/web/js/settings.js | 11 +++++++++-- domain-server/src/DomainServerSettingsManager.cpp | 2 ++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index ce8dc7ef44..bc36a73b28 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -102,8 +102,15 @@ $(document).ready(function(){ row.empty() row.html(""); } else { - // just remove this row completely - the removal of the hidden input will remove it from the array on post - row.remove() + if (table.children('tr.row-data').length) { + // this isn't the last row - we can just remove it + row.remove() + } else { + // this is the last row, we can't remove it completely since we need to post an empty array + row.empty() + row.html(""); + } // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated badgeSidebarForDifferences($(table)) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 6a63168579..0feaeefe37 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -295,6 +295,8 @@ void DomainServerSettingsManager::updateSetting(const QString& key, const QJsonV void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant, const QJsonArray& descriptionArray) { + + qDebug() << postedObject; // Iterate on the setting groups foreach(const QString& groupKey, postedObject.keys()) { QJsonValue groupValue = postedObject[groupKey]; From a416f6775178b89dc346e05c52f8a89b7f92e001 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 10:33:20 -0700 Subject: [PATCH 07/16] handle add and delete for badged sidebar --- domain-server/resources/web/js/settings.js | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index bc36a73b28..a8caf4f418 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -25,7 +25,7 @@ var viewHelpers = { form_group += "" form_group += "
" form_group += ""; form_group += "
" @@ -46,14 +46,14 @@ var viewHelpers = { form_group += "" - form_group += "" + form_group += "" } else { if (input_type == 'integer') { input_type = "text" } - form_group += "" } @@ -117,7 +117,7 @@ $(document).ready(function(){ } }) - $('#settings-form').on('change', 'input', function(){ + $('#settings-form').on('change', 'input.trigger-change', function(){ // this input was changed, add the changed data attribute to it $(this).attr('data-changed', true) @@ -335,12 +335,20 @@ function badgeSidebarForDifferences(changedInput) { var badgeValue = 0 - for (var setting in Settings.initialValues[panelParentID]) { + // badge for any settings we have that are not the same or are not present in initialValues + for (var setting in panelJSON) { if (panelJSON[setting] != Settings.initialValues[panelParentID][setting]) { badgeValue += 1 } } + // badge for any settings we remove that are in the initialValues + for (var setting in Settings.initialValues[panelParentID]) { + if (!_.has(panelJSON, setting)) { + badgeValue += 1 + } + } + // update the list-group-item badge to have the new value if (badgeValue == 0) { badgeValue = "" @@ -394,7 +402,8 @@ function addTableRow(add_glyphicon) { var input_clone = row.clone() // Change input row to data row - var setting_name = row.parents("table").attr("name") + var table = row.parents("table") + var setting_name = table.attr("name") var full_name = setting_name + "." + name row.attr("class", "row-data") @@ -419,7 +428,8 @@ function addTableRow(add_glyphicon) { var input = $(element).children("input") $(element).html(input.val()) input.remove() - } else if ($(element).hasClass("row-data")) { // Hide inputs + } else if ($(element).hasClass("row-data")) { + // Hide inputs var input = $(element).children("input") input.attr("type", "hidden") @@ -429,10 +439,9 @@ function addTableRow(add_glyphicon) { input.attr("name", full_name + "." + $(element).attr("name")) } - input.attr("value", input.val()) input.attr("data-changed", "true") - $(element).html($(element).html() + input.val()) + $(element).append(input.val()) } else { console.log("Unknown table element") } @@ -442,6 +451,8 @@ function addTableRow(add_glyphicon) { $(this).val('') }); + badgeSidebarForDifferences($(table)) + row.parent().append(input_clone) } From f39120519de52efcb3e59c73e95c8ce96bba6020 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 10:50:05 -0700 Subject: [PATCH 08/16] fix removal icons, handle row removal for hash --- .../resources/describe-settings.json | 4 -- domain-server/resources/web/js/settings.js | 47 +++++++------------ 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index a2df9e23be..77b3fcb5fc 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -66,8 +66,6 @@ "label": "Allowed Users", "help": "A list of usernames for the High Fidelity users you want to allow into your domain. Users not found in this list will not be allowed to connect.", "numbered": false, - "can_add": true, - "can_delete": true, "columns": [ { "name": "username", @@ -89,8 +87,6 @@ "label": "Zones", "help": "In this table you can define a set of zones in which you can specify various audio properties.", "numbered": false, - "can_add": true, - "can_delete": true, "key": { "name": "name", "label": "Name", diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index a8caf4f418..9bf3c498c1 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -100,7 +100,7 @@ $(document).ready(function(){ if (!isArray) { // this is a hash row, so we empty it but leave the hidden input blank so it is cleared when we save row.empty() - row.html(""); + row.html(""); } else { if (table.children('tr.row-data').length) { // this isn't the last row - we can just remove it @@ -111,10 +111,10 @@ $(document).ready(function(){ row.html(""); } - - // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated - badgeSidebarForDifferences($(table)) } + + // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated + badgeSidebarForDifferences($(table)) }) $('#settings-form').on('change', 'input.trigger-change', function(){ @@ -248,10 +248,7 @@ function makeTable(setting, setting_name, setting_value) { html += "
" // Data }) - if (setting.can_delete === true || setting.can_add === true) { - html += "" // Buttons - } - html += "" + html += "" // populate rows in the table from existing values var row_num = 1 @@ -281,20 +278,13 @@ function makeTable(setting, setting_name, setting_value) { html += "" }) - if (setting.can_delete === true) { - html += "" - } else if (setting.can_add === true) { - html += "" - } + html += "" html += "" row_num++ }) - // populate inputs in the table for new values, if we can add - if (setting.can_add === true) { - html += makeTableInputs(setting) - } - + // populate inputs in the table for new values + html += makeTableInputs(setting) html += "
" + row_num + "" + name + "" + indexOrName + "" - if (row.hasOwnProperty(col.name)) { - html += row[col.name] + + if (isArray) { + html += row + // for arrays we add a hidden input to this td so that values can be posted appropriately + html += "" + } else if (row.hasOwnProperty(col.name)) { + html += row[col.name] } + html += "
" + col.label + "+/-
+/-
" return html; @@ -330,8 +320,10 @@ function badgeSidebarForDifferences(changedInput) { var panelParentID = changedInput.closest('.panel').attr('id') // get a JSON representation of that section - var rootJSON = form2js(panelParentID, ".", false, cleanupFormValues, true); - var panelJSON = rootJSON[panelParentID] + var panelJSON = form2js(panelParentID, ".", false, cleanupFormValues, true)[panelParentID] + + console.log(panelJSON) + console.log(Settings.initialValues[panelParentID]) var badgeValue = 0 @@ -408,22 +400,19 @@ function addTableRow(add_glyphicon) { row.attr("class", "row-data") _.each(row.children(), function(element) { - if ($(element).hasClass("numbered")) { // Index row + if ($(element).hasClass("numbered")) { + // Index row var numbers = data.children(".numbered") if (numbers.length > 0) { $(element).html(parseInt(numbers.last().text()) + 1) } else { $(element).html(1) } - } else if ($(element).hasClass("buttons")) { // Change buttons - var prevSpan = $(element).parent().prev().children(".buttons").children("span") + } else if ($(element).hasClass("buttons")) { + // Change buttons var span = $(element).children("span") - if (prevSpan.hasClass("del-row")) { - span.removeClass("glyphicon-ok add-row") - span.addClass("glyphicon-remove del-row") - } else { - span.remove() - } + span.removeClass("glyphicon-ok add-row") + span.addClass("glyphicon-remove del-row") } else if ($(element).hasClass("key")) { var input = $(element).children("input") $(element).html(input.val()) From a175c22724a9e0c5cf51be23019f35b04c098b86 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 10:56:54 -0700 Subject: [PATCH 09/16] handle addition and removal on same page session --- domain-server/resources/web/js/settings.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 9bf3c498c1..e2f043bbc9 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -321,6 +321,7 @@ function badgeSidebarForDifferences(changedInput) { // get a JSON representation of that section var panelJSON = form2js(panelParentID, ".", false, cleanupFormValues, true)[panelParentID] + var initialPanelJSON = Settings.initialValues[panelParentID] console.log(panelJSON) console.log(Settings.initialValues[panelParentID]) @@ -329,14 +330,8 @@ function badgeSidebarForDifferences(changedInput) { // badge for any settings we have that are not the same or are not present in initialValues for (var setting in panelJSON) { - if (panelJSON[setting] != Settings.initialValues[panelParentID][setting]) { - badgeValue += 1 - } - } - - // badge for any settings we remove that are in the initialValues - for (var setting in Settings.initialValues[panelParentID]) { - if (!_.has(panelJSON, setting)) { + if (panelJSON[setting] !== initialPanelJSON[setting] + && (panelJSON[setting] !== "" || _.has(initialPanelJSON, setting))) { badgeValue += 1 } } From 51d908008c252476a89bf619335aec2f6da8df90 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:00:58 -0700 Subject: [PATCH 10/16] handle array posting in domain server settings manager --- domain-server/src/DomainServerSettingsManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 0feaeefe37..3beccaa3f1 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -289,6 +289,9 @@ void DomainServerSettingsManager::updateSetting(const QString& key, const QJsonV // we've cleared all of the settings below this value, so remove this one too settingMap.remove(key); } + } else if (newValue.isArray()) { + // we just assume array is replacement + settingMap[key] = newValue.toArray().toVariantList(); } } From 68dffabd5ee4d3018efe4e6fa23db6328ad02454 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:31:00 -0700 Subject: [PATCH 11/16] handle data-changed setting for all array values --- domain-server/resources/web/js/settings.js | 78 ++++++++++++++-------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index e2f043bbc9..cd8f995870 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -92,29 +92,7 @@ $(document).ready(function(){ }) $('#settings-form').on('click', '.del-row', function(){ - var row = $(this).parents('tr') - - var table = $(row).closest('table') - var isArray = table.data('setting-type') === 'array' - - if (!isArray) { - // this is a hash row, so we empty it but leave the hidden input blank so it is cleared when we save - row.empty() - row.html(""); - } else { - if (table.children('tr.row-data').length) { - // this isn't the last row - we can just remove it - row.remove() - } else { - // this is the last row, we can't remove it completely since we need to post an empty array - row.empty() - row.html(""); - } - } - - // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated - badgeSidebarForDifferences($(table)) + deleteTableRow(this); }) $('#settings-form').on('change', 'input.trigger-change', function(){ @@ -254,7 +232,7 @@ function makeTable(setting, setting_name, setting_value) { var row_num = 1 _.each(setting_value, function(row, indexOrName) { - html += "" + html += "" if (setting.numbered === true) { html += "" + row_num + "" @@ -323,14 +301,11 @@ function badgeSidebarForDifferences(changedInput) { var panelJSON = form2js(panelParentID, ".", false, cleanupFormValues, true)[panelParentID] var initialPanelJSON = Settings.initialValues[panelParentID] - console.log(panelJSON) - console.log(Settings.initialValues[panelParentID]) - var badgeValue = 0 // badge for any settings we have that are not the same or are not present in initialValues for (var setting in panelJSON) { - if (panelJSON[setting] !== initialPanelJSON[setting] + if (!_.isEqual(panelJSON[setting], initialPanelJSON[setting]) && (panelJSON[setting] !== "" || _.has(initialPanelJSON, setting))) { badgeValue += 1 } @@ -392,7 +367,8 @@ function addTableRow(add_glyphicon) { var table = row.parents("table") var setting_name = table.attr("name") var full_name = setting_name + "." + name - row.attr("class", "row-data") + row.addClass("row-data new-row") + row.removeClass("inputs") _.each(row.children(), function(element) { if ($(element).hasClass("numbered")) { @@ -435,11 +411,55 @@ function addTableRow(add_glyphicon) { $(this).val('') }); + if (isArray) { + updateDataChangedForSiblingRows(row, true) + } + badgeSidebarForDifferences($(table)) row.parent().append(input_clone) } +function deleteTableRow(delete_glyphicon) { + var row = $(delete_glyphicon).closest('tr') + + var table = $(row).closest('table') + var isArray = table.data('setting-type') === 'array' + + if (!isArray) { + // this is a hash row, so we empty it but leave the hidden input blank so it is cleared when we save + row.empty() + row.html(""); + } else if (table.find('tr.row-data').length > 1) { + updateDataChangedForSiblingRows(row, true) + + // this isn't the last row - we can just remove it + row.remove() + } else { + // this is the last row, we can't remove it completely since we need to post an empty array + row.empty() + + row.html(""); + } + + // we need to fire a change event on one of the remaining inputs so that the sidebar badge is updated + badgeSidebarForDifferences($(table)) +} + +function updateDataChangedForSiblingRows(row, isTrue) { + // anytime a new row is added to an array we need to set data-changed for all sibling row-data inputs to true + row.siblings('.row-data').each(function(){ + var hiddenInput = $(this).find('td.row-data input') + if (isTrue) { + hiddenInput.attr('data-changed', isTrue) + } else { + hiddenInput.removeAttr('data-changed') + } + + }) +} + function showRestartModal() { $('#restart-modal').modal({ backdrop: 'static', From bfaf96dbf518348df2bb434a0ec6451e8e6a559d Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:31:30 -0700 Subject: [PATCH 12/16] remove the allowed_users setting that isn't ready for primetime --- domain-server/resources/describe-settings.json | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 77b3fcb5fc..64441446a8 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -59,20 +59,6 @@ "type": "password", "help": "Password used for basic HTTP authentication. Leave this blank if you do not want to change it.", "value-hidden": true - }, - { - "name": "allowed_users", - "type": "table", - "label": "Allowed Users", - "help": "A list of usernames for the High Fidelity users you want to allow into your domain. Users not found in this list will not be allowed to connect.", - "numbered": false, - "columns": [ - { - "name": "username", - "label": "Username", - "can_set": true - } - ] } ] }, From 5bb0c4e8fb2b1c6c0ce1d0191a10553017e66fbd Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:32:09 -0700 Subject: [PATCH 13/16] remove an extra debug of posted settings in DSSM --- domain-server/src/DomainServerSettingsManager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/domain-server/src/DomainServerSettingsManager.cpp b/domain-server/src/DomainServerSettingsManager.cpp index 3beccaa3f1..e7a9eef1ee 100644 --- a/domain-server/src/DomainServerSettingsManager.cpp +++ b/domain-server/src/DomainServerSettingsManager.cpp @@ -298,8 +298,6 @@ void DomainServerSettingsManager::updateSetting(const QString& key, const QJsonV void DomainServerSettingsManager::recurseJSONObjectAndOverwriteSettings(const QJsonObject& postedObject, QVariantMap& settingsVariant, const QJsonArray& descriptionArray) { - - qDebug() << postedObject; // Iterate on the setting groups foreach(const QString& groupKey, postedObject.keys()) { QJsonValue groupValue = postedObject[groupKey]; From 806e73d3210c9d550da96477fe982fabbf96c470 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:54:37 -0700 Subject: [PATCH 14/16] don't set data-changed when a row is added and deleted in same session --- domain-server/resources/web/js/settings.js | 37 +++++++++++++++++----- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index cd8f995870..aa224fac70 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -21,12 +21,14 @@ var viewHelpers = { label_class += ' locked' } + common_attrs = " class='" + (setting.type !== 'checkbox' ? 'form-control' : '') + + " trigger-change' data-short-name='" + setting.name + "' name='" + setting_name + "' " + if (setting.type === 'checkbox') { form_group += "" form_group += "
" form_group += ""; form_group += "
" } else if (setting.type === 'table') { @@ -46,15 +48,15 @@ var viewHelpers = { form_group += "" - form_group += "" + form_group += "" } else { if (input_type == 'integer') { input_type = "text" } - form_group += "" } @@ -208,7 +210,7 @@ function makeTable(setting, setting_name, setting_value) { var html = "" html += "" + setting.help + "" - html += "" // Column names @@ -431,7 +433,7 @@ function deleteTableRow(delete_glyphicon) { row.empty() row.html(""); } else if (table.find('tr.row-data').length > 1) { - updateDataChangedForSiblingRows(row, true) + updateDataChangedForSiblingRows(row) // this isn't the last row - we can just remove it row.remove() @@ -447,8 +449,27 @@ function deleteTableRow(delete_glyphicon) { badgeSidebarForDifferences($(table)) } -function updateDataChangedForSiblingRows(row, isTrue) { +function updateDataChangedForSiblingRows(row, forceTrue) { // anytime a new row is added to an array we need to set data-changed for all sibling row-data inputs to true + // unless it matches the inital set of values + + if (!forceTrue) { + // figure out which group this row is in + var panelParentID = row.closest('.panel').attr('id') + // get the short name for the setting from the table + var tableShortName = row.closest('table').data('short-name') + + // get a JSON representation of that section + var panelSettingJSON = form2js(panelParentID, ".", false, cleanupFormValues, true)[panelParentID][tableShortName] + var initialPanelSettingJSON = Settings.initialValues[panelParentID][tableShortName] + + // if they are equal, we don't need data-changed + isTrue = _.isEqual(panelSettingJSON, initialPanelSettingJSON) + + } else { + isTrue = true + } + row.siblings('.row-data').each(function(){ var hiddenInput = $(this).find('td.row-data input') if (isTrue) { From 84fa1c7f5fc493ddfa31939e6dec3155ecb34f6a Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:54:53 -0700 Subject: [PATCH 15/16] remove an extra space --- domain-server/resources/web/js/settings.js | 1 - 1 file changed, 1 deletion(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index aa224fac70..44bb081106 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -465,7 +465,6 @@ function updateDataChangedForSiblingRows(row, forceTrue) { // if they are equal, we don't need data-changed isTrue = _.isEqual(panelSettingJSON, initialPanelSettingJSON) - } else { isTrue = true } From 6d017245685c209162e4cef297d49385620b0dce Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 9 Oct 2014 11:57:11 -0700 Subject: [PATCH 16/16] rename in changedInput in badge sidebar in settings.js --- domain-server/resources/web/js/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/domain-server/resources/web/js/settings.js b/domain-server/resources/web/js/settings.js index 44bb081106..130000fc9c 100644 --- a/domain-server/resources/web/js/settings.js +++ b/domain-server/resources/web/js/settings.js @@ -295,9 +295,9 @@ function makeTableInputs(setting) { return html } -function badgeSidebarForDifferences(changedInput) { +function badgeSidebarForDifferences(changedElement) { // figure out which group this input is in - var panelParentID = changedInput.closest('.panel').attr('id') + var panelParentID = changedElement.closest('.panel').attr('id') // get a JSON representation of that section var panelJSON = form2js(panelParentID, ".", false, cleanupFormValues, true)[panelParentID]