diff --git a/src/lib/eventHandler.ts b/src/lib/eventHandler.ts index 81ad419..de8f8ac 100644 --- a/src/lib/eventHandler.ts +++ b/src/lib/eventHandler.ts @@ -1,20 +1,22 @@ type callback = (event: any) => void; -type target = string | Element | HTMLElement +type target = string | Element | HTMLElement | Document | Window const eventHandler = { - add: function (eventType: string, target: target, selector: string | callback | Element, callback?: callback) { + add: function (eventType: string, target: target, selector: callback | target, callback?: callback) { if (typeof selector === 'function' && !callback) { callback = selector; selector = target; } - if (typeof target === 'object') { - + if (target instanceof Element) { target.addEventListener(eventType, function (e) { callback.call(target, e); }); return; } - let items = document.querySelectorAll(target); + let items: NodeList + if (typeof target === "string") { + items = document.querySelectorAll(target); + } if (!items) { return; } diff --git a/src/settings.js b/src/settings.js index 74bf450..0763c76 100644 --- a/src/settings.js +++ b/src/settings.js @@ -7,10 +7,13 @@ import settingsForm from './lib/settingsForm' import autoComplete from './lib/autoComplete'; import eventHandler from './lib/eventHandler'; import aria2Options from './utils/aria2Options'; -import { names as ytdOptions } from './utils/youtubedlOptions'; +import { options as ytdFullOptions,names as ytdOptions } from './utils/youtubedlOptions'; import helper from './utils/helper'; import './css/autoComplete.css' 'use strict'; +import { delegate } from 'tippy.js'; +import 'tippy.js/dist/tippy.css'; + window.addEventListener('DOMContentLoaded', function () { let customOptions = ['ncd_downloader_dir', 'ncd_torrents_dir', 'ncd_seed_ratio', 'ncd_seed_time', 'ncd_rpctoken', 'ncd_yt_binary', 'ncd_aria2_binary']; const saveHandler = (e, name) => { @@ -74,19 +77,27 @@ window.addEventListener('DOMContentLoaded', function () { autoComplete.getInstance({ selector: `[id^='${baseName}-key']`, minChars: 1, - source: function (term, suggest) { - term = term.toLowerCase(); - let suggestions = [], data = options; - for (const item of data) { - if (item.toLowerCase().indexOf(term, 0) !== -1) { - suggestions.push(item); - } + sourceHandler: function () { + if (Array.isArray(options)) { + return options; } - suggest(suggestions); + return Object.keys(options); + }, + renderer: (item, search) => { + search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + let tippy; + if (options.hasOwnProperty(item)) { + tippy = options[item]; + } else { + tippy = item; + } + var re = new RegExp(`(${search.split(' ').join('|')})`, "gi"); + return `