From 2944d76ef07bd2eeaed683f10dc49760f9198bed Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 26 Oct 2017 16:54:46 -0700 Subject: [PATCH] Update settings with auto domain creation and restart --- domain-server/resources/web/favicon.ico | Bin 0 -> 5430 bytes domain-server/resources/web/js/shared.js | 321 ++++++++++++++++ .../resources/web/settings/index.shtml | 1 + .../resources/web/settings/js/settings.js | 357 ++++-------------- domain-server/src/DomainServer.cpp | 36 +- 5 files changed, 421 insertions(+), 294 deletions(-) create mode 100644 domain-server/resources/web/favicon.ico create mode 100644 domain-server/resources/web/js/shared.js diff --git a/domain-server/resources/web/favicon.ico b/domain-server/resources/web/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..becc1b8e8b5bc3bd677093a21f348fe077c712a6 GIT binary patch literal 5430 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 literal 0 HcmV?d00001 diff --git a/domain-server/resources/web/js/shared.js b/domain-server/resources/web/js/shared.js new file mode 100644 index 0000000000..4e2392f0bb --- /dev/null +++ b/domain-server/resources/web/js/shared.js @@ -0,0 +1,321 @@ +Settings = { + showAdvanced: false, + METAVERSE_URL: 'https://staging.highfidelity.com', + ADVANCED_CLASS: 'advanced-setting', + DEPRECATED_CLASS: 'deprecated-setting', + TRIGGER_CHANGE_CLASS: 'trigger-change', + DATA_ROW_CLASS: 'value-row', + DATA_COL_CLASS: 'value-col', + DATA_CATEGORY_CLASS: 'value-category', + ADD_ROW_BUTTON_CLASS: 'add-row', + ADD_ROW_SPAN_CLASSES: 'glyphicon glyphicon-plus add-row', + DEL_ROW_BUTTON_CLASS: 'del-row', + DEL_ROW_SPAN_CLASSES: 'glyphicon glyphicon-remove del-row', + ADD_CATEGORY_BUTTON_CLASS: 'add-category', + ADD_CATEGORY_SPAN_CLASSES: 'glyphicon glyphicon-plus add-category', + TOGGLE_CATEGORY_COLUMN_CLASS: 'toggle-category', + TOGGLE_CATEGORY_SPAN_CLASS: 'toggle-category-icon', + TOGGLE_CATEGORY_SPAN_CLASSES: 'glyphicon toggle-category-icon', + TOGGLE_CATEGORY_EXPANDED_CLASS: 'glyphicon-triangle-bottom', + TOGGLE_CATEGORY_CONTRACTED_CLASS: 'glyphicon-triangle-right', + DEL_CATEGORY_BUTTON_CLASS: 'del-category', + DEL_CATEGORY_SPAN_CLASSES: 'glyphicon glyphicon-remove del-category', + MOVE_UP_BUTTON_CLASS: 'move-up', + MOVE_UP_SPAN_CLASSES: 'glyphicon glyphicon-chevron-up move-up', + MOVE_DOWN_BUTTON_CLASS: 'move-down', + MOVE_DOWN_SPAN_CLASSES: 'glyphicon glyphicon-chevron-down move-down', + TABLE_BUTTONS_CLASS: 'buttons', + ADD_DEL_BUTTONS_CLASS: 'add-del-buttons', + ADD_DEL_BUTTONS_CLASSES: 'buttons add-del-buttons', + REORDER_BUTTONS_CLASS: 'reorder-buttons', + REORDER_BUTTONS_CLASSES: 'buttons reorder-buttons', + NEW_ROW_CLASS: 'new-row', + CONNECT_ACCOUNT_BTN_ID: 'connect-account-btn', + DISCONNECT_ACCOUNT_BTN_ID: 'disconnect-account-btn', + CREATE_DOMAIN_ID_BTN_ID: 'create-domain-btn', + CHOOSE_DOMAIN_ID_BTN_ID: 'choose-domain-btn', + GET_TEMPORARY_NAME_BTN_ID: 'get-temp-name-btn', + DOMAIN_ID_SELECTOR: '[name="metaverse.id"]', + ACCESS_TOKEN_SELECTOR: '[name="metaverse.access_token"]', + PLACES_TABLE_ID: 'places-table', + ADD_PLACE_BTN_ID: 'add-place-btn', + FORM_ID: 'settings-form', + INVALID_ROW_CLASS: 'invalid-input', + DATA_ROW_INDEX: 'data-row-index' +}; + +Strings = { + LOADING_SETTINGS_ERROR: "There was a problem loading the domain settings.\nPlease refresh the page to try again.", + + CHOOSE_DOMAIN_BUTTON: "Choose from my domains", + CREATE_DOMAIN_BUTTON: "Create new domain ID", + CREATE_DOMAIN_SUCCESS_JUST_CONNECTED: "We connnected your High Fidelity account and created a new domain ID for this machine.", + CREATE_DOMAIN_SUCCESS: "We created a new domain ID for this machine.", + + // When a place modification fails, they will be brought back to the previous + // dialog with new path still set, allowing them to retry immediately, and without + // having to type the new path in again. + EDIT_PLACE_TITLE: "Modify Viewpoint or Path", + EDIT_PLACE_ERROR: "Failed to update place path. Please try again.", + EDIT_PLACE_CONFIRM_BUTTON: "Save", + EDIT_PLACE_CONFIRM_BUTTON_PENDING: "Saving...", + EDIT_PLACE_CANCEL_BUTTON: "Cancel", + + REMOVE_PLACE_TITLE: "Are you sure you want to remove {{place}}?", + REMOVE_PLACE_ERROR: "Failed to remove place. Please try again.", + REMOVE_PLACE_DELETE_BUTTON: "Delete", + REMOVE_PLACE_DELETE_BUTTON_PENDING: "Deleting...", + REMOVE_PLACE_CANCEL_BUTTON: "Cancel", + + ADD_PLACE_TITLE: "Choose a place", + ADD_PLACE_MESSAGE: "Choose the High Fidelity place to point at this domain server.", + ADD_PLACE_CONFIRM_BUTTON: "Choose place", + ADD_PLACE_CONFIRM_BUTTON_PENDING: "Saving...", + ADD_PLACE_CANCEL_BUTTON: "Cancel", + ADD_PLACE_UNKNOWN_ERROR: "There was an error adding this place name.", + + ADD_PLACE_NO_PLACES_MESSAGE: "

You do not have any places in your High Fidelity account." + + "

Go to your places page to create a new one. Once your place is created re-open this dialog to select it.

", + ADD_PLACE_NO_PLACES_BUTTON: "Create new place", + ADD_PLACE_UNABLE_TO_LOAD_ERROR: "We were unable to load your place names. Please try again later.", + ADD_PLACE_LOADING_DIALOG: "Loading your places...", +}; + +var DOMAIN_ID_TYPE_NONE_OR_UNKNOWN = 0; +var DOMAIN_ID_TYPE_TEMP = 1; +var DOMAIN_ID_TYPE_FULL = 2; + +function getCurrentDomainIDType() { + if (typeof DomainInfo === 'undefined') { + return DOMAIN_ID_TYPE_NONE_OR_UNKNOWN; + } + if (DomainInfo !== null) { + if (DomainInfo.name !== undefined) { + return DOMAIN_ID_TYPE_TEMP; + } + return DOMAIN_ID_TYPE_FULL; + } + return DOMAIN_ID_TYPE_NONE_OR_UNKNOWN; +} + +function showLoadingDialog(msg) { + var message = '
'; + message += ' ' + msg; + message += '
'; + + return bootbox.dialog({ + message: message, + closeButton: false + }); +} + +function sendUpdatePlaceRequest(id, path, domainID, clearDomainID, onSuccess, onError) { + var data = { + place_id: id, + path: path + }; + if (domainID) { + data.domain_id = domainID; + } + if (clearDomainID) { + data.domain_id = null; + } + $.ajax({ + url: '/api/places', + type: 'PUT', + data: data, + success: onSuccess, + error: onError + }); +} + +function chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded) { + if (accessToken) { + + var loadingDialog = showLoadingDialog(Strings.ADD_PLACE_LOADING_DIALOG); + + $.ajax("/api/places", { + dataType: 'json', + jsonp: false, + success: function(data) { + if (data.status == 'success') { + var modal_buttons = { + cancel: { + label: Strings.ADD_PLACE_CANCEL_BUTTON, + className: 'add-place-cancel-button btn-default' + } + }; + + var dialog; + var modal_body; + + if (data.data.places.length) { + var places_by_id = {}; + + modal_body = $('
'); + + var currentDomainIDType = getCurrentDomainIDType(); + if (currentDomainIDType === DOMAIN_ID_TYPE_TEMP) { + var warning = "
"; + warning += "If you choose a place name it will replace your current temporary place name."; + warning += "
"; + modal_body.append(warning); + } + + // setup a select box for the returned places + modal_body.append($("")); + place_select = $(""); + _.each(data.data.places, function(place) { + places_by_id[place.id] = place; + place_select.append(""); + }) + modal_body.append(place_select); + modal_body.append($("")); + + if (forcePathTo === undefined || forcePathTo === null) { + var path = "
"; + path += ""; + path += ""; + path += "
"; + modal_body.append($(path)); + } + + var place_select = modal_body.find("#place-name-select") + place_select.change(function(ev) { + var warning = modal_body.find("#place-name-warning"); + var place = places_by_id[$(this).val()]; + console.log(warning, place, $(this).val()); + if (place === undefined || place.pointee === null) { + warning.hide(); + } else { + warning.show(); + } + }); + place_select.trigger('change'); + + modal_buttons["success"] = { + label: Strings.ADD_PLACE_CONFIRM_BUTTON, + className: 'add-place-confirm-button btn btn-primary', + callback: function() { + var placeID = $('#place-name-select').val() + // set the place ID on the form + $(Settings.place_ID_SELECTOR).val(placeID).change(); + + if (forcePathTo === undefined || forcePathTo === null) { + var placePath = $('#place-path-input').val(); + } else { + var placePath = forcePathTo; + } + + $('.add-place-confirm-button').attr('disabled', 'disabled'); + $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON_PENDING); + $('.add-place-cancel-button').attr('disabled', 'disabled'); + + function finalizeSaveDomainID(domainID) { + var jsonSettings = { + metaverse: { + id: domainID + } + } + var dialog = showLoadingDialog("Waiting for Domain Server to restart..."); + $.ajax('/settings.json', { + data: JSON.stringify(jsonSettings), + contentType: 'application/json', + type: 'POST' + }).done(function(data) { + if (data.status == "success") { + waitForDomainServerBackUp(function() { + dialog.modal('hide'); + if (onSuccessfullyAdded) { + onSuccessfullyAdded(places_by_id[placeID].name, domainID); + } + }); + } else { + bootbox.alert("Failed to add place"); + } + }).fail(function() { + bootbox.alert("Failed to add place"); + }); + } + + function finishSettingUpPlace(domainID) { + sendUpdatePlaceRequest( + placeID, + placePath, + domainID, + false, + function(data) { + $(Settings.DOMAIN_ID_SELECTOR).val(domainID).change(); + dialog.modal('hide') + if (domainID) { + finalizeSaveDomainID(domainID); + } else { + if (onSuccessfullyAdded) { + onSuccessfullyAdded(places_by_id[placeID].name); + } + } + }, + function(data) { + $('.add-place-confirm-button').removeAttr('disabled'); + $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON); + $('.add-place-cancel-button').removeAttr('disabled'); + bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR); + } + ); + } + + if (currentDomainIDType === DOMAIN_ID_TYPE_FULL) { + finishSettingUpPlace(); + } else { + sendCreateDomainRequest(function(domainID) { + console.log("Created domain", domainID); + finishSettingUpPlace(domainID); + }, function() { + $('.add-place-confirm-button').removeAttr('disabled'); + $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON); + $('.add-place-cancel-button').removeAttr('disabled'); + bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR); + bootbox.alert("FAIL"); + }); + } + + + return false; + } + } + } else { + modal_buttons["success"] = { + label: Strings.ADD_PLACE_NO_PLACES_BUTTON, + callback: function() { + window.open(Settings.METAVERSE_URL + "/user/places", '_blank'); + } + } + modal_body = Strings.ADD_PLACE_NO_PLACES_MESSAGE; + } + + dialog = bootbox.dialog({ + title: Strings.ADD_PLACE_TITLE, + message: modal_body, + closeButton: false, + buttons: modal_buttons + }); + } else { + bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR); + } + }, + error: function() { + bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR); + }, + complete: function() { + loadingDialog.modal('hide'); + } + }); + + } else { + bootbox.alert({ + message: "You must have an access token to query your High Fidelity places.

" + + "Please follow the instructions on the settings page to add an access token.", + title: "Access token required" + }) + } +} diff --git a/domain-server/resources/web/settings/index.shtml b/domain-server/resources/web/settings/index.shtml index d4c716f6f2..d5b0b1f96a 100644 --- a/domain-server/resources/web/settings/index.shtml +++ b/domain-server/resources/web/settings/index.shtml @@ -87,6 +87,7 @@ + diff --git a/domain-server/resources/web/settings/js/settings.js b/domain-server/resources/web/settings/js/settings.js index 8de48fa666..ac8ee40481 100644 --- a/domain-server/resources/web/settings/js/settings.js +++ b/domain-server/resources/web/settings/js/settings.js @@ -1,86 +1,3 @@ -var Settings = { - showAdvanced: false, - METAVERSE_URL: 'https://staging.highfidelity.com', - ADVANCED_CLASS: 'advanced-setting', - DEPRECATED_CLASS: 'deprecated-setting', - TRIGGER_CHANGE_CLASS: 'trigger-change', - DATA_ROW_CLASS: 'value-row', - DATA_COL_CLASS: 'value-col', - DATA_CATEGORY_CLASS: 'value-category', - ADD_ROW_BUTTON_CLASS: 'add-row', - ADD_ROW_SPAN_CLASSES: 'glyphicon glyphicon-plus add-row', - DEL_ROW_BUTTON_CLASS: 'del-row', - DEL_ROW_SPAN_CLASSES: 'glyphicon glyphicon-remove del-row', - ADD_CATEGORY_BUTTON_CLASS: 'add-category', - ADD_CATEGORY_SPAN_CLASSES: 'glyphicon glyphicon-plus add-category', - TOGGLE_CATEGORY_COLUMN_CLASS: 'toggle-category', - TOGGLE_CATEGORY_SPAN_CLASS: 'toggle-category-icon', - TOGGLE_CATEGORY_SPAN_CLASSES: 'glyphicon toggle-category-icon', - TOGGLE_CATEGORY_EXPANDED_CLASS: 'glyphicon-triangle-bottom', - TOGGLE_CATEGORY_CONTRACTED_CLASS: 'glyphicon-triangle-right', - DEL_CATEGORY_BUTTON_CLASS: 'del-category', - DEL_CATEGORY_SPAN_CLASSES: 'glyphicon glyphicon-remove del-category', - MOVE_UP_BUTTON_CLASS: 'move-up', - MOVE_UP_SPAN_CLASSES: 'glyphicon glyphicon-chevron-up move-up', - MOVE_DOWN_BUTTON_CLASS: 'move-down', - MOVE_DOWN_SPAN_CLASSES: 'glyphicon glyphicon-chevron-down move-down', - TABLE_BUTTONS_CLASS: 'buttons', - ADD_DEL_BUTTONS_CLASS: 'add-del-buttons', - ADD_DEL_BUTTONS_CLASSES: 'buttons add-del-buttons', - REORDER_BUTTONS_CLASS: 'reorder-buttons', - REORDER_BUTTONS_CLASSES: 'buttons reorder-buttons', - NEW_ROW_CLASS: 'new-row', - CONNECT_ACCOUNT_BTN_ID: 'connect-account-btn', - DISCONNECT_ACCOUNT_BTN_ID: 'disconnect-account-btn', - CREATE_DOMAIN_ID_BTN_ID: 'create-domain-btn', - CHOOSE_DOMAIN_ID_BTN_ID: 'choose-domain-btn', - GET_TEMPORARY_NAME_BTN_ID: 'get-temp-name-btn', - DOMAIN_ID_SELECTOR: '[name="metaverse.id"]', - ACCESS_TOKEN_SELECTOR: '[name="metaverse.access_token"]', - PLACES_TABLE_ID: 'places-table', - ADD_PLACE_BTN_ID: 'add-place-btn', - FORM_ID: 'settings-form', - INVALID_ROW_CLASS: 'invalid-input', - DATA_ROW_INDEX: 'data-row-index' -}; - -var Strings = { - LOADING_SETTINGS_ERROR: "There was a problem loading the domain settings.\nPlease refresh the page to try again.", - - CHOOSE_DOMAIN_BUTTON: "Choose from my domains", - CREATE_DOMAIN_BUTTON: "Create new domain ID", - CREATE_DOMAIN_SUCCESS_JUST_CONNECTED: "We connnected your High Fidelity account and created a new domain ID for this machine.", - CREATE_DOMAIN_SUCCESS: "We created a new domain ID for this machine.", - - // When a place modification fails, they will be brought back to the previous - // dialog with new path still set, allowing them to retry immediately, and without - // having to type the new path in again. - EDIT_PLACE_TITLE: "Modify Viewpoint or Path", - EDIT_PLACE_ERROR: "Failed to update place path. Please try again.", - EDIT_PLACE_CONFIRM_BUTTON: "Save", - EDIT_PLACE_CONFIRM_BUTTON_PENDING: "Saving...", - EDIT_PLACE_CANCEL_BUTTON: "Cancel", - - REMOVE_PLACE_TITLE: "Are you sure you want to remove {{place}}?", - REMOVE_PLACE_ERROR: "Failed to remove place. Please try again.", - REMOVE_PLACE_DELETE_BUTTON: "Delete", - REMOVE_PLACE_DELETE_BUTTON_PENDING: "Deleting...", - REMOVE_PLACE_CANCEL_BUTTON: "Cancel", - - ADD_PLACE_TITLE: "Choose a place", - ADD_PLACE_MESSAGE: "Choose the High Fidelity place to point at this domain server.", - ADD_PLACE_CONFIRM_BUTTON: "Choose place", - ADD_PLACE_CONFIRM_BUTTON_PENDING: "Saving...", - ADD_PLACE_CANCEL_BUTTON: "Cancel", - ADD_PLACE_UNKNOWN_ERROR: "There was an error adding this place name.", - - ADD_PLACE_NO_PLACES_MESSAGE: "

You do not have any places in your High Fidelity account." - + "

Go to your places page to create a new one. Once your place is created re-open this dialog to select it.

", - ADD_PLACE_NO_PLACES_BUTTON: "Create new place", - ADD_PLACE_UNABLE_TO_LOAD_ERROR: "We were unable to load your place names. Please try again later.", - ADD_PLACE_LOADING_DIALOG: "Loading your places...", -}; - var DomainInfo = null; var viewHelpers = { @@ -631,10 +548,10 @@ function showDomainCreationAlert(justConnected) { //function createDomainID() -function createNewDomainID(description, justConnected) { +function createNewDomainID(label, justConnected) { // get the JSON object ready that we'll use to create a new domain var domainJSON = { - "label": description + "label": label //"access_token": $(Settings.ACCESS_TOKEN_SELECTOR).val() } @@ -736,19 +653,19 @@ function setupDomainLabelSetting() { } var html = "
" - html += "Specify a label for your domain"; + html += " Edit"; html += ""; html += "
"; - var link = $("Edit"); + html = $(html); - link.click(function(ev) { + html.find('a').click(function(ev) { ev.preventDefault(); - var label = "temp"; - var modal_body = "
"; + var label = DomainInfo.label === null ? "" : DomainInfo.label; + var modal_body = "
"; modal_body += ""; - modal_body += ""; + modal_body += ""; modal_body += "
"; modal_body += "
"; @@ -769,7 +686,7 @@ function setupDomainLabelSetting() { className: 'edit-label-save-btn btn btn-primary', callback: function() { var data = { - description: $('#domain-label-input').val() + label: $('#domain-label-input').val() }; $('.edit-label-cancel-btn').attr('disabled', 'disabled'); @@ -792,9 +709,7 @@ function setupDomainLabelSetting() { if (data.status === "fail") { for (var key in data.data) { var errorMsg = data.data[key]; - console.log(key, errorMsg); var errorEl = $('.error-message[data-property="' + key + '"'); - console.log(errorEl); errorEl.html(errorMsg); errorEl.show(); } @@ -814,8 +729,6 @@ function setupDomainLabelSetting() { }); }); - html = $(html).append(link); - var spinner = createDomainSpinner(); var errorEl = createDomainLoadingError("Error loading label."); @@ -824,7 +737,6 @@ function setupDomainLabelSetting() { $('div#label .panel-body').append(errorEl); $('div#label .panel-body').append(html); - console.log($('div#label .panel-body')); } function setupDomainNetworkingSettings() { @@ -1004,7 +916,9 @@ function setupPlacesTable() { var temporaryPlaceButton = dynamicButton(Settings.GET_TEMPORARY_NAME_BTN_ID, 'Get a temporary place name'); $('#' + Settings.PLACES_TABLE_ID).after(temporaryPlaceButton); } - + if (accessTokenIsSet()) { + appendAddButtonToPlacesTable(); + } } function placeTableRow(name, path, isTemporary, placeID) { @@ -1076,7 +990,7 @@ function placeTableRowForPlaceObject(place) { return placeTableRow(place.name, placePathOrIndex, false, place.id); } -function getDomainFromAPI(callback) { +function getDomainFromAPI2(callback) { // we only need to do this if we have a current domain ID var domainID = Settings.data.values.metaverse.id; if (domainID.length > 0) { @@ -1086,6 +1000,20 @@ function getDomainFromAPI(callback) { } } +function getDomainFromAPI(callback) { + var domainID = Settings.data.values.metaverse.id; + $.ajax({ + url: "/api/domains/" + domainID, + dataType: 'json', + success: function(data) { + callback(data); + }, + error: function() { + callback(data); + } + }); +} + function reloadDomainInfo() { $('#' + Settings.PLACES_TABLE_ID + " tbody tr").not('.headers').remove(); @@ -1113,15 +1041,7 @@ function reloadDomainInfo() { $('#' + Settings.PLACES_TABLE_ID + " tbody").append(placeTableRow(data.domain.name, '/', true)); } - var row = $(" "); - - row.find(".place-add").click(function(ev) { - chooseFromHighFidelityPlaces(Settings.initialValues.metaverse.access_token, null, function() { - reloadDomainInfo(); - }); - }); - - var label = data.domain.description; + var label = data.domain.label; label = label === null ? '' : label; $('#network-label').val(label); var autoNetworkingSetting = Settings.data.values.metaverse.automatic_networking; @@ -1133,7 +1053,8 @@ function reloadDomainInfo() { $('#network-address-port input').val(address); } - $('#' + Settings.PLACES_TABLE_ID + " tbody").append(row); + appendAddButtonToPlacesTable(); + } else { DomainInfo = null; $('.domain-loading-error').show(); @@ -1165,7 +1086,7 @@ function sendCreateDomainRequest(onSuccess, onError) { $.ajax({ url: '/api/domains', type: 'POST', - data: { label: "TEST" }, + data: { label: "" }, success: function(data) { //if (data.status === 'success') { onSuccess(data.domain_id); @@ -1177,26 +1098,6 @@ function sendCreateDomainRequest(onSuccess, onError) { }); } -function sendUpdatePlaceRequest(id, path, domainID, clearDomainID, onSuccess, onError) { - var data = { - place_id: id, - path: path - }; - if (domainID) { - data.domain_id = domainID; - } - if (clearDomainID) { - data.domain_id = null; - } - $.ajax({ - url: '/api/places', - type: 'PUT', - data: data, - success: onSuccess, - error: onError - }); -} - function editHighFidelityPlace(placeID, name, path) { var dialog; @@ -1257,167 +1158,22 @@ function editHighFidelityPlace(placeID, name, path) { }) } -function showLoadingDialog() { - var message = '
'; - message += ' ' + Strings.ADD_PLACE_LOADING_DIALOG; - message += '
'; - - return bootbox.dialog({ - message: message, - closeButton: false - }); -} - -function chooseFromHighFidelityPlaces(accessToken, forcePathTo, onSuccessfullyAdded) { - if (accessToken) { - - var loadingDialog = showLoadingDialog(); - - $.ajax("/api/places", { - dataType: 'json', - jsonp: false, - success: function(data) { - if (data.status == 'success') { - var modal_buttons = { - cancel: { - label: Strings.ADD_PLACE_CANCEL_BUTTON, - className: 'add-place-cancel-button btn-default' - } - }; - - var dialog; - var modal_body; - - if (data.data.places.length) { - var places_by_id = {}; - - // setup a select box for the returned places - modal_body = $('
'); - modal_body.append($("")); - place_select = $(""); - _.each(data.data.places, function(place) { - places_by_id[place.id] = place; - place_select.append(""); - }) - modal_body.append(place_select); - modal_body.append($("")); - - if (forcePathTo === undefined || forcePathTo === null) { - var path = "
"; - path += ""; - path += ""; - path += "
"; - modal_body.append($(path)); - } - - console.log(modal_body, modal_body.find("#place-name-select")); - var place_select = modal_body.find("#place-name-select") - place_select.change(function(ev) { - var warning = modal_body.find("#place-name-warning"); - var place = places_by_id[$(this).val()]; - console.log(warning, place, $(this).val()); - if (place === undefined || place.pointee === null) { - warning.hide(); - } else { - warning.show(); - } - }); - place_select.trigger('change'); - - modal_buttons["success"] = { - label: Strings.ADD_PLACE_CONFIRM_BUTTON, - className: 'add-place-confirm-button btn btn-primary', - callback: function() { - var placeID = $('#place-name-select').val() - // set the place ID on the form - $(Settings.place_ID_SELECTOR).val(placeID).change(); - - if (forcePathTo === undefined || forcePathTo === null) { - var placePath = $('#place-path-input').val(); - } else { - var placePath = forcePathTo; - } - - $('.add-place-confirm-button').attr('disabled', 'disabled'); - $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON_PENDING); - $('.add-place-cancel-button').attr('disabled', 'disabled'); - - function finishSettingUpPlace(domainID) { - sendUpdatePlaceRequest( - placeID, - placePath, - domainID, - false, - function(data) { - $(Settings.DOMAIN_ID_SELECTOR).val(domainID).change(); - dialog.modal('hide') - if (onSuccessfullyAdded) { - onSuccessfullyAdded(places_by_id[placeID].name); - } - saveSettings(); - }, - function(data) { - $('.add-place-confirm-button').removeAttr('disabled'); - $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON); - $('.add-place-cancel-button').removeAttr('disabled'); - bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR); - } - ); - } - - if (domainIDIsSet()) { - finishSettingUpPlace(); - } else { - sendCreateDomainRequest(function(domainID) { - finishSettingUpPlace(domainID); - }, function() { - $('.add-place-confirm-button').removeAttr('disabled'); - $('.add-place-confirm-button').html(Strings.ADD_PLACE_CONFIRM_BUTTON); - $('.add-place-cancel-button').removeAttr('disabled'); - bootbox.alert(Strings.ADD_PLACE_UNKNOWN_ERROR); - bootbox.alert("FAIL"); - }); - } - - - return false; - } - } - } else { - modal_buttons["success"] = { - label: Strings.ADD_PLACE_NO_PLACES_BUTTON, - callback: function() { - window.open(Settings.METAVERSE_URL + "/user/places", '_blank'); - } - } - modal_body = Strings.ADD_PLACE_NO_PLACES_MESSAGE; - } - - dialog = bootbox.dialog({ - title: Strings.ADD_PLACE_TITLE, - message: modal_body, - closeButton: false, - buttons: modal_buttons - }); - } else { - bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR); +function appendAddButtonToPlacesTable() { + var addRow = $(" "); + addRow.find(".place-add").click(function(ev) { + ev.preventDefault(); + chooseFromHighFidelityPlaces(Settings.initialValues.metaverse.access_token, null, function(placeName, newDomainID) { + if (newDomainID) { + Settings.data.values.metaverse.id = newDomainID; + var domainIDEl = $("[data-keypath='metaverse.id']"); + domainIDEl.val(newDomainID); + Settings.initialValues.metaverse.id = newDomainID; + badgeSidebarForDifferences(domainIDEl); } - }, - error: function() { - bootbox.alert(Strings.ADD_PLACE_UNABLE_TO_LOAD_ERROR); - }, - complete: function() { - loadingDialog.modal('hide'); - } + reloadDomainInfo(); + }); }); - - } else { - bootbox.alert({ - message: "You must have an access token to query your High Fidelity places.

" + - "Please follow the instructions on the settings page to add an access token.", - title: "Access token required" - }) - } + $('#' + Settings.PLACES_TABLE_ID + " tbody").append(addRow); } function chooseFromHighFidelityDomains(clickedButton) { @@ -1449,8 +1205,8 @@ function chooseFromHighFidelityDomains(clickedButton) { _.each(data.data.domains, function(domain){ var domainString = ""; - if (domain.description) { - domainString += '"' + domain.description+ '" - '; + if (domain.label) { + domainString += '"' + domain.label+ '" - '; } domainString += domain.id; @@ -1544,6 +1300,24 @@ function createTemporaryDomain() { }); } +function waitForDomainServerBackUp(callback) { + function checkForDomainUp() { + $.ajax('', { + success: function() { + console.log("Domain is back up"); + callback(); + }, + error: function() { + setTimeout(checkForDomainUp, 50); + console.log("Fail"); + } + }); + } + + setTimeout(checkForDomainUp, 10); + +} + function reloadSettings(callback) { $.getJSON('/settings.json', function(data){ _.extend(data, viewHelpers) @@ -1723,6 +1497,7 @@ function saveSettings() { if (canPost) { if (formJSON["security"]) { var username = formJSON["security"]["http_username"]; + var password = formJSON["security"]["http_password"]; if ((password == sha256_digest("")) && (username == undefined || (username && username.length != 0))) { diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index aac921c90a..b32e0873d9 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1754,6 +1754,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url const QString URI_RESTART = "/restart"; const QString URI_API_PLACES = "/api/places"; const QString URI_API_DOMAINS = "/api/domains"; + const QString URI_API_DOMAINS_ID = "/api/domains/"; const QString UUID_REGEX_STRING = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"; @@ -1923,6 +1924,35 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url url.setQuery("access_token=" + accessTokenVariant->toString()); + qDebug() << "Sending request to " << url; + + QNetworkRequest req(url); + req.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); + QNetworkReply* reply = NetworkAccessManager::getInstance().get(req); + + connect(reply, &QNetworkReply::finished, this, [reply, connection]() { + if (reply->error() != QNetworkReply::NoError) { + qDebug() << reply << reply->errorString() << reply->readAll(); + connection->respond(HTTPConnection::StatusCode500, reply->readAll()); + return; + } + + static const char* CONTENT_TYPE_JSON { "application/json" }; + connection->respond(HTTPConnection::StatusCode200, reply->readAll()); + }); + return true; + + } else if (url.path().startsWith(URI_API_DOMAINS_ID)) { + auto id = url.path().mid(URI_API_DOMAINS_ID.length()); + QUrl url { BASE_METAVERSE_URL + "/api/v1/domains/" + id }; + + auto accessTokenVariant = valueForKeyPath(_settingsManager.getSettingsMap(), ACCESS_TOKEN_KEY_PATH); + if (accessTokenVariant && accessTokenVariant->isValid()) { + url.setQuery("access_token=" + accessTokenVariant->toString()); + } + + qDebug() << "Sending request to " << url; + QNetworkRequest req(url); req.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT); QNetworkReply* reply = NetworkAccessManager::getInstance().get(req); @@ -2084,7 +2114,7 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url QJsonObject root { {"access_token", accessTokenVariant->toString()}, {"domain", - QJsonObject({ { "description", it.value() } }) + QJsonObject({ { "label", it.value() } }) } }; QJsonDocument doc { root }; @@ -2162,9 +2192,9 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url domainObj["network_port"] = port.isEmpty() ? QJsonValue::Null : QJsonValue(port); } - it = params.find("description"); + it = params.find("label"); if (it != params.end()) { - domainObj["description"] = it.value(); + domainObj["label"] = it.value(); }