X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=js%2FsystemConfig.js;h=5fc8303611cbb2df46c144bcbd9333228327759f;hb=52bafd675e7ac9d3fc9d3bf2d72e66a22efb6db9;hp=9dd7f9c280507c1da619c1693d4de43b66905f88;hpb=fb86cb6941e466fd43ce45338024c79d0fdb33a2;p=Rakka.git diff --git a/js/systemConfig.js b/js/systemConfig.js index 9dd7f9c..5fc8303 100644 --- a/js/systemConfig.js +++ b/js/systemConfig.js @@ -1,45 +1,88 @@ (function () { - var identityDecoder = function (src) { - return src; - }; + var identityDecoder = function (src) { + return src; + }; - var mapDecoder = function (src) { - var map = {}; - var lines = src.split(/\n/); - - $.each(lines, function () { - var m = this.match(/^(\S+)\s+(\S+)$/); + var identityEncoder = function (src) { + return src; + }; - map[ m[1] ] = m[2]; - }); + var mapDecoder = function (src) { + var map = {}; + var lines = src.split(/\n/); - return map; - }; + $.each(lines, function () { + var m = this.match(/^(\S+)\s+(\S+)$/); - var boolDecoder = function (src) { - return src == "*"; - }; + map[ m[1] ] = m[2]; + }); - var decoder_of = { - siteName : identityDecoder, - baseURI : identityDecoder, - defaultPage: identityDecoder, - styleSheet : identityDecoder, - languages : mapDecoder, - globalLock : boolDecoder - }; + return map; + }; + + var mapEncoder = function (map) { + var lines = []; + + $.each(map, function (key) { + lines.push(key + " " + this); + }); + + return lines.join("\n"); + }; + + var boolDecoder = function (src) { + return src == "*"; + }; + + var boolEncoder = function (bool) { + return bool ? "*" : ""; + }; - var cachedConf = null; + var decoder_of = { + siteName : identityDecoder, + baseURI : identityDecoder, + defaultPage: identityDecoder, + styleSheet : identityDecoder, + languages : mapDecoder, + globalLock : boolDecoder + }; + + var encoder_of = { + siteName : identityEncoder, + baseURI : identityEncoder, + defaultPage: identityEncoder, + styleSheet : identityEncoder, + languages : mapEncoder, + globalLock : boolEncoder + }; + + var cachedConf = null; + + var isValidBaseURI = function (str) { + parseUri.options.strictMode = true; + var uri = parseUri(str); + + return (uri.protocol != "" && + uri.authority != "" && + uri.path != "" && + uri.path.match(/\/$/) && + uri.query == "" && + uri.anchor == ""); + }; + + var isValidMap = function (src) { + return src.match(/^\S+\s+\S+(?:\n\S+\s+\S+)*\n?$/) != null; + }; Rakka.getSystemConfig = function () { if (cachedConf != null) { return cachedConf; } - + var conf = {}; cachedConf = conf; - + $.ajax({ type : "GET", url : Rakka.baseURI + "systemConfig", @@ -65,4 +108,174 @@ return conf; }; + Rakka.showConfigPanel = function () { + var conf = Rakka.getSystemConfig(); + var $area = Rakka.switchScreen(); + + $area.append($.H1({}, "Configuration")); + + var fldSiteName + = $.INPUT({type: "text", value: conf.siteName}); + + var fldBaseURI + = $.INPUT({type: "text", value: conf.baseURI}); + + var fldDefaultPage + = $.INPUT({type: "text", value: conf.defaultPage}); + + var fldStyleSheet + = $.INPUT({type: "text", value: conf.styleSheet}); + + var fldLanguages + = $.TEXTAREA({value: encoder_of.languages(conf.languages)}); + + var chkGlobalLock + = $.INPUT({type: "checkbox", checked: conf.globalLock}); + + var btnSave + = $.INPUT({type: "button", value: "Save"}); + + $(btnSave).click(function () { + var NS = "http://cielonegro.org/schema/Rakka/Config/1.0"; + var doc = document.implementation.createDocument(NS, "systemConfig", null); + var sc = doc.documentElement; + + var mkValue = function (path, value) { + var elem = doc.createElementNS(NS, "value"); + elem.setAttribute("path", path); + elem.appendChild(doc.createTextNode(value)); + return elem; + }; + + sc.appendChild(mkValue("siteName" , fldSiteName.value)); + sc.appendChild(mkValue("baseURI" , fldBaseURI.value)); + sc.appendChild(mkValue("defaultPage", fldDefaultPage.value)); + sc.appendChild(mkValue("styleSheet" , fldStyleSheet.value)); + sc.appendChild(mkValue("languages" , fldLanguages.value)); + sc.appendChild(mkValue("globalLock" , encoder_of["globalLock"](chkGlobalLock.checked))); + + Rakka.displayWaitingMessage("Submitting... please wait."); + + var url = Rakka.baseURI + "systemConfig"; + $.ajax({ type : "PUT", + url : url, + contentType: "text/xml", + data : doc, + processData: false, + beforeSend : function (req) { + Rakka.setAuthorization(req); + }, + success : function () { + cachedConf = null; + Rakka.hideWaitingMessage(); + Rakka.restoreScreen(); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + + var $area = Rakka.switchScreen(); + $area.text("Error: " + req.status + " " + req.statusText); + } + }); + }); + + var btnCancel + = $.INPUT({type: "button", value: "Cancel"}); + + $(btnCancel).click(function () { + if (isDirty) { + if (window.confirm("Do you really want to discard changes?")) { + Rakka.restoreScreen(); + } + } + else { + Rakka.restoreScreen(); + } + }); + + var configPanel + = $.TABLE({className: "pageEditor"}, + $.TBODY({}, + $.TR({}, + $.TH({}, "Site name"), + $.TD({}, fldSiteName) + ), + $.TR({}, + $.TH({}, "Base URI"), + $.TD({}, fldBaseURI) + ), + $.TR({}, + $.TH({}, "Default page"), + $.TD({}, fldDefaultPage) + ), + $.TR({}, + $.TH({}, "Style sheet"), + $.TD({}, fldStyleSheet) + ), + $.TR({}, + $.TH({}, "Languages"), + $.TD({}, fldLanguages) + ), + $.TR({}, + $.TH({}, "Global lock"), + $.TD({}, + $.LABEL({}, + chkGlobalLock, + "Disallow guest users to edit pages.")) + ), + $.TR({}, + $.TH({}), + $.TD({}, btnSave, btnCancel) + ) + ) + ); + + var validate = function () { + var isValid = (function () { + if (!isValidBaseURI(fldBaseURI.value)) { + return false; + } + + if (fldDefaultPage.value.match(Rakka.rePageName) == null) { + return false; + } + + if (fldStyleSheet.value.match(Rakka.rePageName) == null) { + return false; + } + + if (!isValidMap(fldLanguages.value)) { + return false; + } + + return true; + })(); + + $(btnSave).attr({disabled: (isValid ? "" : "disabled")}); + }; + + var isDirty = null; + var makeDirty = function () { + isDirty = true; + }; + + $(fldSiteName) + .add(fldBaseURI) + .add(fldDefaultPage) + .add(fldStyleSheet) + .add(fldLanguages) + .change(validate) + .keyup(validate) + .change(makeDirty); + + $area.append(configPanel); + }; + + $(document).ready(function () { + $("input.configButton") + .click(function () { + Rakka.showConfigPanel(); + }); + }); + })(); \ No newline at end of file