var Settings = { showAdvanced: false }; var viewHelpers = { getFormGroup: function(groupName, setting, values, isAdvanced, isLocked) { setting_id = groupName + "_" + setting.name form_group = "
" if (_.has(values, groupName) && _.has(values[groupName], setting.name)) { setting_value = values[groupName][setting.name] } else if (_.has(setting, 'default')) { setting_value = setting.default } else { setting_value = "" } label_class = 'control-label' if (isLocked) { label_class += ' locked' } if (setting.type === 'checkbox') { form_group += "" form_group += "
" form_group += ""; form_group += "
" } else { input_type = _.has(setting, 'type') ? setting.type : "text" form_group += ""; form_group += "" form_group += "" + setting.help + "" } form_group += "
" return form_group } } $(document).ready(function(){ /* * Clamped-width. * Usage: *
This long content will force clamped width
* * Author: LV */ $('[data-clampedwidth]').each(function () { var elem = $(this); var parentPanel = elem.data('clampedwidth'); var resizeFn = function () { var sideBarNavWidth = $(parentPanel).width() - parseInt(elem.css('paddingLeft')) - parseInt(elem.css('paddingRight')) - parseInt(elem.css('marginLeft')) - parseInt(elem.css('marginRight')) - parseInt(elem.css('borderLeftWidth')) - parseInt(elem.css('borderRightWidth')); elem.css('width', sideBarNavWidth); }; resizeFn(); $(window).resize(resizeFn); }) $('#settings-form').on('change', 'input', function(){ // this input was changed, add the changed data attribute to it $(this).attr('data-changed', true) badgeSidebarForDifferences($(this)) }) $('#advanced-toggle-button').click(function(){ Settings.showAdvanced = !Settings.showAdvanced var advancedSelector = $('.advanced-setting') if (Settings.showAdvanced) { advancedSelector.show() $(this).html("Hide advanced") } else { advancedSelector.hide() $(this).html("Show advanced") } $(this).blur() }) $('#settings-form').on('click', '#choose-domain-btn', function(){ // setup the modal to help user pick their domain if (Settings.initialValues.metaverse["access-token"]) { } else { } }) var panelsSource = $('#panels-template').html() Settings.panelsTemplate = _.template(panelsSource) var sidebarTemplate = $('#list-group-template').html() Settings.sidebarTemplate = _.template(sidebarTemplate) // $('body').scrollspy({ target: '#setup-sidebar'}) reloadSettings() }) function reloadSettings() { $.getJSON('/settings.json', function(data){ _.extend(data, viewHelpers) $('.nav-stacked').html(Settings.sidebarTemplate(data)) $('#panels').html(Settings.panelsTemplate(data)) Settings.initialValues = form2js('settings-form', "_", false, cleanupFormValues, true); // add tooltip to locked settings $('label.locked').tooltip({ placement: 'right', title: 'This setting is in the master config file and cannot be changed' }) appendDomainSelectionModal() }); } function appendDomainSelectionModal() { var metaverseFormGroup = $('#metaverse_id').parent('.form-group'); var chooseButton = ""; metaverseFormGroup.append(chooseButton); } var SETTINGS_ERROR_MESSAGE = "There was a problem saving domain settings. Please try again!"; $('body').on('click', '.save-button', function(e){ // disable any inputs not changed $("input:not([data-changed])").each(function(){ $(this).prop('disabled', true); }); // grab a JSON representation of the form via form2js var formJSON = form2js('settings-form', "_", false, cleanupFormValues, true); // re-enable all inputs $("input").each(function(){ $(this).prop('disabled', false); }); // remove focus from the button $(this).blur() // POST the form JSON to the domain-server settings.json endpoint so the settings are saved $.ajax('/settings.json', { data: JSON.stringify(formJSON), contentType: 'application/json', type: 'POST' }).done(function(data){ if (data.status == "success") { showRestartModal(); } else { showAlertMessage(SETTINGS_ERROR_MESSAGE, false); reloadSettings(); } }).fail(function(){ showAlertMessage(SETTINGS_ERROR_MESSAGE, false); reloadSettings(); }); return false; }); function badgeSidebarForDifferences(changedInput) { // figure out which group this input is in 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 badgeValue = 0 for (var setting in panelJSON) { if (panelJSON[setting] != Settings.initialValues[panelParentID][ setting]) { badgeValue += 1 } } // update the list-group-item badge to have the new value if (badgeValue == 0) { badgeValue = "" } $("a[href='#" + panelParentID + "'] .badge").html(badgeValue); } function showRestartModal() { $('#restart-modal').modal({ backdrop: 'static', keyboard: false }); var secondsElapsed = 0; var numberOfSecondsToWait = 3; var refreshSpan = $('span#refresh-time') refreshSpan.html(numberOfSecondsToWait + " seconds"); // call ourselves every 1 second to countdown var refreshCountdown = setInterval(function(){ secondsElapsed++; secondsLeft = numberOfSecondsToWait - secondsElapsed refreshSpan.html(secondsLeft + (secondsLeft == 1 ? " second" : " seconds")) if (secondsElapsed == numberOfSecondsToWait) { location.reload(true); clearInterval(refreshCountdown); } }, 1000); } function cleanupFormValues(node) { if (node.type && node.type === 'checkbox') { return { name: node.id, value: node.checked ? true : false }; } else { return false; } } function showAlertMessage(message, isSuccess) { var alertBox = $('.alert'); alertBox.attr('class', 'alert'); alertBox.addClass(isSuccess ? 'alert-success' : 'alert-danger'); alertBox.html(message); alertBox.fadeIn(); }