mirror of
https://github.com/zadam/trilium.git
synced 2025-03-01 14:22:32 +01:00
mobile web fixes
This commit is contained in:
parent
48b1aece4d
commit
79956b5676
4
libraries/codemirror/addon/lint/eslint.js
vendored
4
libraries/codemirror/addon/lint/eslint.js
vendored
@ -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 [];
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user