From 9c765bf863122a1a73f64e64341650704ef728a4 Mon Sep 17 00:00:00 2001 From: j Date: Fri, 1 Feb 2019 14:27:28 +0530 Subject: [PATCH 1/2] don't deselect on click, only scroll if not in view --- static/reader/epub.js | 4 +--- static/reader/pdf.js | 14 +++++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/static/reader/epub.js b/static/reader/epub.js index b4326a3..9aca10f 100644 --- a/static/reader/epub.js +++ b/static/reader/epub.js @@ -113,9 +113,7 @@ function getText(book, cfiRange, cb) { function onHighlightClicked(e) { console.log("highlight clicked", e.target.dataset.epubcfi); - if(e.target.classList.contains('selected')) { - e.target.classList.remove('selected') - } else { + if(!e.target.classList.contains('selected')) { document.querySelectorAll('.epubjs-hl.selected').forEach(function(other) { other.classList.remove('selected') }) diff --git a/static/reader/pdf.js b/static/reader/pdf.js index 44db149..1e4b003 100644 --- a/static/reader/pdf.js +++ b/static/reader/pdf.js @@ -22,7 +22,7 @@ Ox.load({ } setTimeout(function() { var el = document.querySelector('.a' + annotation.id); - if (el) { + if (el && !isInView(el)) { document.querySelector('#viewerContainer').scrollTop = el.offsetTop + el.parentElement.offsetTop - 64; } }, delay) @@ -134,10 +134,7 @@ function renderAnnotation(annotation) { 'width:' + Math.abs(bounds[0] - bounds[2]) + 'px; height:' + Math.abs(bounds[1] - bounds[3]) + 'px;'); el.addEventListener('click', function() { - if (el.classList.contains('selected')) { - deselectAnnotation(annotation.id) - Ox.$parent.postMessage('selectAnnotation', {id: null}) - } else { + if (!el.classList.contains('selected')) { selectAnnotation(annotation.id) Ox.$parent.postMessage('selectAnnotation', {id: annotation.id}) } @@ -204,3 +201,10 @@ function loadAnnotations(page) { }) } +function isInView(element) { + var docViewTop = $(window).scrollTop(); + var docViewBottom = docViewTop + $(window).height(); + var elementTop = $(element).offset().top; + var elementBottom = elementTop + $(element).height(); + return elementTop < docViewBottom && elementBottom > docViewTop; +} From fbcbc2ab7b8177c3058d11ae702d4b77773908ec Mon Sep 17 00:00:00 2001 From: j Date: Fri, 1 Feb 2019 14:49:43 +0530 Subject: [PATCH 2/2] export annotations --- static/js/annotationPanel.js | 17 +++++++- static/js/exportAnnotationsDialog.js | 62 ++++++++++++++++++++++++++++ static/js/viewer.js | 4 +- static/json/js.json | 1 + 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 static/js/exportAnnotationsDialog.js diff --git a/static/js/annotationPanel.js b/static/js/annotationPanel.js index 847ef54..0ca5c7a 100644 --- a/static/js/annotationPanel.js +++ b/static/js/annotationPanel.js @@ -31,6 +31,8 @@ oml.ui.annotationPanel = function() { {id: 'note', title: Ox._('By Note Text'), checked: false}, {id: 'date', title: Ox._('By Date Added'), checked: false} ]}, + {}, + {id: 'exportAnnotations', title: Ox._('Export Annotations')}, ], style: 'square', title: 'set', @@ -39,7 +41,20 @@ oml.ui.annotationPanel = function() { }).css({ // borderColor: 'transparent', float: 'right' - }).appendTo($bar); + }).appendTo($bar) + .bindEvent({ + click: function(data) { + var id = data.id; + if (id == 'exportAnnotations') { + oml.api.get({ + id: oml.user.ui.item, + keys: [] + }, function(result) { + oml.ui.exportAnnotationsDialog(result.data).open() + }) + } + } + }); var ui = oml.user.ui; var that = Ox.SplitPanel({ diff --git a/static/js/exportAnnotationsDialog.js b/static/js/exportAnnotationsDialog.js new file mode 100644 index 0000000..f891efa --- /dev/null +++ b/static/js/exportAnnotationsDialog.js @@ -0,0 +1,62 @@ +'use strict'; + +oml.ui.exportAnnotationsDialog = function(data) { + + var ui = oml.user.ui, + + $text = Ox.Input({ + type: 'textarea', + style: 'squared', + value: getAnnotationsText(), + width: 640, + height: 480 + }) + .css({margin: '16px'}), + + that = Ox.Dialog({ + buttons: [ + Ox.Button({ + id: 'done', + style: 'squared', + title: Ox._('Done') + }) + .bindEvent({ + click: function() { + that.close(); + } + }) + ], + closeButton: true, + content: $text, + height: 480 + 2 * 16, + keys: {enter: 'done'}, + removeOnClose: true, + title: Ox._('Export Annotations'), + width: 640 + 2* 16 + }) + .bindEvent({ + close: function() { + that.close(); + }, + open: function() { + // .. + } + }); + + function getAnnotationsText() { + var annotations = oml.$ui.viewer.getAnnotations() + var text = 'Annotations for ' + data.title + ' (' + data.author.join(', ') + ')\n\n\n\n' + text += annotations.map(function(annotation) { + var text = 'Quote:\n\n' + annotation.text + if (annotation.notes.length) { + text += '\n\nNotes:\n' + annotation.notes.map(function(note) { + return note.value + }).join('\n\n') + } + return text + }).join('\n\n\n\n') + return text + } + return that; + +}; diff --git a/static/js/viewer.js b/static/js/viewer.js index 092657a..e45c4ac 100644 --- a/static/js/viewer.js +++ b/static/js/viewer.js @@ -143,6 +143,8 @@ oml.ui.viewer = function() { that.postMessage = function(event, data) { $iframe && $iframe.postMessage(event, data) }; - + that.getAnnotations = function() { + return annotations; + } return that.updateElement(); }; diff --git a/static/json/js.json b/static/json/js.json index 5578ee0..f283185 100644 --- a/static/json/js.json +++ b/static/json/js.json @@ -19,6 +19,7 @@ "deleteListDialog.js", "editDialog.js", "errorDialog.js", + "exportAnnotationsDialog.js", "filter.js", "filtersInnerPanel.js", "filtersOuterPanel.js",