diff --git a/src/public/javascripts/dialogs/attributes.js b/src/public/javascripts/dialogs/attributes.js index 6fe6fc18b..7671e7333 100644 --- a/src/public/javascripts/dialogs/attributes.js +++ b/src/public/javascripts/dialogs/attributes.js @@ -3,6 +3,7 @@ import server from '../services/server.js'; import infoService from "../services/info.js"; import treeUtils from "../services/tree_utils.js"; import linkService from "../services/link.js"; +import noteAutocompleteService from "../services/note_autocomplete.js"; const $dialog = $("#attributes-dialog"); const $saveAttributesButton = $("#save-attributes-button"); @@ -306,49 +307,6 @@ $dialog.on('focus', '.label-value', async function (e) { $(this).autocomplete("search", $(this).val()); }); -async function initNoteAutocomplete($el) { - if (!$el.hasClass("ui-autocomplete-input")) { - await $el.autocomplete({ - source: async function (request, response) { - const result = await server.get('autocomplete?query=' + encodeURIComponent(request.term)); - - if (result.length > 0) { - response(result.map(row => { - return { - label: row.label, - value: row.label + ' (' + row.value + ')' - } - })); - } - else { - response([{ - label: "No results", - value: "No results" - }]); - } - }, - minLength: 0, - select: function (event, ui) { - if (ui.item.value === 'No results') { - return false; - } - } - }); - } -} - -$dialog.on('focus', '.relation-target-note-id', async function () { - await initNoteAutocomplete($(this)); -}); - -$dialog.on('click', '.relations-show-recent-notes', async function () { - const $autocomplete = $(this).parent().find('.relation-target-note-id'); - - await initNoteAutocomplete($autocomplete); - - $autocomplete.autocomplete("search", ""); -}); - export default { showDialog }; \ No newline at end of file diff --git a/src/public/javascripts/services/note_autocomplete.js b/src/public/javascripts/services/note_autocomplete.js new file mode 100644 index 000000000..ffa4325b4 --- /dev/null +++ b/src/public/javascripts/services/note_autocomplete.js @@ -0,0 +1,54 @@ +import server from "./server.js"; + +async function initNoteAutocomplete($el) { + if (!$el.hasClass("ui-autocomplete-input")) { + const $showRecentNotesButton = $("") + .addClass("input-group-addon show-recent-notes-button") + .prop("title", "Show recent notes"); + + $el.after($showRecentNotesButton); + + $showRecentNotesButton.click(() => $el.autocomplete("search", "")); + + await $el.autocomplete({ + appendTo: $el.parent().parent(), + source: async function (request, response) { + const result = await server.get('autocomplete?query=' + encodeURIComponent(request.term)); + + if (result.length > 0) { + response(result.map(row => { + return { + label: row.label, + value: row.label + ' (' + row.value + ')' + } + })); + } + else { + response([{ + label: "No results", + value: "No results" + }]); + } + }, + minLength: 0, + change: function (event, ui) { + $el.trigger("change"); + }, + select: function (event, ui) { + if (ui.item.value === 'No results') { + return false; + } + } + }); + } +} + +ko.bindingHandlers.noteAutocomplete = { + init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { + initNoteAutocomplete($(element)); + } +}; + +export default { + initNoteAutocomplete +} \ No newline at end of file diff --git a/src/public/javascripts/services/note_detail.js b/src/public/javascripts/services/note_detail.js index 31003c32e..a95d9731e 100644 --- a/src/public/javascripts/services/note_detail.js +++ b/src/public/javascripts/services/note_detail.js @@ -16,6 +16,7 @@ import noteDetailFile from './note_detail_file.js'; import noteDetailSearch from './note_detail_search.js'; import noteDetailRender from './note_detail_render.js'; import bundleService from "./bundle.js"; +import noteAutocompleteService from "./note_autocomplete.js"; const $noteTitle = $("#note-title"); @@ -250,7 +251,7 @@ async function loadAttributes() { .addClass("form-control") .addClass("promoted-attribute-input"); - const $inputCell = $("").append($input); + const $inputCell = $("").append($("
").addClass("input-group").append($input)); const $actionCell = $(""); const $multiplicityCell = $(""); @@ -295,6 +296,17 @@ async function loadAttributes() { messagingService.logError("Unknown labelType=" + definitionAttr.labelType); } } + else if (valueAttr.type === 'relation') { + if (valueAttr.value) { + $input.val((await treeUtils.getNoteTitle(valueAttr.value) + " (" + valueAttr.value + ")")); + } + + await noteAutocompleteService.initNoteAutocomplete($input); + } + else { + messagingService.logError("Unknown attribute type=" + valueAttr.type); + return; + } if (definition.multiplicityType === "multivalue") { const addButton = $("") @@ -455,6 +467,11 @@ $promotedAttributesContainer.on('change', '.promoted-attribute-input', async eve if ($attr.prop("type") === "checkbox") { value = $attr.is(':checked') ? "true" : "false"; } + else if ($attr.prop("attribute-type") === "relation") { + if ($attr.val()) { + value = treeUtils.getNoteIdFromNotePath(linkService.getNotePathFromLabel($attr.val())); + } + } else { value = $attr.val(); } diff --git a/src/public/javascripts/services/utils.js b/src/public/javascripts/services/utils.js index 08ba5656b..95ccc2599 100644 --- a/src/public/javascripts/services/utils.js +++ b/src/public/javascripts/services/utils.js @@ -46,7 +46,7 @@ function isElectron() { function assertArguments() { for (const i in arguments) { if (!arguments[i]) { - throw new Error(`Argument idx#${i} should not be falsy: ${arguments[i]}`); + console.trace(`Argument idx#${i} should not be falsy: ${arguments[i]}`); } } } diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index 35169887c..894ac8cc1 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -437,4 +437,9 @@ html.theme-dark body { .pointer { cursor: pointer; +} + +.show-recent-notes-button { + background: url('/images/icons/clock-16.png') no-repeat center; + cursor: pointer; } \ No newline at end of file diff --git a/src/views/index.ejs b/src/views/index.ejs index bfad24bb7..9740109df 100644 --- a/src/views/index.ejs +++ b/src/views/index.ejs @@ -302,8 +302,6 @@
- -
@@ -326,8 +324,6 @@
- -
@@ -602,9 +598,7 @@
- - + data-bind="noteAutocomplete, value: relationValue, valueUpdate: 'blur', event: { blur: $parent.attributeChanged }">