Merge branch 'master' into feature/edit-link-headers

This commit is contained in:
Dan Brown 2018-07-14 09:36:14 +01:00
commit f668bee88b
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
15 changed files with 127 additions and 11 deletions

View File

@ -20,7 +20,7 @@ class PageDisplay {
// Sidebar page nav click event // Sidebar page nav click event
$('.sidebar-page-nav').on('click', 'a', event => { $('.sidebar-page-nav').on('click', 'a', event => {
goToText(event.target.getAttribute('href').substr(1)); this.goToText(event.target.getAttribute('href').substr(1));
}); });
} }

View File

@ -16,6 +16,8 @@ require('codemirror/mode/toml/toml');
require('codemirror/mode/xml/xml'); require('codemirror/mode/xml/xml');
require('codemirror/mode/yaml/yaml'); require('codemirror/mode/yaml/yaml');
const Clipboard = require("clipboard");
const CodeMirror = require('codemirror'); const CodeMirror = require('codemirror');
const modeMap = { const modeMap = {
@ -77,7 +79,7 @@ function highlightElem(elem) {
elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n'); elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
let content = elem.textContent.trim(); let content = elem.textContent.trim();
CodeMirror(function(elt) { let cm = CodeMirror(function(elt) {
elem.parentNode.replaceChild(elt, elem); elem.parentNode.replaceChild(elt, elem);
}, { }, {
value: content, value: content,
@ -86,6 +88,33 @@ function highlightElem(elem) {
theme: getTheme(), theme: getTheme(),
readOnly: true readOnly: true
}); });
addCopyIcon(cm);
}
/**
* Add a button to a CodeMirror instance which copies the contents to the clipboard upon click.
* @param cmInstance
*/
function addCopyIcon(cmInstance) {
const copyIcon = `<svg viewBox="0 0 24 24" width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>`;
const copyButton = document.createElement('div');
copyButton.classList.add('CodeMirror-copy');
copyButton.innerHTML = copyIcon;
cmInstance.display.wrapper.appendChild(copyButton);
const clipboard = new Clipboard(copyButton, {
text: function(trigger) {
return cmInstance.getValue()
}
});
clipboard.on('success', event => {
copyButton.classList.add('success');
setTimeout(() => {
copyButton.classList.remove('success');
}, 360);
});
} }
/** /**

View File

@ -13,3 +13,12 @@ export function utcTimeStampToLocalTime(timestamp) {
let mins = date.getMinutes(); let mins = date.getMinutes();
return `${(hours>9?'':'0') + hours}:${(mins>9?'':'0') + mins}`; return `${(hours>9?'':'0') + hours}:${(mins>9?'':'0') + mins}`;
} }
export function formatDateTime(date) {
let month = date.getMonth() + 1;
let day = date.getDate();
let hours = date.getHours();
let mins = date.getMinutes();
return `${date.getFullYear()}-${(month>9?'':'0') + month}-${(day>9?'':'0') + day} ${(hours>9?'':'0') + hours}:${(mins>9?'':'0') + mins}`;
}

View File

@ -52,7 +52,9 @@ let methods = {
}, },
deleteFile(file) { deleteFile(file) {
if (!file.deleting) return file.deleting = true; if (!file.deleting) {
return this.$set(file, 'deleting', true);
}
this.$http.delete(window.baseUrl(`/attachments/${file.id}`)).then(resp => { this.$http.delete(window.baseUrl(`/attachments/${file.id}`)).then(resp => {
this.$events.emit('success', resp.data.message); this.$events.emit('success', resp.data.message);

View File

@ -1,3 +1,6 @@
import * as Dates from "../services/dates";
const dropzone = require('./components/dropzone'); const dropzone = require('./components/dropzone');
let page = 0; let page = 0;
@ -168,7 +171,7 @@ const methods = {
}, },
getDate(stringDate) { getDate(stringDate) {
return new Date(stringDate); return Dates.formatDateTime(new Date(stringDate));
}, },
uploadSuccess(event) { uploadSuccess(event) {

View File

@ -404,3 +404,37 @@ span.CodeMirror-selectedtext { background: none; }
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
/**
* Custom Copy Button
*/
.CodeMirror-copy {
position: absolute;
top: -1px;
right: -1px;
background-color: #EEE;
padding: $-xs;
line-height: 0;
border: 1px solid #DDD;
cursor: pointer;
fill: #444;
z-index: 5;
transition: all ease-in 180ms;
user-select: none;
opacity: 0.7;
svg {
transition: transform ease-in 180ms;
transform: translateY(0);
}
&.success {
background-color: lighten($positive, 10%);
fill: #FFF;
svg {
transform: translateY(-3px);
}
}
}
.CodeMirror:hover .CodeMirror-copy {
user-select: all;
opacity: 1;
}

View File

@ -89,6 +89,12 @@
del { del {
background: #FFECEC; background: #FFECEC;
} }
&.page-revision {
pre code {
white-space: pre-wrap;
}
}
} }
// Page content pointers // Page content pointers

View File

@ -35,6 +35,8 @@ return [
'book_delete' => 'libro borrado', 'book_delete' => 'libro borrado',
'book_delete_notification' => 'Libro borrado exitosamente', 'book_delete_notification' => 'Libro borrado exitosamente',
'book_sort' => 'libro ordenado', 'book_sort' => 'libro ordenado',
'book_sort_notification' => 'Libro re-ordenado exitosamente', 'book_sort_notification' => 'Libro reordenado exitosamente',
// Other
'commented_on' => 'comentada el',
]; ];

View File

@ -31,6 +31,7 @@ return [
'edit' => 'Editar', 'edit' => 'Editar',
'sort' => 'Ordenar', 'sort' => 'Ordenar',
'move' => 'Mover', 'move' => 'Mover',
'copy' => 'Copiar',
'reply' => 'Responder', 'reply' => 'Responder',
'delete' => 'Borrar', 'delete' => 'Borrar',
'search' => 'Buscar', 'search' => 'Buscar',

View File

@ -166,6 +166,9 @@ return [
'pages_not_in_chapter' => 'La página no está en un capítulo', 'pages_not_in_chapter' => 'La página no está en un capítulo',
'pages_move' => 'Mover página', 'pages_move' => 'Mover página',
'pages_move_success' => 'Página movida a ":parentName"', 'pages_move_success' => 'Página movida a ":parentName"',
'pages_copy' => 'Copiar página',
'pages_copy_desination' => 'Destino de la copia',
'pages_copy_success' => 'Página copiada a correctamente',
'pages_permissions' => 'Permisos de página', 'pages_permissions' => 'Permisos de página',
'pages_permissions_success' => 'Permisos de página actualizados', 'pages_permissions_success' => 'Permisos de página actualizados',
'pages_revision' => 'Revisión', 'pages_revision' => 'Revisión',

View File

@ -7,7 +7,7 @@ return [
*/ */
// Permissions // Permissions
'permission' => 'UNo tiene permisos para visualizar la página solicitada.', 'permission' => 'No tiene permisos para visualizar la página solicitada.',
'permissionJson' => 'No tiene permisos para ejecutar la acción solicitada.', 'permissionJson' => 'No tiene permisos para ejecutar la acción solicitada.',
// Auth // Auth

View File

@ -34,6 +34,7 @@ return [
'app_homepage' => 'Página de inicio', 'app_homepage' => 'Página de inicio',
'app_homepage_desc' => 'Elija la página que se mostrará al inicio en lugar de la vista predeterminada. Se ignorarán los permisos de la página seleccionada.', 'app_homepage_desc' => 'Elija la página que se mostrará al inicio en lugar de la vista predeterminada. Se ignorarán los permisos de la página seleccionada.',
'app_homepage_default' => 'Página de inicio seleccionada', 'app_homepage_default' => 'Página de inicio seleccionada',
'app_homepage_books' => 'O selecciona la página de libros como página de inicio. Esto prevalecerá sobre cualquier página seleccionada como página de inicio.',
'app_disable_comments' => 'Deshabilitar comentarios', 'app_disable_comments' => 'Deshabilitar comentarios',
'app_disable_comments_desc' => 'Deshabilita los comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.', 'app_disable_comments_desc' => 'Deshabilita los comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.',
@ -50,6 +51,19 @@ return [
'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comas de los dominio a los que les gustaría restringir el registro de usuarios. A los usuarios les será enviado un correo electrónico para confirmar la dirección antes de que se le permita interactuar con la aplicación. <br> Tenga en cuenta que los usuarios podrán cambiar sus direcciones de correo electrónico después de registrarse exitosamente.', 'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comas de los dominio a los que les gustaría restringir el registro de usuarios. A los usuarios les será enviado un correo electrónico para confirmar la dirección antes de que se le permita interactuar con la aplicación. <br> Tenga en cuenta que los usuarios podrán cambiar sus direcciones de correo electrónico después de registrarse exitosamente.',
'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida', 'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida',
/**
* Maintenance settings
*/
'maint' => 'Mantenimiento',
'maint_image_cleanup' => 'Limpiar imágenes',
'maint_image_cleanup_desc' => "Analiza las páginas y sus revisiones para comprobar qué imágenes y dibujos están siendo utilizadas y cuales no son necesarias. Asegúrate de crear una copia completa de la base de datos y de las imágenes antes de lanzar esta opción.",
'maint_image_cleanup_ignore_revisions' => 'Ignorar imágenes en revisiones',
'maint_image_cleanup_run' => 'Lanzar limpieza',
'maint_image_cleanup_warning' => 'Se han encontrado :count imágenes posiblemente no utilizadas . ¿Estás seguro de querer borrar estas imágenes?',
'maint_image_cleanup_success' => '¡Se han encontrado y borrado :count imágenes posiblemente no utilizadas!',
'maint_image_cleanup_nothing_found' => '¡No se han encontrado imágenes sin utilizar, no se han borrado imágenes!',
/** /**
* Role settings * Role settings
*/ */

View File

@ -34,10 +34,10 @@ return [
'app_homepage' => 'Página de inicio de la Aplicación', 'app_homepage' => 'Página de inicio de la Aplicación',
'app_homepage_desc' => 'Seleccione una página de inicio para mostrar en lugar de la vista por defecto. Se ignoran los permisos de página para las páginas seleccionadas.', 'app_homepage_desc' => 'Seleccione una página de inicio para mostrar en lugar de la vista por defecto. Se ignoran los permisos de página para las páginas seleccionadas.',
'app_homepage_default' => 'Página de inicio por defecto seleccionadad', 'app_homepage_default' => 'Página de inicio por defecto seleccionadad',
'app_homepage_books' => 'O seleccione la página de libros como su página de inicio. Esto tendrá preferencia sobre cualquier página seleccionada como página de inicio.',
'app_disable_comments' => 'Deshabilitar comentarios', 'app_disable_comments' => 'Deshabilitar comentarios',
'app_disable_comments_desc' => 'Deshabilitar comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.', 'app_disable_comments_desc' => 'Deshabilitar comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.',
/** /**
* Registration settings * Registration settings
*/ */
@ -51,6 +51,19 @@ return [
'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comas de los correos electrónicos del dominio a los que les gustaría restringir el registro por dominio. A los usuarios les será enviado un correo elctrónico para confirmar la dirección antes de que se le permita interactuar con la aplicación. <br> Note que a los usuarios se les permitirá cambiar sus direcciones de correo electrónico luego de un registro éxioso.', 'reg_confirm_restrict_domain_desc' => 'Introduzca una lista separada por comas de los correos electrónicos del dominio a los que les gustaría restringir el registro por dominio. A los usuarios les será enviado un correo elctrónico para confirmar la dirección antes de que se le permita interactuar con la aplicación. <br> Note que a los usuarios se les permitirá cambiar sus direcciones de correo electrónico luego de un registro éxioso.',
'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida', 'reg_confirm_restrict_domain_placeholder' => 'Ninguna restricción establecida',
/**
* Maintenance settings
*/
'maint' => 'Mantenimiento',
'maint_image_cleanup' => 'Limpiar imágenes',
'maint_image_cleanup_desc' => "Analizar contenido de páginas y revisiones para detectar cuáles imágenes y dibujos están en uso y cuáles son redundantes. Asegúrese de crear un respaldo completo de imágenes y base de datos antes de ejecutar esta tarea.",
'maint_image_cleanup_ignore_revisions' => 'Ignorar imágenes en revisión',
'maint_image_cleanup_run' => 'Ejecutar limpieza',
'maint_image_cleanup_warning' => 'Se encontraron :count imágenes pontencialmente sin uso. Está seguro de que quiere eliminarlas?',
'maint_image_cleanup_success' => 'Se encontraron y se eliminaron :count imágenes pontencialmente sin uso!',
'maint_image_cleanup_nothing_found' => 'No se encotraron imágenes sin usar, Nada eliminado!',
/** /**
* Role settings * Role settings
*/ */

View File

@ -42,8 +42,8 @@
<span class="text-primary small" @click="file.deleting = false;">{{ trans('common.cancel') }}</span> <span class="text-primary small" @click="file.deleting = false;">{{ trans('common.cancel') }}</span>
</div> </div>
</div> </div>
<div @click="startEdit(file)" class="drag-card-action text-center text-primary" style="padding: 0;">@icon('edit')</div> <div @click="startEdit(file)" class="drag-card-action text-center text-primary">@icon('edit')</div>
<div @click="deleteFile(file)" class="drag-card-action text-center text-neg" style="padding: 0;">@icon('close')</div> <div @click="deleteFile(file)" class="drag-card-action text-center text-neg">@icon('close')</div>
</div> </div>
</draggable> </draggable>
<p class="small muted" v-if="files.length === 0"> <p class="small muted" v-if="files.length === 0">

View File

@ -14,7 +14,7 @@
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-9"> <div class="col-md-9">
<div class="page-content"> <div class="page-content page-revision">
@include('pages.page-display') @include('pages.page-display')
</div> </div>
</div> </div>