X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Rakka.git;a=blobdiff_plain;f=js%2FsystemConfig.js;h=64f6a39e4d6522fb6121fbc7028a05f089db4c66;hp=5ea6393aa40b54ea7df2f9afb5c7d0cd68a781be;hb=5a3f557daf089aa68dc725e132befbc9c131dc2c;hpb=cddd833c65cdd8092588bd3bdfe2b9153848302f diff --git a/js/systemConfig.js b/js/systemConfig.js index 5ea6393..64f6a39 100644 --- a/js/systemConfig.js +++ b/js/systemConfig.js @@ -1,75 +1,102 @@ (function () { - var identityDecoder = function (src) { - return src; - }; + var identityDecoder = function (src) { + return src; + }; - var identityEncoder = function (src) { - return src; - }; + var identityEncoder = function (src) { + return src; + }; - var mapDecoder = function (src) { - var map = {}; - var lines = src.split(/\n/); + var mapDecoder = function (src) { + var map = {}; + var lines = src.split(/\n/); - $.each(lines, function () { - var m = this.match(/^(\S+)\s+(\S+)$/); + $.each(lines, function () { + var m = this.match(/^(\S+)\s+(\S+)$/); - map[ m[1] ] = m[2]; - }); + map[ m[1] ] = m[2]; + }); - return map; - }; + return map; + }; - var mapEncoder = function (map) { - var lines = []; + var mapEncoder = function (map) { + var lines = []; - $.each(map, function (key) { - lines.push(key + " " + this); - }); + $.each(map, function (key) { + lines.push(key + " " + this); + }); - return lines.join("\n"); - }; + return lines.join("\n"); + }; - var boolDecoder = function (src) { - return src == "*"; - }; + var boolDecoder = function (src) { + return src == "*"; + }; - var boolEncoder = function (bool) { - return bool ? "*" : ""; - }; + var boolEncoder = function (bool) { + return bool ? "*" : ""; + }; - var decoder_of = { - siteName : identityDecoder, - baseURI : identityDecoder, - defaultPage: identityDecoder, - styleSheet : identityDecoder, - languages : mapDecoder, - globalLock : boolDecoder - }; + 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 encoder_of = { + siteName : identityEncoder, + baseURI : identityEncoder, + defaultPage: identityEncoder, + styleSheet : identityEncoder, + languages : mapEncoder, + globalLock : boolEncoder + }; - var cachedConf = null; + var cachedConf = null; - var isValidBaseURI = function (str) { - parseUri.options.strictMode = true; - var uri = parseUri(str); + 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 == ""); - }; + 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.getUserList = function () { + var users = []; + + $.ajax({ + type: "GET", + url: Rakka.baseURI + "users", + async: false, + beforeSend: function (req) { + Rakka.setAuthorization(req); + }, + success: function (xml) { + $(xml).find("user").each(function () { + users.push(this.getAttribute("id")); + }); + }, + error: function (req) { + throw new Error(req.status + " " + req.statusText); + } + }); + + return users; + }; Rakka.getSystemConfig = function () { if (cachedConf != null) { @@ -104,11 +131,9 @@ return conf; }; - Rakka.showConfigPanel = function () { - var conf = Rakka.getSystemConfig(); - var $area = Rakka.switchScreen(); - - $area.append($.H1({}, "Configuration")); + var appendConfigPanel = function ($area) { + var conf = Rakka.getSystemConfig(); + $area.append($.H1({}, "Configuration")); var fldSiteName = $.INPUT({type: "text", value: conf.siteName}); @@ -131,9 +156,64 @@ 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({}, @@ -177,6 +257,18 @@ 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; })(); @@ -200,11 +292,92 @@ $area.append(configPanel); }; - $(document).ready(function () { - $("input.configButton") - .click(function () { - Rakka.showConfigPanel(); - }); - }); + var appendUsersPanel = function ($area) { + $area.append($.H2({}, "Users")); + $area.append($.H3({}, "Existing Users")); + + var tbody = $.TBODY(); + + var usersPanel + = $.TABLE({className: "pageEditor"}, + $.THEAD({}, + $.TR({}, + $.TH({}, "User ID"), + $.TH({}, "Change Password"), + $.TH({}, "Delete User") + ) + ), + tbody + ); + + var updateUserList = function () { + var users = Rakka.getUserList(); + + $(tbody).empty(); + + for (var i = 0; i < users.length; i++) { + var pass1 = $.INPUT({type: "password"}); + var pass2 = $.INPUT({type: "password"}); + var change = $.INPUT({type: "button", value: "Change"}); + + var chpass = $.TABLE({className: "pageEditor"}, + $.TR({}, + $.TD({}, pass1), + $.TD({rowSpan: 2}, change)), + $.TR({}, + $.TD({}, pass2))); + + var delUser = $.INPUT({type: "button", value: "Delete"}); + + $.each(users, function () { + var id = users[i]; + var tr = $.TR({}, + $.TD({}, id), + $.TD({}, chpass), + $.TD({}, delUser) + ); + tbody.appendChild(tr); + }); + } + }; + updateUserList(); + + $area.append(usersPanel); + + $area.append($.H3({}, "Add new user")); + + var userID = $.INPUT({type: "text"}); + var pass1 = $.INPUT({type: "password"}); + var pass2 = $.INPUT({type: "password"}); + var addUser = $.INPUT({type: "button", value: "Add"}); + var addUserPanel = $.TABLE({className: "pageEditor"}, + $.TR({}, + $.TH({}, "User ID"), + $.TD({}, userID)), + $.TR({}, + $.TH({}, "Password"), + $.TD({}, pass1)), + $.TR({}, + $.TH({}, "Password (retype)"), + $.TD({}, pass2)), + $.TR({}, + $.TH({}), + $.TD({}, addUser))); + + $area.append(addUserPanel); + }; + + Rakka.showConfigPanel = function () { + var $area = Rakka.switchScreen(); + + appendConfigPanel($area); + appendUsersPanel($area); + }; + $(document).ready(function () { + $("input.configButton") + .click(function () { + Rakka.showConfigPanel(); + }); + }); })(); \ No newline at end of file