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();
+ });
+ });
+});