diff --git a/customize.dist/translations/messages.es.js b/customize.dist/translations/messages.es.js
index 40efab91e..9706380ef 100644
--- a/customize.dist/translations/messages.es.js
+++ b/customize.dist/translations/messages.es.js
@@ -13,8 +13,7 @@ define(function () {
out.type.slide = 'Presentación';
out.type.whiteboard = 'Pizarra';
- out.updated_0_common_connectionLost = "Connexión perdida
El documento está ahora en modo solo lectura hasta que la conexión vuelva.";
- out.common_connectionLost = out.updated_0_common_connectionLost;
+ out.common_connectionLost = "Connexión perdida
El documento está ahora en modo solo lectura hasta que la conexión vuelva.";
out.disconnected = "Desconectado";
out.synchronizing = "Sincronización";
@@ -200,7 +199,6 @@ define(function () {
out.fm_info_root = "Crea carpetas aquí para organizar tus documentos.";
out.fm_info_unsorted = "Contiene todos los documentos que has visitado que no estan organizados en \"Documentos\" o movidos a la \"Papelera\".";
out.fm_info_template = "Contiene todas las plantillas que puedes volver a usar para crear nuevos documentos.";
- out.fm_info_trash = "Archivos eliminados de la papelera también se eliminan de \"Todos los archivos\" y es imposible recuparlos desde el explorador.";
out.fm_info_allFiles = "Contiene todos los archivos de \"Documentos\", \"Sin organizar\" y \"Papelera\". No puedes mover o eliminar archivos aquí.";
out.fm_alert_backupUrl = "Enlace de copia de seguridad para este drive. Te recomendamos muy fuertemente que lo guardes secreto.
Lo puedes usar para recuparar todos tus archivos en el caso que la memoria de tu navegador se borre.
Cualquiera con este enlace puede editar o eliminar todos los archivos en el explorador.
";
out.fm_backup_title = "Enlace de copia de seguridad";
@@ -417,7 +415,6 @@ define(function () {
out.formattedKB = "{0} KB";
out.pinLimitReached = "Has llegado al limite de espacio";
- out.pinLimitReachedAlert = "Has llegado al limite de espacio. Nuevos pads no serán movidos a tu CryptDrive.
Para resolver este problema, puedes quitar pads de tu CryptDrive (incluso en la papelera) o mejorar tu cuenta para obtener más espacio.";
out.pinLimitNotPinned = "Has llegado al limite de espacio.
Este pad no estará presente en tu CryptDrive.";
out.pinLimitDrive = "Has llegado al limite de espacio.
No puedes crear nuevos pads.";
out.printTransition = "Activar transiciones";
@@ -429,5 +426,35 @@ define(function () {
out.upload_uploadPending = "Ya tienes una subida en progreso. ¿Cancelar y subir el nuevo archivo?";
out.upload_success = "Tu archivo ({0}) ha sido subido con éxito y fue añadido a tu drive.";
+ // 1.7.0 - Hodag
+ out.comingSoon = "Próximamente..."; // "Coming soon..."
+ out.newVersion = ["CryptPad ha sido actualizado!",
+ "Puedes ver lo que ha cambiada aquí (en inglés):",
+ "Notas de versión para CryptPad {0}"].join("
");
+ out.pinLimitReachedAlert = ["Has llegado a tu limite de espacio. Nuevos pads no serán guardados en tu CryptDrive.",
+ "Puedes eliminar pads de tu CryptDrive o suscribirte a una oferta premium para obtener más espacio."].join("
");
+ out.pinLimitReachedAlertNoAccounts = "Has llegado a tu limite de espacio";
+ out.pinAboveLimitAlert = "Desde esta versión, ponemos un limite de 50MB a las cuentas gratís y estás usando {0}. Tendrás que eliminar unos pads o suscribirte en accounts.cryptpad.fr. Tu contribución nos ayuda a mejorar CryptPad y extender el Zero Knowledge. Por favor contacta el soporte si tienes preguntas adicionales.";
+ out.previewButtonTitle = "Mostrar/esconder la vista previa Markdown";
+ out.fm_info_trash = "Vacía tu papelera para liberar espaci en tu CryptDrive.";
+ out.fm_info_anonymous = "No estás conectado, así que estos pads pueden ser borrados (¿por qué?). Registrate o Inicia sesión para asegurarlos.";
+ out.fm_alert_anonymous = "Hola, estás usando CryptPad anónimamente. Está bien, pero tus pads pueden ser borrados después de un périodo de inactividad. Hemos desactivado funciones avanzadas de CryptDrive para usuarios anónimos porque queremos ser claros que no es un lugar seguro para almacenar cosas. Puedes leer este articulo (en inglés) sobre por qué hacemos esto y por qué deberías Registrarte e Iniciar sesión.";
+ out.fm_error_cantPin = "Error del servidor. Por favor, recarga la página e intentalo de nuevo.";
+ out.upload_notEnoughSpace = "No tienes suficiente espacio para este archivo en tu CryptDrive";
+ out.upload_tooLarge = "Este archivo supera el límite de carga.";
+ out.upload_choose = "Escoge un archivo";
+ out.upload_pending = "Esperando";
+ out.upload_cancelled = "Cancelado";
+ out.upload_name = "Nombre";
+ out.upload_size = "Tamaño";
+ out.upload_progress = "Progreso";
+ out.download_button = "Descifrar y descargar";
+ out.warn_notPinned = "Este pad no está en ningun CryptDrive. Expirará después de 3 meses. Acerca de...";
+
+ out.poll_remove = "Quitar";
+ out.poll_edit = "Editar";
+ out.poll_locked = "Cerrado";
+ out.poll_unlocked = "Abierto";
+
return out;
});
diff --git a/customize.dist/translations/messages.fr.js b/customize.dist/translations/messages.fr.js
index a112d397e..71227966c 100644
--- a/customize.dist/translations/messages.fr.js
+++ b/customize.dist/translations/messages.fr.js
@@ -193,6 +193,11 @@ define(function () {
out.poll_titleHint = "Titre";
out.poll_descriptionHint = "Description";
+ out.poll_remove = "Supprimer";
+ out.poll_edit = "Modifier";
+ out.poll_locked = "Verrouillé";
+ out.poll_unlocked = "Déverrouillé";
+
// Canvas
out.canvas_clear = "Nettoyer";
out.canvas_delete = "Supprimer la sélection";
diff --git a/customize.dist/translations/messages.js b/customize.dist/translations/messages.js
index 58713a895..262de94dc 100644
--- a/customize.dist/translations/messages.js
+++ b/customize.dist/translations/messages.js
@@ -198,6 +198,11 @@ define(function () {
out.poll_titleHint = "Title";
out.poll_descriptionHint = "Describe your poll, and use the 'publish' button when you're done. Anyone with the link can change the description, but this is discouraged.";
+ out.poll_remove = "Remove";
+ out.poll_edit = "Edit";
+ out.poll_locked = "Locked";
+ out.poll_unlocked = "Unlocked";
+
// Canvas
out.canvas_clear = "Clear";
out.canvas_delete = "Delete selection";
diff --git a/www/poll/main.js b/www/poll/main.js
index 0d6474dbb..6e42ca75c 100644
--- a/www/poll/main.js
+++ b/www/poll/main.js
@@ -15,8 +15,6 @@ define([
$(function () {
- var unlockHTML = '';
- var lockHTML = '';
var HIDE_INTRODUCTION_TEXT = "hide_poll_text";
var defaultName;
@@ -100,12 +98,10 @@ define([
// Enable the checkboxes for the user's column (committed or not)
$('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled');
$('input[type="checkbox"][data-rt-id^="' + id + '"]').addClass('enabled');
- $('[data-rt-id="' + id + '"] ~ .edit').css('visibility', 'hidden');
- $('.lock[data-rt-id="' + id + '"]').html(unlockHTML);
+ $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked);
if (isOwnColumnCommitted()) { return; }
$('[data-rt-id^="' + id + '"]').closest('td').addClass("uncommitted");
- $('td.uncommitted .remove, td.uncommitted .edit').css('visibility', 'hidden');
$('td.uncommitted .cover').addClass("uncommitted");
$('.uncommitted input[type="text"]').attr("placeholder", Messages.poll_userPlaceholder);
};
@@ -118,8 +114,7 @@ define([
APP.editable.col.forEach(function (id) {
$('input[disabled="disabled"][data-rt-id^="' + id + '"]').removeAttr('disabled');
$('input[type="checkbox"][data-rt-id^="' + id + '"]').addClass('enabled');
- $('span.edit[data-rt-id="' + id + '"]').css('visibility', 'hidden');
- $('.lock[data-rt-id="' + id + '"]').html(unlockHTML);
+ $('.lock[data-rt-id="' + id + '"]').addClass('fa-unlock').removeClass('fa-lock').attr('title', Messages.poll_unlocked);
});
};
@@ -276,7 +271,6 @@ define([
switch (type) {
case 'text':
debug("text[rt-id='%s'] [%s]", id, input.value);
- if (!input.value) { return void debug("Hit enter?"); }
Render.setValue(object, id, input.value);
change(null, null, null, 50);
break;
@@ -295,12 +289,26 @@ define([
}
};
+ var hideInputs = function (target, isKeyup) {
+ if (!isKeyup && $(target).is('[type="text"]')) {
+ return;
+ }
+ $('.lock[data-rt-id!="' + APP.userid + '"]').addClass('fa-lock').removeClass('fa-unlock').attr('title', Messages.poll_locked);
+ var $cells = APP.$table.find('thead td:not(.uncommitted), tbody td');
+ $cells.find('[type="text"][data-rt-id!="' + APP.userid + '"]').attr('disabled', true);
+ $('.edit[data-rt-id!="' + APP.userid + '"]').css('visibility', 'visible');
+ APP.editable.col = [APP.userid];
+ APP.editable.row = [];
+ };
+
/* Called whenever an event is fired on a span */
var handleSpan = function (span) {
var id = span.getAttribute('data-rt-id');
var type = Render.typeofId(id);
var isRemove = span.className && span.className.split(' ').indexOf('remove') !== -1;
var isEdit = span.className && span.className.split(' ').indexOf('edit') !== -1;
+ var isLock = span.className && span.className.split(' ').indexOf('lock') !== -1;
+ var isLocked = span.className && span.className.split(' ').indexOf('fa-lock') !== -1;
if (type === 'row') {
if (isRemove) {
Cryptpad.confirm(Messages.poll_removeOption, function (res) {
@@ -310,6 +318,7 @@ define([
});
});
} else if (isEdit) {
+ hideInputs(span);
unlockRow(id, function () {
change(null, null, null, null, function() {
$('input[data-rt-id="' + id + '"]').focus();
@@ -324,7 +333,8 @@ define([
change();
});
});
- } else if (isEdit) {
+ } else if (isLock && isLocked) {
+ hideInputs(span);
unlockColumn(id, function () {
change(null, null, null, null, function() {
$('input[data-rt-id="' + id + '"]').focus();
@@ -338,48 +348,34 @@ define([
}
};
- var hideInputs = function (e, isKeyup) {
- if (!isKeyup && $(e.target).is('[type="text"]')) {
- return;
- }
- $('.lock[data-rt-id!="' + APP.userid + '"]').html(lockHTML);
- var $cells = APP.$table.find('thead td:not(.uncommitted), tbody td');
- $cells.find('[type="text"][data-rt-id!="' + APP.userid + '"]').attr('disabled', true);
- $('.edit[data-rt-id!="' + APP.userid + '"]').css('visibility', 'visible');
- APP.editable.col = [APP.userid];
- APP.editable.row = [];
- };
-
- $(window).click(hideInputs);
-
var handleClick = function (e, isKeyup) {
e.stopPropagation();
if (!APP.ready) { return; }
var target = e && e.target;
- if (isKeyup) {
- debug("Keyup!");
- }
-
if (!target) { return void debug("NO TARGET"); }
var nodeName = target && target.nodeName;
+ var shouldLock = $(target).hasClass('fa-unlock');
- if (!$(target).parents('#table tbody').length || $(target).hasClass('edit')) {
+ if ((!$(target).parents('#table tbody').length && $(target).hasClass('lock'))) {
hideInputs(e);
}
switch (nodeName) {
case 'INPUT':
if (isKeyup && (e.keyCode === 13 || e.keyCode === 27)) {
- hideInputs(e, isKeyup);
- return;
+ hideInputs(target, isKeyup);
+ break;
}
handleInput(target);
break;
case 'SPAN':
//case 'LABEL':
+ if (shouldLock) {
+ break;
+ }
handleSpan(target);
break;
case undefined:
@@ -459,7 +455,6 @@ var ready = function (info, userid, readOnly) {
var $table = APP.$table = $(Render.asHTML(displayedObj, null, colsOrder, readOnly));
APP.$createRow = $('#create-option').click(function () {
- //console.error("BUTTON CLICKED! LOL");
Render.createRow(proxy, function (empty, id) {
change(null, null, null, null, function() {
$('.edit[data-rt-id="' + id + '"]').click();
@@ -470,7 +465,7 @@ var ready = function (info, userid, readOnly) {
APP.$createCol = $('#create-user').click(function () {
Render.createColumn(proxy, function (empty, id) {
change(null, null, null, null, function() {
- $('.edit[data-rt-id="' + id + '"]').click();
+ $('.lock[data-rt-id="' + id + '"]').click();
});
});
});
@@ -532,6 +527,8 @@ var ready = function (info, userid, readOnly) {
.click(handleClick)
.on('keyup', function (e) { handleClick(e, true); });
+ $(window).click(hideInputs);
+
proxy
.on('change', ['info'], function (o, n, p) {
if (p[1] === 'title') {
diff --git a/www/poll/poll.css b/www/poll/poll.css
index 321121b59..3e534d5e2 100644
--- a/www/poll/poll.css
+++ b/www/poll/poll.css
@@ -32,6 +32,9 @@ textarea[disabled] {
font: white;
border: 0px;
}
+input[type="text"]::placeholder {
+ color: #666;
+}
table#table {
margin: 0px;
}
@@ -66,7 +69,7 @@ table#table {
#tableScroll {
overflow-y: hidden;
overflow-x: auto;
- margin-left: calc(30% - 50px + 29px);
+ margin-left: calc(30% - 50px + 31px);
max-width: 70%;
width: auto;
display: inline-block;
@@ -104,6 +107,9 @@ table {
tbody {
border: 1px solid #555;
}
+tbody * {
+ box-sizing: border-box;
+}
tbody tr {
text-align: center;
}
@@ -260,23 +266,37 @@ div.realtime table input[type="text"] {
border: 1px solid #fff;
width: 80%;
}
+form.realtime table span,
+div.realtime table span {
+ user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+}
form.realtime table thead td,
div.realtime table thead td {
padding: 0px 5px;
background: #aaa;
border-radius: 20px 20px 0 0;
- text-align: center;
+}
+form.realtime table thead td:nth-of-type(2),
+div.realtime table thead td:nth-of-type(2) {
+ background: #999;
+}
+form.realtime table thead td:nth-of-type(2) .lock,
+div.realtime table thead td:nth-of-type(2) .lock {
+ cursor: default;
}
form.realtime table thead td input[type="text"],
div.realtime table thead td input[type="text"] {
width: 100%;
box-sizing: border-box;
+ padding: 1px 5px;
}
form.realtime table thead td input[type="text"][disabled],
div.realtime table thead td input[type="text"][disabled] {
color: #000;
- padding: 1px 5px;
- border: none;
+ border: 1px solid transparent;
}
form.realtime table tbody .text-cell,
div.realtime table tbody .text-cell {
@@ -296,9 +316,9 @@ div.realtime table tbody .text-cell .remove {
float: left;
margin: 0 0 0 10px;
}
-form.realtime table tbody td label,
-div.realtime table tbody td label {
- border: 0.5px solid #555;
+form.realtime table tbody tr:not(:first-child) td:not(:first-child) label,
+div.realtime table tbody tr:not(:first-child) td:not(:first-child) label {
+ border-top: 1px solid #555;
}
form.realtime table .edit,
div.realtime table .edit {
@@ -307,6 +327,13 @@ div.realtime table .edit {
float: left;
margin-left: 10px;
}
+form.realtime table .lock,
+div.realtime table .lock {
+ margin-left: calc(50% - 0.5em);
+ cursor: pointer;
+ width: 1em;
+ text-align: center;
+}
form.realtime table .remove,
div.realtime table .remove {
float: right;
diff --git a/www/poll/poll.less b/www/poll/poll.less
index 7292b0e15..699e96e03 100644
--- a/www/poll/poll.less
+++ b/www/poll/poll.less
@@ -2,7 +2,9 @@
@import "../../customize.dist/src/less/mixins.less";
@poll-th-bg: #aaa;
+@poll-th-user-bg: #999;
@poll-td-bg: #aaa;
+@poll-placeholder: #666;
@poll-border-color: #555;
@poll-cover-color: #000;
@poll-fg: #000;
@@ -42,6 +44,13 @@ input[type="text"][disabled], textarea[disabled] {
font: white;
border: 0px;
}
+
+// The placeholder color only seems to effect Safari when not set
+
+input[type="text"]::placeholder {
+ color: @poll-placeholder;
+}
+
table#table {
margin: 0px;
}
@@ -75,7 +84,7 @@ table#table {
#tableScroll {
overflow-y: hidden;
overflow-x: auto;
- margin-left: calc(~"30% - 50px + 29px");
+ margin-left: calc(~"30% - 50px + 31px");
max-width: 70%;
width: auto;
display: inline-block;
@@ -118,6 +127,9 @@ table {
}
tbody {
border: 1px solid @poll-border-color;
+ * {
+ box-sizing: border-box;
+ }
tr {
text-align: center;
&:first-of-type th{
@@ -282,20 +294,32 @@ form.realtime, div.realtime {
width: 80%;
}
}
+ span {
+ user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ }
thead {
td {
padding: 0px 5px;
background: @poll-th-bg;
border-radius: 20px 20px 0 0;
- text-align: center;
+ //text-align: center;
+ &:nth-of-type(2) {
+ background: @poll-th-user-bg;
+ .lock {
+ cursor: default;
+ }
+ }
input {
&[type="text"] {
width: 100%;
box-sizing: border-box;
+ padding: 1px 5px;
&[disabled] {
color: @poll-fg;
- padding: 1px 5px;
- border: none;
+ border: 1px solid transparent;
}
}
}
@@ -318,9 +342,11 @@ form.realtime, div.realtime {
margin: 0 0 0 10px;
}
}
- td {
- label {
- border: .5px solid @poll-border-color;
+ tr:not(:first-child) {
+ td:not(:first-child) {
+ label {
+ border-top: 1px solid @poll-border-color;
+ }
}
}
}
@@ -331,6 +357,12 @@ form.realtime, div.realtime {
margin-left: 10px;
}
+ .lock {
+ margin-left: ~"calc(50% - 0.5em)";
+ cursor: pointer;
+ width: 1em;
+ text-align: center;
+ }
.remove {
float: right;
margin-right: 10px;
diff --git a/www/poll/render.js b/www/poll/render.js
index 647b2fedd..8399d5b71 100644
--- a/www/poll/render.js
+++ b/www/poll/render.js
@@ -252,6 +252,7 @@ var Renderer = function (Cryptpad) {
var makeRemoveElement = Render.makeRemoveElement = function (id) {
return ['SPAN', {
'data-rt-id': id,
+ 'title': Cryptpad.Messages.poll_remove,
class: 'remove',
}, ['✖']];
};
@@ -259,6 +260,7 @@ var Renderer = function (Cryptpad) {
var makeEditElement = Render.makeEditElement = function (id) {
return ['SPAN', {
'data-rt-id': id,
+ 'title': Cryptpad.Messages.poll_edit,
class: 'edit',
}, ['✐']];
};
@@ -266,25 +268,18 @@ var Renderer = function (Cryptpad) {
var makeLockElement = Render.makeLockElement = function (id) {
return ['SPAN', {
'data-rt-id': id,
- class: 'lock',
- }, [['i', {
- class: 'fa fa-lock',
- 'aria-hidden': true,
- }, []]
- ]];
+ 'title': Cryptpad.Messages.poll_locked,
+ class: 'lock fa fa-lock',
+ }, []];
};
var makeHeadingCell = Render.makeHeadingCell = function (cell, readOnly) {
if (!cell) { return ['TD', {}, []]; }
if (cell.type === 'text') {
- var removeElement = makeRemoveElement(cell['data-rt-id']);
- var editElement = makeEditElement(cell['data-rt-id']);
- var lockElement = makeLockElement(cell['data-rt-id']);
var elements = [['INPUT', cell, []]];
if (!readOnly) {
- elements.unshift(removeElement);
- elements.unshift(lockElement);
- elements.unshift(editElement);
+ elements.unshift(makeRemoveElement(cell['data-rt-id']));
+ elements.unshift(makeLockElement(cell['data-rt-id']));
}
return ['TD', {}, elements];
}
@@ -321,12 +316,10 @@ var Renderer = function (Cryptpad) {
var makeBodyCell = Render.makeBodyCell = function (cell, readOnly) {
if (cell && cell.type === 'text') {
- var removeElement = makeRemoveElement(cell['data-rt-id']);
- var editElement = makeEditElement(cell['data-rt-id']);
var elements = [['INPUT', cell, []]];
if (!readOnly) {
- elements.push(removeElement);
- elements.push(editElement);
+ elements.push(makeRemoveElement(cell['data-rt-id']));
+ elements.push(makeEditElement(cell['data-rt-id']));
}
return ['TD', {}, [
['DIV', {class: 'text-cell'}, elements]