From 12fee1a46bbd4480c9d200205b2dc498f3d17938 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 27 Jan 2013 14:54:43 +0100 Subject: [PATCH 1/5] Added global settings for authorship-colors, line-numbers and font-type --- src/locales/en.json | 1 + src/node/db/Pad.js | 19 ++++++++++ src/node/handler/PadMessageHandler.js | 52 +++++++++++++++++++++++++++ src/static/css/pad.css | 4 +++ src/static/js/collab_client.js | 15 +++++++- src/static/js/pad.js | 33 ++++++++++++++--- src/static/js/pad_editor.js | 26 +++++++++++--- src/templates/pad.html | 16 +++++++++ 8 files changed, 156 insertions(+), 10 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index eea35cc53..7f351dd06 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -33,6 +33,7 @@ "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Global View", + "pad.settings.globalView.warning": "Warning: This will effect everyones view of this pad.", "pad.settings.language": "Language:", "pad.importExport.import_export": "Import/Export", "pad.importExport.import": "Upload any text file or document", diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index da1ce9e16..120cc1263 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -39,6 +39,7 @@ var Pad = function Pad(id) { this.chatHead = -1; this.publicStatus = false; this.passwordHash = null; + this.viewSettings = {}; this.id = id; this.savedRevisions = []; }; @@ -57,6 +58,14 @@ Pad.prototype.getPublicStatus = function getPublicStatus() { return this.publicStatus; }; +Pad.prototype.getViewSettings = function getViewSettings() { + return this.viewSettings; +}; + +Pad.prototype.getViewSetting = function getViewSettings(setting) { + return this.viewSettings[setting]; +}; + Pad.prototype.appendRevision = function appendRevision(aChangeset, author) { if(!author) author = ''; @@ -471,6 +480,16 @@ Pad.prototype.setPublicStatus = function setPublicStatus(publicStatus) { this.saveToDatabase(); }; +Pad.prototype.setViewSettings = function setPublicStatus(viewSettings) { + this.viewSettings = viewSettings; + this.saveToDatabase(); +}; + +Pad.prototype.setViewSetting = function setPublicStatus(setting, value) { + this.viewSettings[setting] = value; + this.saveToDatabase(); +}; + Pad.prototype.setPassword = function setPassword(password) { this.passwordHash = password == null ? null : hash(password, generateSalt()); this.saveToDatabase(); diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 434c25ad6..ca38a42a2 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -209,6 +209,8 @@ exports.handleMessage = function(client, message) handleGetChatMessages(client, message); } else if (message.data.type == "SAVE_REVISION") { handleSaveRevisionMessage(client, message); + } else if (message.data.type == "GLOBAL_SETTING_CHANGED") { + handleGlobalSettingChangedMessage(client, message); } else if (message.data.type == "CLIENT_MESSAGE" && message.data.payload.type == "suggestUserName") { handleSuggestUserName(client, message); @@ -276,6 +278,55 @@ function handleSaveRevisionMessage(client, message){ }); } +/** + * Handles a global setting changed message + * @param client the client that send this message + * @param message the message from the client + */ +function handleGlobalSettingChangedMessage(client, message){ + var padId = sessioninfos[client.id].padId; + var userId = sessioninfos[client.id].author; + + if(message.data.setting == null) + { + messageLogger.warn("Dropped message, GlobalSettingChanged Message has no setting!"); + return; + } + if(message.data.value == null) + { + messageLogger.warn("Dropped message, GlobalSettingChanged Message has no value!"); + return; + } + + var setting = message.data.setting; + var value = message.data.value; + + // check for illegal values + if(setting != "showLineNumbers" && setting != "showAuthorColors" && setting != "useMonospaceFont") + { + messageLogger.warn("Dropped message, GlobalSettingChanged Message has an invalid setting!"); + return; + } + if(value != true && value != false) + { + messageLogger.warn("Dropped message, GlobalSettingChanged Message has an invalid value!"); + return; + } + + padManager.getPad(padId, function(err, pad) + { + if(ERR(err)) return; + + // save changed value to the db + pad.setViewSetting(setting, value); + + // tell the users that a setting has been changed + for (var i in pad2sessions[padId]) { + socketio.sockets.sockets[pad2sessions[padId][i]].json.send(message); + } + }); +} + /** * Handles a custom message (sent via HTTP API request) * @@ -1054,6 +1105,7 @@ function handleClientReady(client, message) "plugins": plugins.plugins, "parts": plugins.parts, }, + "viewSettings": pad.getViewSettings(), "initialChangesets": [] // FIXME: REMOVE THIS SHIT } diff --git a/src/static/css/pad.css b/src/static/css/pad.css index bbbadbc18..4c9e71d80 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -807,6 +807,10 @@ input[type=checkbox] { display: none; z-index: 500; } +#globalViewWarning { + color: red; + font-size: 10px; +} .stickyChat { background-color: #f1f1f1 !important; right: 0px !important; diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 7df0b7114..5bc0383dd 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -424,6 +424,10 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) else // there are still more messages, re-show the load-button $("#chatloadmessagesbutton").css("display", "block"); } + else if (msg.type == "GLOBAL_SETTING_CHANGED") + { + pad.changeViewOption(msg.setting, msg.value, true); + } else if (msg.type == "SERVER_MESSAGE") { callbacks.onServerMessage(msg.payload); @@ -443,6 +447,14 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) userInfo: userInfo }); } + + function changeGlobalSetting(setting, value) + { + sendMessage({ "type" : "GLOBAL_SETTING_CHANGED", + "setting" : setting, + "value" : value + }); + } function tellAceActiveAuthorInfo(userInfo) { @@ -675,7 +687,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) getMissedChanges: getMissedChanges, callWhenNotCommitting: callWhenNotCommitting, addHistoricalAuthors: tellAceAboutHistoricalAuthors, - setChannelState: setChannelState + setChannelState: setChannelState, + changeGlobalSetting: changeGlobalSetting }; $(document).ready(setUpSocket); diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 64d8b42b8..58b7700e7 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -355,7 +355,7 @@ function handshake() // If the noColors value is set to true then we need to hide the background colors on the ace spans if (settings.noColors == true) { - pad.changeViewOption('noColors', true); + pad.changeViewOption('showAuthorColors', true); } if (settings.rtlIsTrue == true) @@ -368,6 +368,29 @@ function handshake() { pad.changeViewOption('useMonospaceFont', true); } + + // settings which are global for all users of this pad, these overwrite + // all settings set in cookies or by the user. They will also get updated + // via a collabClient-message when they're changed later. + var viewSettings = clientVars.viewSettings; + + // check if they are set, if they are overwrite whatever is set by the user + if (typeof(viewSettings.showLineNumbers) != "undefined") + { + pad.changeViewOption('showLineNumbers', viewSettings.showLineNumbers, true); + $("#options-global-linenoscheck").prop('checked', viewSettings.showLineNumbers); + } + if (typeof(viewSettings.showAuthorColors) != "undefined") + { + pad.changeViewOption('showAuthorColors', viewSettings.showAuthorColors, true); + $("#options-global-colorscheck").prop('checked', viewSettings.showAuthorColors); + } + if (typeof(viewSettings.useMonospaceFont) != "undefined") + { + pad.changeViewOption('useMonospaceFont', viewSettings.useMonospaceFont, true); + $("#global-viewfontmenu").val(viewSettings.useMonospaceFont ? "monospace" : "normal"); + } + // if the globalUserName value is set we need to tell the server and the client about the new authorname if (settings.globalUserName !== false) { @@ -630,15 +653,15 @@ var pad = { changedBy: pad.myUserInfo.name || "unnamed" }); }, - changeViewOption: function(key, value) + changeViewOption: function(key, value, global) { var options = { view: {} }; options.view[key] = value; - pad.handleOptionsChange(options); + pad.handleOptionsChange(options, global); }, - handleOptionsChange: function(opts) + handleOptionsChange: function(opts, global) { // opts object is a full set of options or just // some options to change @@ -652,7 +675,7 @@ var pad = { { pad.padOptions.view[k] = opts.view[k]; } - padeditor.setViewOptions(pad.padOptions.view); + padeditor.setViewOptions(pad.padOptions.view, global); } if (opts.guestPolicy) { diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index dd0cbbbb7..bc21535e2 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -62,6 +62,7 @@ var padeditor = (function() }, initViewOptions: function() { + // my view padutils.bindCheckboxChange($("#options-linenoscheck"), function() { pad.changeViewOption('showLineNumbers', padutils.getCheckbox($("#options-linenoscheck"))); @@ -76,6 +77,20 @@ var padeditor = (function() pad.changeViewOption('useMonospaceFont', $("#viewfontmenu").val() == 'monospace'); }); + // global view + padutils.bindCheckboxChange($("#options-global-linenoscheck"), function() + { + pad.collabClient.changeGlobalSetting("showLineNumbers", $("#options-global-linenoscheck").prop('checked')); + }); + padutils.bindCheckboxChange($("#options-global-colorscheck"), function() + { + pad.collabClient.changeGlobalSetting("showAuthorColors", $("#options-global-colorscheck").prop('checked')); + }); + $("#global-viewfontmenu").change(function() + { + pad.collabClient.changeGlobalSetting("useMonospaceFont", $("#global-viewfontmenu").val() == 'monospace'); + }); + html10n.bind('localized', function() { $("#languagemenu").val(html10n.getLanguage()); // translate the value of 'unnamed' and 'Enter your name' textboxes in the userlist @@ -95,7 +110,7 @@ var padeditor = (function() window.html10n.localize([$("#languagemenu").val(), 'en']); }); }, - setViewOptions: function(newOptions) + setViewOptions: function(newOptions, global) { function getOption(key, defaultValue) { @@ -113,18 +128,21 @@ var padeditor = (function() v = getOption('showLineNumbers', true); self.ace.setProperty("showslinenumbers", v); - padutils.setCheckbox($("#options-linenoscheck"), v); + if(!global) + padutils.setCheckbox($("#options-linenoscheck"), v); v = getOption('showAuthorColors', true); self.ace.setProperty("showsauthorcolors", v); - padutils.setCheckbox($("#options-colorscheck"), v); + if(!global) + padutils.setCheckbox($("#options-colorscheck"), v); // Override from parameters if true if (settings.noColors !== false) self.ace.setProperty("showsauthorcolors", !settings.noColors); v = getOption('useMonospaceFont', false); self.ace.setProperty("textface", (v ? "monospace" : "Arial, sans-serif")); - $("#viewfontmenu").val(v ? "monospace" : "normal"); + if(!global) + $("#viewfontmenu").val(v ? "monospace" : "normal"); }, dispose: function() { diff --git a/src/templates/pad.html b/src/templates/pad.html index cb88c1c1a..e3933af50 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -249,6 +249,22 @@
<% e.begin_block("globalSettings"); %>

+

+ + +

+

+ + +

+ <% e.begin_block("globalSettings.dropdowns"); %> + + + <% e.end_block(); %> +

<% e.end_block(); %>
From 48432d2b09d92d5855bfe9f2b782ed77112313b8 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 27 Jan 2013 20:57:47 +0100 Subject: [PATCH 2/5] Made warning bold and gray, sync checkbox-states, fixed initial checkbox-states, fixed engrish --- src/locales/en.json | 2 +- src/static/css/pad.css | 3 ++- src/static/js/pad.js | 10 ++++++---- src/static/js/pad_editor.js | 12 +++++++++--- src/templates/pad.html | 2 +- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index 7f351dd06..8d6f67491 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -33,7 +33,7 @@ "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "Global View", - "pad.settings.globalView.warning": "Warning: This will effect everyones view of this pad.", + "pad.settings.globalView.warning": "Warning: This will affect everyone's view of this pad.", "pad.settings.language": "Language:", "pad.importExport.import_export": "Import/Export", "pad.importExport.import": "Upload any text file or document", diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 4c9e71d80..25afa4310 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -808,7 +808,8 @@ input[type=checkbox] { z-index: 500; } #globalViewWarning { - color: red; + color: gray; + font-weight: bold; font-size: 10px; } .stickyChat { diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 58b7700e7..51d8ed3f7 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -374,21 +374,23 @@ function handshake() // via a collabClient-message when they're changed later. var viewSettings = clientVars.viewSettings; + // set the private options here if there is no global setting + $("#options-global-colorscheck").prop("checked", $("#options-colorscheck").prop("checked")); + $("#options-global-linenoscheck").prop("checked", $("#options-linenoscheck").prop("checked")); + $("#global-viewfontmenu").val($("#global-viewfontmenu").val()); + // check if they are set, if they are overwrite whatever is set by the user if (typeof(viewSettings.showLineNumbers) != "undefined") { pad.changeViewOption('showLineNumbers', viewSettings.showLineNumbers, true); - $("#options-global-linenoscheck").prop('checked', viewSettings.showLineNumbers); } if (typeof(viewSettings.showAuthorColors) != "undefined") { pad.changeViewOption('showAuthorColors', viewSettings.showAuthorColors, true); - $("#options-global-colorscheck").prop('checked', viewSettings.showAuthorColors); } if (typeof(viewSettings.useMonospaceFont) != "undefined") { - pad.changeViewOption('useMonospaceFont', viewSettings.useMonospaceFont, true); - $("#global-viewfontmenu").val(viewSettings.useMonospaceFont ? "monospace" : "normal"); + pad.changeViewOption('useMonospaceFont', viewSettings.useMonospaceFont, true); } // if the globalUserName value is set we need to tell the server and the client about the new authorname diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index bc21535e2..aa152c4b2 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -128,12 +128,16 @@ var padeditor = (function() v = getOption('showLineNumbers', true); self.ace.setProperty("showslinenumbers", v); - if(!global) + if(global) + padutils.setCheckbox($("#options-global-linenoscheck"), v); + else padutils.setCheckbox($("#options-linenoscheck"), v); v = getOption('showAuthorColors', true); self.ace.setProperty("showsauthorcolors", v); - if(!global) + if(global) + padutils.setCheckbox($("#options-global-colorscheck"), v); + else padutils.setCheckbox($("#options-colorscheck"), v); // Override from parameters if true if (settings.noColors !== false) @@ -141,7 +145,9 @@ var padeditor = (function() v = getOption('useMonospaceFont', false); self.ace.setProperty("textface", (v ? "monospace" : "Arial, sans-serif")); - if(!global) + if(global) + $("#global-viewfontmenu").val(v ? "monospace" : "normal"); + else $("#viewfontmenu").val(v ? "monospace" : "normal"); }, dispose: function() diff --git a/src/templates/pad.html b/src/templates/pad.html index e3933af50..e966ac88d 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -254,7 +254,7 @@

- +

<% e.begin_block("globalSettings.dropdowns"); %> From c7b83928b018dcf00b5579043797cd0f38a017c5 Mon Sep 17 00:00:00 2001 From: mluto Date: Sun, 27 Jan 2013 21:49:30 +0100 Subject: [PATCH 3/5] Added tests for author-colors (local+global), line-numbers (local+global), font (global) --- tests/frontend/specs/font_type.js | 27 ++++++++- tests/frontend/specs/hide_author_colors.js | 66 ++++++++++++++++++++++ tests/frontend/specs/hide_line_numbers.js | 66 ++++++++++++++++++++++ 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 tests/frontend/specs/hide_author_colors.js create mode 100644 tests/frontend/specs/hide_line_numbers.js diff --git a/tests/frontend/specs/font_type.js b/tests/frontend/specs/font_type.js index af90b865b..7a22cdfd0 100644 --- a/tests/frontend/specs/font_type.js +++ b/tests/frontend/specs/font_type.js @@ -5,7 +5,7 @@ describe("font select", function(){ this.timeout(60000); }); - it("makes text monospace", function(done) { + it("makes text monospace locally", function(done) { var inner$ = helper.padInner$; var chrome$ = helper.padChrome$; @@ -27,4 +27,29 @@ describe("font select", function(){ done(); }); + + it("makes text monospace globally", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the font menu and monospace option + var $viewfontmenu = chrome$("#global-viewfontmenu"); + var $monospaceoption = $viewfontmenu.find("[value=monospace]"); + + //select monospace and fire change event + $monospaceoption.attr('selected','selected'); + $viewfontmenu.change(); + + helper.waitFor(function(){ + return inner$("body").css("font-family").toLowerCase() == "monospace"; + }, 10000).always(function(){ + var newValue = inner$("body").css("font-family").toLowerCase(); + expect(newValue).to.be("monospace"); + done(); + }); + }); }); diff --git a/tests/frontend/specs/hide_author_colors.js b/tests/frontend/specs/hide_author_colors.js new file mode 100644 index 000000000..39c7b6ad2 --- /dev/null +++ b/tests/frontend/specs/hide_author_colors.js @@ -0,0 +1,66 @@ +describe("hiding author-colors", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("hides the author-colors locally", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $colorsCheckbox = chrome$("#options-colorscheck"); + + //get the current status of the author-colors + var oldValue = inner$("body").hasClass("authorColors"); + + //select show author colors and fire change event + $colorsCheckbox.attr('selected','selected'); + $colorsCheckbox.change(); + $colorsCheckbox.click(); + + //get the current status of the author-colors + var newValue = inner$("body").hasClass("authorColors"); + + expect(oldValue).not.to.be(newValue); + expect(newValue).to.be($colorsCheckbox.prop("checked")); + + done(); + }); + + it("hides the author-colors globally", function(done) { + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + this.timeout(10000); + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $colorsCheckbox = chrome$("#options-global-colorscheck"); + + //get the current status of the author-colors + var oldValue = inner$("body").hasClass("authorColors"); + + //select show author colors and fire change event + $colorsCheckbox.attr('selected','selected'); + $colorsCheckbox.change(); + $colorsCheckbox.click(); + + helper.waitFor(function(){ + return inner$("body").hasClass("authorColors") == !oldValue; + }, 10000).always(function(){ + var newValue = inner$("body").hasClass("authorColors"); + expect(oldValue).not.to.be(newValue); + expect(newValue).to.be($colorsCheckbox.prop("checked")); + done(); + }); + }); +}); diff --git a/tests/frontend/specs/hide_line_numbers.js b/tests/frontend/specs/hide_line_numbers.js new file mode 100644 index 000000000..f74260da7 --- /dev/null +++ b/tests/frontend/specs/hide_line_numbers.js @@ -0,0 +1,66 @@ +describe("hiding linenumbers", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + it("hides the linenumbers locally", function(done) { + var outer$ = helper.padOuter$; + var chrome$ = helper.padChrome$; + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $linesCheckbox = chrome$("#options-linenoscheck"); + + //get the current status of the linenumbers + var oldValue = outer$("#sidediv").hasClass("sidedivhidden"); + + //select show linenumbers and fire change event + $linesCheckbox.attr('selected','selected'); + $linesCheckbox.change(); + $linesCheckbox.click(); + + //get the current status of the linenumbers + var newValue = outer$("#sidediv").hasClass("sidedivhidden"); + + expect(oldValue).not.to.be(newValue); + expect(newValue).to.be(!$linesCheckbox.prop("checked")); + + done(); + }); + + it("hides the linenumbers globally", function(done) { + var outer$ = helper.padOuter$; + var chrome$ = helper.padChrome$; + + this.timeout(10000); + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $linesCheckbox = chrome$("#options-global-linenoscheck"); + + //get the current status of the linenumbers + var oldValue = outer$("#sidediv").hasClass("sidedivhidden"); + + //select show linenumbers and fire change event + $linesCheckbox.attr('selected','selected'); + $linesCheckbox.change(); + $linesCheckbox.click(); + + helper.waitFor(function(){ + return outer$("#sidediv").hasClass("sidedivhidden") == !oldValue; + }, 10000).always(function(){ + var newValue = outer$("#sidediv").hasClass("sidedivhidden"); + expect(oldValue).not.to.be(newValue); + expect(newValue).to.be(!$linesCheckbox.prop("checked")); + done(); + }); + }); +}); From 0266ea3066fb043653d95feb755973cf1892a256 Mon Sep 17 00:00:00 2001 From: mluto Date: Tue, 29 Jan 2013 21:45:24 +0100 Subject: [PATCH 4/5] Added a checkbox to ignore global settings --- src/locales/en.json | 1 + src/static/js/collab_client.js | 3 ++- src/static/js/pad_editor.js | 4 ++++ src/templates/pad.html | 4 ++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/locales/en.json b/src/locales/en.json index 8d6f67491..fb33ad240 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -35,6 +35,7 @@ "pad.settings.globalView": "Global View", "pad.settings.globalView.warning": "Warning: This will affect everyone's view of this pad.", "pad.settings.language": "Language:", + "pad.settings.ignoreglobal": "Ignore global settings", "pad.importExport.import_export": "Import/Export", "pad.importExport.import": "Upload any text file or document", "pad.importExport.importSuccessful": "Successful!", diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 5bc0383dd..393c9d768 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -426,7 +426,8 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } else if (msg.type == "GLOBAL_SETTING_CHANGED") { - pad.changeViewOption(msg.setting, msg.value, true); + if(!pad.padOptions.ignoreGlobalSettings) + pad.changeViewOption(msg.setting, msg.value, true); } else if (msg.type == "SERVER_MESSAGE") { diff --git a/src/static/js/pad_editor.js b/src/static/js/pad_editor.js index aa152c4b2..1b55bb71b 100644 --- a/src/static/js/pad_editor.js +++ b/src/static/js/pad_editor.js @@ -86,6 +86,10 @@ var padeditor = (function() { pad.collabClient.changeGlobalSetting("showAuthorColors", $("#options-global-colorscheck").prop('checked')); }); + padutils.bindCheckboxChange($("#options-ignore-global"), function() + { + pad.padOptions.ignoreGlobalSettings = $("#options-ignore-global").prop('checked'); + }); $("#global-viewfontmenu").change(function() { pad.collabClient.changeGlobalSetting("useMonospaceFont", $("#global-viewfontmenu").val() == 'monospace'); diff --git a/src/templates/pad.html b/src/templates/pad.html index e966ac88d..cd6e950a6 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -217,6 +217,10 @@

+

+ + +

<% e.end_block(); %> <% e.begin_block("mySettings.dropdowns"); %> From ddba3878e94c96816a94ae88cf8feab4efcaf9a8 Mon Sep 17 00:00:00 2001 From: mluto Date: Wed, 30 Jan 2013 12:46:05 +0100 Subject: [PATCH 5/5] Added test for ignoring global settings --- .../frontend/specs/ignore_global_settings.js | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 tests/frontend/specs/ignore_global_settings.js diff --git a/tests/frontend/specs/ignore_global_settings.js b/tests/frontend/specs/ignore_global_settings.js new file mode 100644 index 000000000..3efd19877 --- /dev/null +++ b/tests/frontend/specs/ignore_global_settings.js @@ -0,0 +1,68 @@ +describe("ignoring global settings", function(){ + //create a new pad before each test run + beforeEach(function(cb){ + helper.newPad(cb); + this.timeout(60000); + }); + + // 1. Ignore global settings + // 2. change linenumbers globally + // 3. Un-Ingore global settings + // 4. change author-colors + // 5. Check for *same* linenumbers and *changed* author-colors + it("tries to ignore global settings", function(done) { + var outer$ = helper.padOuter$; + var inner$ = helper.padInner$; + var chrome$ = helper.padChrome$; + + this.timeout(15000); + + //click on the settings button to make settings visible + var $settingsButton = chrome$(".buttonicon-settings"); + $settingsButton.click(); + + //get the chat selector + var $linesCheckbox = chrome$("#options-global-linenoscheck"); + var $colorsGlobalCheckbox = chrome$("#options-global-colorscheck"); + var $ignoreGlobalCheckbox = chrome$("#options-ignore-global"); + + //get the current status of the linenumbers + var oldValue_lines = outer$("#sidediv").hasClass("sidedivhidden"); + var oldValue_color = inner$("body").hasClass("authorColors"); + + //ignore global settings + $ignoreGlobalCheckbox.attr('selected','selected'); + $ignoreGlobalCheckbox.prop('checked', false); // make sure it's unchecked + $ignoreGlobalCheckbox.change(); + $ignoreGlobalCheckbox.click(); // check it + + //change linenumbers + $linesCheckbox.attr('selected','selected'); + $linesCheckbox.change(); + $linesCheckbox.click(); + + // wait for the server-event to come.. + setTimeout(function() { + //unignore global settings + $ignoreGlobalCheckbox.attr('selected','selected'); + $ignoreGlobalCheckbox.change(); + $ignoreGlobalCheckbox.click(); + + //change colors + $colorsGlobalCheckbox.attr('selected','selected'); + $colorsGlobalCheckbox.change(); + $colorsGlobalCheckbox.click(); + }, 2500); + + helper.waitFor(function(){ + return inner$("body").hasClass("authorColors") == !oldValue_color; + }, 10000).always(function(){ + var newValue_lines = outer$("#sidediv").hasClass("sidedivhidden"); + var newValue_color = inner$("body").hasClass("authorColors"); + + expect(newValue_color).not.to.be(oldValue_color); + expect(newValue_lines).to.be(oldValue_lines); + done(); + }); + }); +});