mobile web fixes

This commit is contained in:
zadam 2019-05-22 20:53:59 +02:00
parent 48b1aece4d
commit 79956b5676
7 changed files with 105 additions and 76 deletions

View File

@ -28,7 +28,9 @@
} }
async function validatorJavaScript(text, options) { async function validatorJavaScript(text, options) {
if (glob.getActiveNote() == null || glob.getActiveNote().mime === 'application/json') { if (glob.isMobile()
|| glob.getActiveNote() == null
|| glob.getActiveNote().mime === 'application/json') {
// eslint doesn't seem to validate pure JSON well // eslint doesn't seem to validate pure JSON well
return []; return [];
} }

View File

@ -42,6 +42,9 @@ import macInit from './services/mac_init.js';
import cssLoader from './services/css_loader.js'; import cssLoader from './services/css_loader.js';
import dateNoteService from './services/date_notes.js'; import dateNoteService from './services/date_notes.js';
window.glob.isDesktop = utils.isDesktop;
window.glob.isMobile = utils.isMobile;
// required for CKEditor image upload plugin // required for CKEditor image upload plugin
window.glob.getActiveNode = treeService.getActiveNode; window.glob.getActiveNode = treeService.getActiveNode;
window.glob.getHeaders = server.getHeaders; window.glob.getHeaders = server.getHeaders;

View File

@ -8,6 +8,9 @@ import treeChangesService from "./services/branches.js";
import utils from "./services/utils.js"; import utils from "./services/utils.js";
import treeUtils from "./services/tree_utils.js"; import treeUtils from "./services/tree_utils.js";
window.glob.isDesktop = utils.isDesktop;
window.glob.isMobile = utils.isMobile;
const $leftPane = $("#left-pane"); const $leftPane = $("#left-pane");
const $tree = $("#tree"); const $tree = $("#tree");
const $detail = $("#detail"); const $detail = $("#detail");
@ -42,6 +45,13 @@ async function showTree() {
source: tree, source: tree,
scrollParent: $tree, scrollParent: $tree,
minExpandLevel: 2, // root can't be collapsed minExpandLevel: 2, // root can't be collapsed
click: (event, data) => {
if (data.targetType !== 'expander' && data.node.isActive()) {
$tree.fancytree('getTree').reactivate(true);
return false;
}
},
activate: async (event, data) => { activate: async (event, data) => {
const node = data.node; const node = data.node;
@ -97,10 +107,10 @@ $detail.on("click", ".note-menu-button", async e => {
treeService.createNote(node, node.data.noteId, 'into'); treeService.createNote(node, node.data.noteId, 'into');
} }
else if (cmd === "delete") { else if (cmd === "delete") {
treeChangesService.deleteNodes([node]); if (await treeChangesService.deleteNodes([node])) {
// move to the tree
// move to the tree togglePanes();
togglePanes(); }
} }
else { else {
throw new Error("Unrecognized command " + cmd); throw new Error("Unrecognized command " + cmd);

View File

@ -82,7 +82,7 @@ async function deleteNodes(nodes) {
nodes = await filterRootNote(nodes); nodes = await filterRootNote(nodes);
if (nodes.length === 0 || !confirm('Are you sure you want to delete select note(s) and all the sub-notes?')) { if (nodes.length === 0 || !confirm('Are you sure you want to delete select note(s) and all the sub-notes?')) {
return; return false;
} }
for (const node of nodes) { for (const node of nodes) {
@ -123,6 +123,8 @@ async function deleteNodes(nodes) {
} }
infoService.showMessage("Note(s) has been deleted."); infoService.showMessage("Note(s) has been deleted.");
return true;
} }
async function moveNodeUpInHierarchy(node) { async function moveNodeUpInHierarchy(node) {

View File

@ -1,6 +1,6 @@
import server from "./server.js"; import server from "./server.js";
import noteDetailService from "./note_detail.js"; import noteDetailService from "./note_detail.js";
import treeService from './tree.js'; import utils from './utils.js';
// this key needs to have this value so it's hit by the tooltip // this key needs to have this value so it's hit by the tooltip
const SELECTED_PATH_KEY = "data-note-path"; const SELECTED_PATH_KEY = "data-note-path";
@ -21,84 +21,94 @@ async function autocompleteSource(term, cb) {
} }
function clearText($el) { function clearText($el) {
if (utils.isMobile()) {
return;
}
$el.setSelectedPath(""); $el.setSelectedPath("");
$el.autocomplete("val", "").change(); $el.autocomplete("val", "").change();
} }
function showRecentNotes($el) { function showRecentNotes($el) {
if (utils.isMobile()) {
return;
}
$el.setSelectedPath(""); $el.setSelectedPath("");
$el.autocomplete("val", ""); $el.autocomplete("val", "");
$el.focus(); $el.focus();
} }
function initNoteAutocomplete($el, options) { function initNoteAutocomplete($el, options) {
if (!$el.hasClass("note-autocomplete-input")) { if ($el.hasClass("note-autocomplete-input") || utils.isMobile()) {
options = options || {}; return $el;
$el.addClass("note-autocomplete-input");
const $clearTextButton = $("<a>")
.addClass("input-group-text input-clearer-button jam jam-close")
.prop("title", "Clear text field");
const $showRecentNotesButton = $("<a>")
.addClass("input-group-text show-recent-notes-button jam jam-clock")
.prop("title", "Show recent notes");
const $goToSelectedNoteButton = $("<a>")
.addClass("input-group-text go-to-selected-note-button jam jam-arrow-right")
.attr("data-action", "note");
const $sideButtons = $("<div>")
.addClass("input-group-append")
.append($clearTextButton)
.append($showRecentNotesButton);
if (!options.hideGoToSelectedNoteButton) {
$sideButtons.append($goToSelectedNoteButton);
}
$el.after($sideButtons);
$clearTextButton.click(() => clearText($el));
$showRecentNotesButton.click(e => {
showRecentNotes($el);
// this will cause the click not give focus to the "show recent notes" button
// this is important because otherwise input will lose focus immediatelly and not show the results
return false;
});
$el.autocomplete({
appendTo: document.querySelector('body'),
hint: false,
autoselect: true,
openOnFocus: true,
minLength: 0,
tabAutocomplete: false
}, [
{
source: autocompleteSource,
displayKey: 'title',
templates: {
suggestion: function(suggestion) {
return suggestion.highlighted;
}
},
// we can't cache identical searches because notes can be created / renamed, new recent notes can be added
cache: false
}
]);
$el.on('autocomplete:selected', (event, suggestion) => $el.setSelectedPath(suggestion.path));
$el.on('autocomplete:closed', () => {
if (!$el.val().trim()) {
clearText($el);
}
});
} }
options = options || {};
$el.addClass("note-autocomplete-input");
const $clearTextButton = $("<a>")
.addClass("input-group-text input-clearer-button jam jam-close")
.prop("title", "Clear text field");
const $showRecentNotesButton = $("<a>")
.addClass("input-group-text show-recent-notes-button jam jam-clock")
.prop("title", "Show recent notes");
const $goToSelectedNoteButton = $("<a>")
.addClass("input-group-text go-to-selected-note-button jam jam-arrow-right")
.attr("data-action", "note");
const $sideButtons = $("<div>")
.addClass("input-group-append")
.append($clearTextButton)
.append($showRecentNotesButton);
if (!options.hideGoToSelectedNoteButton) {
$sideButtons.append($goToSelectedNoteButton);
}
$el.after($sideButtons);
$clearTextButton.click(() => clearText($el));
$showRecentNotesButton.click(e => {
showRecentNotes($el);
// this will cause the click not give focus to the "show recent notes" button
// this is important because otherwise input will lose focus immediatelly and not show the results
return false;
});
$el.autocomplete({
appendTo: document.querySelector('body'),
hint: false,
autoselect: true,
openOnFocus: true,
minLength: 0,
tabAutocomplete: false
}, [
{
source: autocompleteSource,
displayKey: 'title',
templates: {
suggestion: function(suggestion) {
return suggestion.highlighted;
}
},
// we can't cache identical searches because notes can be created / renamed, new recent notes can be added
cache: false
}
]);
$el.on('autocomplete:selected', (event, suggestion) => $el.setSelectedPath(suggestion.path));
$el.on('autocomplete:closed', () => {
if (!$el.val().trim()) {
clearText($el);
}
});
return $el; return $el;
} }

View File

@ -75,7 +75,10 @@ class TabContext {
treeService.setNoteTitle(this.noteId, title); treeService.setNoteTitle(this.noteId, title);
}); });
this.$noteTitle.bind('keydown', 'return', () => this.getComponent().focus()); if (utils.isDesktop()) {
// keyboard plugin is not loaded in mobile
this.$noteTitle.bind('keydown', 'return', () => this.getComponent().focus());
}
this.$protectButton = this.$tabContent.find(".protect-button"); this.$protectButton = this.$tabContent.find(".protect-button");
this.$protectButton.click(protectedSessionService.protectNoteAndSendToServer); this.$protectButton.click(protectedSessionService.protectNoteAndSendToServer);

View File

@ -649,9 +649,8 @@ async function createNote(node, parentNoteId, target, extraOptions = {}) {
if (!node.getChildren() && node.isFolder()) { if (!node.getChildren() && node.isFolder()) {
await node.setExpanded(); await node.setExpanded();
} }
else {
node.addChildren(newNode); node.addChildren(newNode);
}
await node.getLastChild().setActive(true); await node.getLastChild().setActive(true);