mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
Merge branch 'master' into feature/edit-link-headers
This commit is contained in:
commit
f668bee88b
@ -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));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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}`;
|
||||||
|
}
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
}
|
@ -89,6 +89,12 @@
|
|||||||
del {
|
del {
|
||||||
background: #FFECEC;
|
background: #FFECEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.page-revision {
|
||||||
|
pre code {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Page content pointers
|
// Page content pointers
|
||||||
|
@ -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',
|
||||||
];
|
];
|
||||||
|
@ -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',
|
||||||
|
@ -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',
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user