import AbstractSearchOption from "./abstract_search_option.js"; import SpacedUpdate from "../../services/spaced_update.js"; import server from "../../services/server.js"; import shortcutService from "../../services/shortcuts.js"; import appContext from "../../components/app_context.js"; import { t } from "../../services/i18n.js"; import { Tooltip } from "bootstrap"; const TPL = ` ${t("search_string.title_column")} `; export default class SearchString extends AbstractSearchOption { static get optionName() { return "searchString"; } static get attributeType() { return "label"; } static async create(noteId) { await AbstractSearchOption.setAttribute(noteId, "label", "searchString"); } doRender() { const $option = $(TPL); this.$searchString = $option.find(".search-string"); this.$searchString.on("input", () => this.spacedUpdate.scheduleUpdate()); shortcutService.bindElShortcut(this.$searchString, "return", async () => { // this also in effect disallows new lines in query string. // on one hand, this makes sense since search string is a label // on the other hand, it could be nice for structuring long search string. It's probably a niche case though. await this.spacedUpdate.updateNowIfNecessary(); this.triggerCommand("refreshResults"); }); this.spacedUpdate = new SpacedUpdate(async () => { const searchString = this.$searchString.val(); appContext.lastSearchString = searchString; await this.setAttribute("label", "searchString", searchString); if (this.note.title.startsWith(t("search_string.search_prefix"))) { await server.put(`notes/${this.note.noteId}/title`, { title: `${t("search_string.search_prefix")} ${searchString.length < 30 ? searchString : `${searchString.substr(0, 30)}…`}` }); } }, 1000); this.$searchString.val(this.note.getLabelValue("searchString")); return $option; } showSearchErrorEvent({ error }) { let tooltip = new Tooltip(this.$searchString, { trigger: "manual", title: `${t("search_string.error", { error })}`, placement: "bottom" }); tooltip.show(); setTimeout(() => tooltip.dispose(), 4000); } focusOnSearchDefinitionEvent() { this.$searchString .val(this.$searchString.val().trim() || appContext.lastSearchString) .focus() .select(); this.spacedUpdate.scheduleUpdate(); } }