Skip to content
Draft
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
c7980f4
refactor: add plan and package
JYC333 Mar 8, 2026
34ce5eb
refactor: add new autocomplete registry
JYC333 Mar 9, 2026
eaf89c6
refactor: use headless autocomplete, migrate attribute deatil
JYC333 Mar 9, 2026
6dd5352
fix: dropdown menu not follow the input when attribute detail dialog …
JYC333 Mar 9, 2026
3328266
refactor: migrate relation map
JYC333 Mar 9, 2026
06f2aa1
refactor: clean up old autocomplete implementation
JYC333 Mar 9, 2026
d5b496e
fix: relation definition is not included when create relation in rela…
JYC333 Mar 9, 2026
27a7a15
refactor: use ctrl+enter to confirm in relation creation at relation …
JYC333 Mar 9, 2026
1614ccf
refactor: fix cleanup to avoid DOM leaks
JYC333 Mar 9, 2026
3a6606b
refactor: limit ctrl+enter action only at when creating reation on re…
JYC333 Mar 9, 2026
0ca5439
refactor: migrate label autocomplete
JYC333 Mar 9, 2026
8a4a06e
refactor: address gemini code review
JYC333 Mar 9, 2026
128fa63
refactor: migrate note_autocomplete core function
JYC333 Mar 9, 2026
a5445d3
refactor: add back UI for note_autocomplete
JYC333 Mar 9, 2026
b6dea44
refactor: fix behaviour difference
JYC333 Mar 9, 2026
530e606
refactor: restore behaviors
JYC333 Mar 9, 2026
b92a5d1
refactor: fix attribute detail autocomplete doesn't catch default value
JYC333 Mar 9, 2026
cd7fb3d
refactor: minor fix
JYC333 Mar 9, 2026
a1b51e1
refactor: fix full search
JYC333 Mar 9, 2026
9869d29
refactor: minor cleanup
JYC333 Mar 9, 2026
3ac2e27
refactor: address gemini review
JYC333 Mar 9, 2026
0dee062
refactor: migrate react part
JYC333 Mar 9, 2026
f06dd3c
refactor: fix missing function def
JYC333 Mar 9, 2026
3f97516
refactor: extract common logic
JYC333 Mar 9, 2026
ff93907
refactor: migrate cleanup function
JYC333 Mar 9, 2026
e4ad356
refactor: fix attribute panel mouse hover behavior
JYC333 Mar 9, 2026
5ea355a
refactor: avoid xss attack
JYC333 Mar 9, 2026
eeb917e
refactor: fix enter can't execute action in dialog
JYC333 Mar 9, 2026
39408f2
refactor: update related css
JYC333 Mar 9, 2026
03a9685
refactor: remove old autocomplete declare
JYC333 Mar 9, 2026
99937bd
refactor: fix attribute detail can't save with ctrl+enter directly
JYC333 Mar 9, 2026
d1fc478
refactor: remove old autocomplete completely
JYC333 Mar 9, 2026
5adc79f
refactor: fix related test
JYC333 Mar 9, 2026
334c8cb
refactor: cleanup unused parts
JYC333 Mar 9, 2026
59ebd0f
test: add test for attribute_autocomplete
JYC333 Mar 9, 2026
2c9a0ed
test: add test for autocomplete_core
JYC333 Mar 10, 2026
b419602
test: add test for NoteAutocomplete
JYC333 Mar 10, 2026
5b77152
refactor: address gemini review
JYC333 Mar 10, 2026
f6201d8
fix: add link dialog enter act correctly
JYC333 Mar 10, 2026
1760979
refactor: remove plan file
JYC333 Mar 10, 2026
aa58ad2
fix: test file error
JYC333 Mar 10, 2026
915c49b
fix: address white space issue
JYC333 Mar 10, 2026
22507f7
chore: fix pnpm lock file
JYC333 Mar 11, 2026
f65ddb0
fix: pnpm lock conflict
JYC333 Mar 19, 2026
4f7cf74
Merge branch 'main' into autocomplete
JYC333 Mar 22, 2026
e6c5df3
refactor: remove redundant code
JYC333 Mar 22, 2026
d1cb56d
refactor: use Preact for rendering
JYC333 Mar 22, 2026
8828df7
refactor: fix input focus issue
JYC333 Mar 27, 2026
a8408fb
Merge branch 'main' into autocomplete
JYC333 Mar 27, 2026
69af1f6
refactor: use normal Preact lifecycle
JYC333 Mar 27, 2026
a820d1d
refactor: clean up heavy test case
JYC333 Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/client/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular"
},
"dependencies": {
"@algolia/autocomplete-js": "1.19.6",
"@excalidraw/excalidraw": "0.18.0",
"@fullcalendar/core": "6.1.20",
"@fullcalendar/daygrid": "6.1.20",
Expand Down Expand Up @@ -44,7 +45,6 @@
"@univerjs/preset-sheets-sort": "0.17.0",
"@univerjs/presets": "0.17.0",
"@zumer/snapdom": "2.5.0",
"autocomplete.js": "0.38.1",
"bootstrap": "5.3.8",
"boxicons": "2.1.4",
"clsx": "2.1.1",
Expand Down Expand Up @@ -92,4 +92,4 @@
"script-loader": "0.7.2",
"vite-plugin-static-copy": "3.3.0"
}
}
}
3 changes: 2 additions & 1 deletion apps/client/src/components/entrypoints.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { CreateChildrenResponse, SqlExecuteResponse } from "@triliumnext/commons";

import { closeAllHeadlessAutocompletes } from "../services/autocomplete_core.js";
import bundleService from "../services/bundle.js";
import dateNoteService from "../services/date_notes.js";
import froca from "../services/froca.js";
Expand Down Expand Up @@ -197,7 +198,7 @@ export default class Entrypoints extends Component {

hideAllPopups() {
if (utils.isDesktop()) {
$(".aa-input").autocomplete("close");
closeAllHeadlessAutocompletes();
}
}

Expand Down
22 changes: 10 additions & 12 deletions apps/client/src/components/tab_manager.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
import Component from "./component.js";
import SpacedUpdate from "../services/spaced_update.js";
import server from "../services/server.js";
import options from "../services/options.js";
import type FNote from "../entities/fnote.js";
import { closeAllHeadlessAutocompletes } from "../services/autocomplete_core.js";
import froca from "../services/froca.js";
import linkService from "../services/link.js";
import options from "../services/options.js";
import server from "../services/server.js";
import SpacedUpdate from "../services/spaced_update.js";
import treeService from "../services/tree.js";
import NoteContext from "./note_context.js";
import appContext from "./app_context.js";
import Mutex from "../utils/mutex.js";
import linkService from "../services/link.js";
import type { EventData } from "./app_context.js";
import type FNote from "../entities/fnote.js";
import appContext from "./app_context.js";
import Component from "./component.js";
import NoteContext from "./note_context.js";

interface TabState {
contexts: NoteContext[];
Expand Down Expand Up @@ -429,10 +430,7 @@ export default class TabManager extends Component {
}

// close dangling autocompletes after closing the tab
const $autocompleteEl = $(".aa-input");
if ("autocomplete" in $autocompleteEl) {
$autocompleteEl.autocomplete("close");
}
closeAllHeadlessAutocompletes();

// close dangling tooltips
$("body > div.tooltip").remove();
Expand Down
2 changes: 0 additions & 2 deletions apps/client/src/desktop.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import "autocomplete.js/index_jquery.js";

import type ElectronRemote from "@electron/remote";
import type Electron from "electron";

Expand Down
11 changes: 0 additions & 11 deletions apps/client/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,6 @@ async function initJQuery() {
const $ = (await import("jquery")).default;
window.$ = $;
window.jQuery = $;

// Polyfill removed jQuery methods for autocomplete.js compatibility
($ as any).isArray = Array.isArray;
($ as any).isFunction = function(obj: any) { return typeof obj === 'function'; };
($ as any).isPlainObject = function(obj: any) {
if (obj == null || typeof obj !== 'object') { return false; }
const proto = Object.getPrototypeOf(obj);
if (proto === null) { return true; }
const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor;
return typeof Ctor === 'function' && Ctor === Object;
};
}

async function setupGlob() {
Expand Down
2 changes: 0 additions & 2 deletions apps/client/src/mobile.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import "autocomplete.js/index_jquery.js";

import appContext from "./components/app_context.js";
import glob from "./services/glob.js";
import noteAutocompleteService from "./services/note_autocomplete.js";
Expand Down
11 changes: 0 additions & 11 deletions apps/client/src/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,6 @@ async function loadBootstrap() {
}
}

// Polyfill removed jQuery methods for autocomplete.js compatibility
($ as any).isArray = Array.isArray;
($ as any).isFunction = function(obj: any) { return typeof obj === 'function'; };
($ as any).isPlainObject = function(obj: any) {
if (obj == null || typeof obj !== 'object') { return false; }
const proto = Object.getPrototypeOf(obj);
if (proto === null) { return true; }
const Ctor = Object.prototype.hasOwnProperty.call(proto, 'constructor') && proto.constructor;
return typeof Ctor === 'function' && Ctor === Object;
};

(window as any).$ = $;
(window as any).jQuery = $;
await loadBootstrap();
Expand Down
47 changes: 47 additions & 0 deletions apps/client/src/services/attribute_autocomplete.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { describe, expect, it } from "vitest";

import { shouldAutocompleteHandleEnterKey } from "./attribute_autocomplete.js";

describe("attribute autocomplete enter handling", () => {
it("delegates plain Enter when the panel is open and an item is active", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "Enter", ctrlKey: false, metaKey: false },
{ isPanelOpen: true, hasActiveItem: true }
)).toBe(true);
});

it("does not delegate plain Enter when there is no active suggestion", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "Enter", ctrlKey: false, metaKey: false },
{ isPanelOpen: true, hasActiveItem: false }
)).toBe(false);
});

it("does not delegate plain Enter when the panel is closed", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "Enter", ctrlKey: false, metaKey: false },
{ isPanelOpen: false, hasActiveItem: false }
)).toBe(false);
});

it("does not delegate Ctrl+Enter even when an item is active", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "Enter", ctrlKey: true, metaKey: false },
{ isPanelOpen: true, hasActiveItem: true }
)).toBe(false);
});

it("does not delegate Cmd+Enter even when an item is active", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "Enter", ctrlKey: false, metaKey: true },
{ isPanelOpen: true, hasActiveItem: true }
)).toBe(false);
});

it("ignores non-Enter keys", () => {
expect(shouldAutocompleteHandleEnterKey(
{ key: "ArrowDown", ctrlKey: false, metaKey: false },
{ isPanelOpen: false, hasActiveItem: false }
)).toBe(true);
});
});
Loading
Loading