diff --git a/customize.dist/main.css b/customize.dist/main.css
index ddccca51f..9eb23b1e2 100644
--- a/customize.dist/main.css
+++ b/customize.dist/main.css
@@ -391,6 +391,9 @@ form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbo
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes:after {
content: "✔";
}
+form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.uncommitted {
+ background: #ddd;
+}
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.mine {
display: none;
}
diff --git a/customize.dist/src/cryptpad.less b/customize.dist/src/cryptpad.less
index 716fc7a85..5f95cd553 100644
--- a/customize.dist/src/cryptpad.less
+++ b/customize.dist/src/cryptpad.less
@@ -444,6 +444,12 @@ form.realtime {
background-color: @cp-green;
&:after { content: "✔"; }
}
+
+ &.uncommitted {
+ background: #ddd;
+ }
+
+
&.mine {
display: none;
}
diff --git a/www/poll/test/index.html b/www/poll/test/index.html
index 3aef58e04..65219ca6e 100644
--- a/www/poll/test/index.html
+++ b/www/poll/test/index.html
@@ -4,6 +4,7 @@
Zero Knowledge Date Picker
+
@@ -43,21 +44,59 @@
border: .5px solid black;
}
+ table#table {
+ margin: 0px;
+ }
+ #tableContainer {
+ position: relative;
+ padding: 29px;
+ padding-right: 82px;
+ }
+ #tableContainer button {
+ height: 2rem;
+ }
+ #commit {
+ position: absolute;
+ left: 532px;
+ bottom: 0px;
+ }
+ #create-user {
+ position: absolute;
+ left: 0px;
+ top: 31px;
+ width: 50px;
+ overflow: hidden;
+ }
+ #create-option {
+ position: absolute;
+ bottom: 0px;
+ left: 249px;
+ width: 50px;
+ }
+
-
-
+
+
-
diff --git a/www/poll/test/main.js b/www/poll/test/main.js
index bfff6fe11..513999a73 100644
--- a/www/poll/test/main.js
+++ b/www/poll/test/main.js
@@ -15,6 +15,10 @@ define([
//'/customize/pad.js'
], function (Config, Messages, TextPatcher, Listmap, Crypto, Cryptpad, Hyperjson, Render, Toolbar) {
var $ = window.jQuery;
+
+ var HIDE_INTRODUCTION_TEXT = "hide_poll_text";
+ var defaultName;
+
var APP = window.APP = {
Toolbar: Toolbar,
Hyperjson: Hyperjson,
@@ -31,6 +35,10 @@ define([
return colsOrder;
};
+ var isOwnColumnCommitted = function () {
+ return APP.proxy && APP.proxy.table.colsOrder.indexOf(APP.userid) !== -1;
+ };
+
var mergeUncommitted = function (proxy, uncommitted, commit) {
var newObj;
if (commit) {
@@ -40,7 +48,7 @@ define([
}
// We have uncommitted data only if the user's column is not in the proxy
// If it is already is the proxy, nothing to merge
- if (proxy.table.colsOrder.indexOf(APP.userid) !== -1) {
+ if (isOwnColumnCommitted()) {
return newObj;
}
// Merge uncommitted into the proxy
@@ -61,6 +69,28 @@ define([
return newObj;
};
+ var styleUncommittedColumn = function () {
+ var id = APP.userid;
+ if (isOwnColumnCommitted()) { return; }
+ $('[data-rt-id^="' + id + '"]').closest('td').addClass("uncommitted");
+ $('td.uncommitted .remove').remove();
+ $('td.uncommitted .cover').addClass("uncommitted");
+ $('.uncommitted input[type="text"]').attr("placeholder", "New column here"); //TODO
+ };
+
+ var updateTableButtons = function () {
+ if ($('.checkbox-cell').length && !isOwnColumnCommitted()) {
+ $('#commit').show();
+ $('#commit').css('width', $($('.checkbox-cell')[0]).width());
+ } else {
+ $('#commit').hide();
+ }
+ var width = $('#table').outerWidth();
+ if (width) {
+ $('#create-user').css('left', width + 30 + 'px');
+ }
+ };
+
/* Any time the realtime object changes, call this function */
var change = function (o, n, path) {
if (path && path.join) {
@@ -88,6 +118,8 @@ define([
window.setTimeout(function () {
var displayedObj2 = mergeUncommitted(APP.proxy, APP.uncommitted);
Render.updateTable(table, displayedObj2, conf);
+ updateTableButtons();
+ styleUncommittedColumn();
});
};
@@ -193,7 +225,7 @@ define([
APP.proxy.published = true;
APP.$publish.hide();
- ['textarea', '#title'].forEach(function (sel) {
+ ['textarea'].forEach(function (sel) {
$(sel).attr('disabled', bool);
});
};
@@ -204,11 +236,9 @@ define([
};
// special UI elements
- var $title = $('#title').attr('placeholder', Messages.poll_titleHint || 'title');
+ //var $title = $('#title').attr('placeholder', Messages.poll_titleHint || 'title'); TODO
var $description = $('#description').attr('placeholder', Messages.poll_descriptionHint || 'description');
- var items = [$title, $description];
-
var ready = function (info, userid) {
console.log("READY");
console.log('userid: %s', userid);
@@ -226,7 +256,6 @@ define([
var colsOrder = sortColumns(displayedObj.table.colsOrder, userid);
-
var $table = APP.$table = $(Render.asHTML(displayedObj, null, colsOrder));
var $createRow = APP.$createRow = $('#create-option').click(function () {
//
@@ -242,7 +271,7 @@ define([
});
});
- //TODO
+ // Commit button
var $commit = APP.$commit = $('#commit').click(function () {
var uncommittedCopy = JSON.parse(JSON.stringify(APP.uncommitted));
APP.uncommitted = {};
@@ -251,20 +280,26 @@ define([
change();
});
- items.forEach(function ($item) {
- var id = $item.attr('id');
-
- $item.on('change keyup', function () {
- var val = $item.val();
- proxy.info[id] = val;
- });
+ // Title
+ if (APP.proxy.info.defaultTitle) {
+ updateDefaultTitle(APP.proxy.info.defaultTitle);
+ } else {
+ APP.proxy.info.defaultTitle = defaultName
+ }
+ updateTitle(APP.proxy.info.title || defaultName);
- if (typeof(proxy.info[id]) !== 'undefined') {
- $item.val(proxy.info[id]);
- }
+ // Description
+ $description.on('change keyup', function () {
+ var val = $item.val();
+ proxy.info.description = val;
});
+ if (typeof(proxy.info.description) !== 'undefined') {
+ $description.val(proxy.info.descrption);
+ }
- $('.realtime').append($table);
+ $('#tableContainer').prepend($table);
+ updateTableButtons();
+ styleUncommittedColumn();
$table
.click(handleClick)
@@ -272,20 +307,18 @@ define([
proxy
.on('change', ['info'], function (o, n, p) {
- var $target = $('#' + p[1]);
- var el = $target[0];
- var selects;
- var op;
-
- if (el && ['textarea', 'text'].indexOf(el.type) !== -1) {
- op = TextPatcher.diff(o, n);
- selects = ['selectionStart', 'selectionEnd'].map(function (attr) {
+ if (p[1] === 'title') {
+ updateTitle(n);
+ } else if (p[1] === 'description') {
+ var op = TextPatcher.diff(o, n);
+ var el = $description[0];
+
+ var selects = ['selectionStart', 'selectionEnd'].map(function (attr) {
var before = el[attr];
var after = TextPatcher.transformCursor(el[attr], op);
return after;
});
$target.val(n);
-
if (op) {
el.selectionStart = selects[0];
el.selectionEnd = selects[1];
@@ -310,6 +343,39 @@ define([
var secret = Cryptpad.getSecrets();
+
+ var updateTitle = function (newTitle) {
+ if (newTitle === document.title) { return; }
+ // Change the title now, and set it back to the old value if there is an error
+ var oldTitle = document.title;
+ document.title = newTitle;
+ Cryptpad.renamePad(newTitle, function (err, data) {
+ if (err) {
+ console.log("Couldn't set pad title");
+ console.error(err);
+ document.title = oldTitle;
+ return;
+ }
+ document.title = data;
+ APP.$bar.find('.' + Toolbar.constants.title).find('span.title').text(data);
+ APP.$bar.find('.' + Toolbar.constants.title).find('input').val(data);
+ });
+ };
+
+ var updateDefaultTitle = function (defaultTitle) {
+ defaultName = defaultTitle;
+ APP.$bar.find('.' + Toolbar.constants.title).find('input').attr("placeholder", defaultName);
+ };
+ var renameCb = function (err, title) {
+ if (err) { return; }
+ document.title = title;
+ APP.proxy.info.title = title;
+ };
+
+ var suggestName = function (fallback) {
+ return document.title || defaultName || "";
+ };
+
var create = function (info) {
var realtime = APP.realtime = info.realtime;
@@ -324,11 +390,35 @@ define([
var config = {
userData: {},
readOnly: false,
+ title: {
+ onRename: renameCb,
+ defaultName: defaultName,
+ suggestName: suggestName
+ },
common: Cryptpad
};
toolbar = info.realtime.toolbar = Toolbar.create(APP.$bar, info.myID, info.realtime, info.getLag, userList, config);
+ var $rightside = APP.$bar.find('.' + Toolbar.constants.rightside);
+
+ /* add a forget button */
+ var forgetCb = function (err, title) {
+ if (err) { return; }
+ document.title = title;
+ };
+ var $forgetPad = Cryptpad.createButton('forget', true, {}, forgetCb);
+ $rightside.append($forgetPad);
+
Cryptpad.replaceHash(editHash);
+
+ Cryptpad.getPadTitle(function (err, title) {
+ if (err) {
+ console.error(err);
+ console.log("Couldn't get pad title");
+ return;
+ }
+ updateTitle(title || defaultName);
+ });
};
var disconnect = function () {
@@ -348,6 +438,8 @@ define([
// don't initialize until the store is ready.
Cryptpad.ready(function () {
+ var parsedHash = Cryptpad.parsePadUrl(window.location.href);
+ defaultName = Cryptpad.getDefaultName(parsedHash);
var rt = window.rt = APP.rt = Listmap.create(config);
APP.proxy = rt.proxy;
rt.proxy
@@ -363,6 +455,17 @@ define([
});
})
.on('disconnect', disconnect);
+
+ Cryptpad.getPadAttribute(HIDE_INTRODUCTION_TEXT, function (e, value) {
+ if (e) { console.error(e); }
+ if (value === null) {
+ Cryptpad.setPadAttribute(HIDE_INTRODUCTION_TEXT, "1", function (e) {
+ if (e) { console.error(e) }
+ });
+ } else if (value === "1") {
+ $('#howItWorks').hide();
+ }
+ });
});
});
diff --git a/www/poll/test/render.js b/www/poll/test/render.js
index 91acc266b..950da7342 100644
--- a/www/poll/test/render.js
+++ b/www/poll/test/render.js
@@ -202,7 +202,8 @@ by maintaining indexes in rowsOrder and colsOrder
var result = {
'data-rt-id': col,
type: 'text',
- value: getColumnValue(obj, col) || ""
+ value: getColumnValue(obj, col) || "",
+ placeholder: 'User' //TODO translate
};
return result;
}));
@@ -212,6 +213,7 @@ by maintaining indexes in rowsOrder and colsOrder
'data-rt-id': row,
value: getRowValue(obj, row),
type: 'text',
+ placeholder: 'Option' //TODO translate
}].concat(cols.map(function (col) {
var id = [col, rows[i-1]].join('_');
var val = cells[id] || false;