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').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/yaml/yaml');
 | 
			
		||||
 | 
			
		||||
const Clipboard = require("clipboard");
 | 
			
		||||
 | 
			
		||||
const CodeMirror = require('codemirror');
 | 
			
		||||
 | 
			
		||||
const modeMap = {
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +79,7 @@ function highlightElem(elem) {
 | 
			
		|||
    elem.innerHTML = elem.innerHTML.replace(/<br\s*[\/]?>/gi ,'\n');
 | 
			
		||||
    let content = elem.textContent.trim();
 | 
			
		||||
 | 
			
		||||
    CodeMirror(function(elt) {
 | 
			
		||||
    let cm = CodeMirror(function(elt) {
 | 
			
		||||
        elem.parentNode.replaceChild(elt, elem);
 | 
			
		||||
    }, {
 | 
			
		||||
        value: content,
 | 
			
		||||
| 
						 | 
				
			
			@ -86,6 +88,33 @@ function highlightElem(elem) {
 | 
			
		|||
        theme: getTheme(),
 | 
			
		||||
        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();
 | 
			
		||||
    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) {
 | 
			
		||||
        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.$events.emit('success', resp.data.message);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,6 @@
 | 
			
		|||
 | 
			
		||||
import * as Dates from "../services/dates";
 | 
			
		||||
 | 
			
		||||
const dropzone = require('./components/dropzone');
 | 
			
		||||
 | 
			
		||||
let page = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +171,7 @@ const methods = {
 | 
			
		|||
    },
 | 
			
		||||
 | 
			
		||||
    getDate(stringDate) {
 | 
			
		||||
        return new Date(stringDate);
 | 
			
		||||
        return Dates.formatDateTime(new Date(stringDate));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    uploadSuccess(event) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -404,3 +404,37 @@ span.CodeMirror-selectedtext { background: none; }
 | 
			
		|||
  width: 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 {
 | 
			
		||||
    background: #FFECEC;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.page-revision {
 | 
			
		||||
    pre code {
 | 
			
		||||
      white-space: pre-wrap;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Page content pointers
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,8 @@ return [
 | 
			
		|||
    'book_delete'                 => 'libro borrado',
 | 
			
		||||
    'book_delete_notification'    => 'Libro borrado exitosamente',
 | 
			
		||||
    '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',
 | 
			
		||||
    'sort' => 'Ordenar',
 | 
			
		||||
    'move' => 'Mover',
 | 
			
		||||
    'copy' => 'Copiar',
 | 
			
		||||
    'reply' => 'Responder',
 | 
			
		||||
    'delete' => 'Borrar',
 | 
			
		||||
    'search' => 'Buscar',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -166,6 +166,9 @@ return [
 | 
			
		|||
    'pages_not_in_chapter' => 'La página no está en un capítulo',
 | 
			
		||||
    'pages_move' => 'Mover página',
 | 
			
		||||
    '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_success' => 'Permisos de página actualizados',
 | 
			
		||||
    'pages_revision' => 'Revisión',
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ return [
 | 
			
		|||
     */
 | 
			
		||||
 | 
			
		||||
    // 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.',
 | 
			
		||||
 | 
			
		||||
    // Auth
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ return [
 | 
			
		|||
    '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_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_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_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
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,10 +34,10 @@ return [
 | 
			
		|||
    '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_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_desc' => 'Deshabilitar comentarios en todas las páginas de la aplicación. Los comentarios existentes no se muestran.',
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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_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
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,8 +42,8 @@
 | 
			
		|||
                                            <span class="text-primary small" @click="file.deleting = false;">{{ trans('common.cancel') }}</span>
 | 
			
		||||
                                        </div>
 | 
			
		||||
                                    </div>
 | 
			
		||||
                                    <div @click="startEdit(file)" class="drag-card-action text-center text-primary" style="padding: 0;">@icon('edit')</div>
 | 
			
		||||
                                    <div @click="deleteFile(file)" class="drag-card-action text-center text-neg" style="padding: 0;">@icon('close')</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">@icon('close')</div>
 | 
			
		||||
                                </div>
 | 
			
		||||
                            </draggable>
 | 
			
		||||
                            <p class="small muted" v-if="files.length === 0">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,7 @@
 | 
			
		|||
    <div class="container">
 | 
			
		||||
        <div class="row">
 | 
			
		||||
            <div class="col-md-9">
 | 
			
		||||
                <div class="page-content">
 | 
			
		||||
                <div class="page-content page-revision">
 | 
			
		||||
                    @include('pages.page-display')
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue