@launchmenu/core
Version:
An environment for visual keyboard controlled applets
148 lines • 11.8 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SearchMenu = void 0;
const react_1 = __importDefault(require("react"));
const model_react_1 = require("model-react");
const MenuView_1 = require("../../components/menu/MenuView");
const InstantOpenTransition_1 = require("../../components/context/stacks/transitions/open/InstantOpenTransition");
const InstantCloseTransition_1 = require("../../components/context/stacks/transitions/close/InstantCloseTransition");
const searchAction_1 = require("../../actions/types/search/searchAction");
const SearchExecuter_1 = require("../../utils/searchExecuter/SearchExecuter");
const baseSettings_1 = require("../../application/settings/baseSettings/baseSettings");
const PrioritizedMenu_1 = require("./PrioritizedMenu");
/**
* A menu that can be used to perform a search on a collection of items
*/
class SearchMenu extends PrioritizedMenu_1.PrioritizedMenu {
/**
* Creates a new search menu
* @param context The context to be used by menu items
* @param config The config of the category and other options
*/
constructor(context, config) {
super(context, {
...config,
maxItemCount: context.settings.get(baseSettings_1.baseSettings).menu.maxSearchMenuSize.get(),
// Forward the loading state from the search executer
isLoading: {
get: hook => {
var _a, _b;
const isSearching = this.executer.isSearching(hook);
const isLoading = (_b = (_a = config === null || config === void 0 ? void 0 : config.isLoading) === null || _a === void 0 ? void 0 : _a.get(hook)) !== null && _b !== void 0 ? _b : false;
return isSearching || isLoading;
},
},
});
this.searchItems = new model_react_1.Field([]);
this.executer = new SearchExecuter_1.SearchExecuter({
searchable: {
ID: "root",
search: async (query, hook, ...rest) => { var _a, _b; return (_b = (_a = this.search) === null || _a === void 0 ? void 0 : _a.call(this, query, hook, ...rest)) !== null && _b !== void 0 ? _b : {
children: searchAction_1.searchAction.get(this.searchItems.get(hook)),
}; },
},
onAdd: (item) => this.addItem(item),
onRemove: (item) => this.removeItem(item),
});
/**
* A default view for a search menu, with instant open and close transitions
*/
this.view = {
view: react_1.default.createElement(MenuView_1.MenuView, { menu: this }),
transitions: {
Open: InstantOpenTransition_1.InstantOpenTransition,
Close: InstantCloseTransition_1.InstantCloseTransition,
},
};
this.showAllOnEmptySearch = config === null || config === void 0 ? void 0 : config.showAllOnEmptySearch;
this.search = config === null || config === void 0 ? void 0 : config.search;
}
// Search management
/**
* Sets the search query
* @param search The text to search with
* @returns A promise that resolves once the new search has finished
*/
async setSearch(search) {
var _a;
// Update the default items (for empty searches)
const oldQuery = this.executer.getQuery();
if (this.showAllOnEmptySearch && ((_a = oldQuery === null || oldQuery === void 0 ? void 0 : oldQuery.search) !== null && _a !== void 0 ? _a : "") != search) {
const prioritizedItems = this.searchItems
.get()
.map(item => ({ priority: 1, item }));
if (search == "")
this.addItems(prioritizedItems);
else
this.removeItems(prioritizedItems);
}
// Perform the search
const query = { search, context: this.context };
// Make a snappy first result
setTimeout(() => this.flushBatch(), 1);
return this.executer.setQuery(query);
}
/**
* Sets the items to be searched in
* @param items The items
*/
setSearchItems(items) {
var _a, _b;
if (this.showAllOnEmptySearch && ((_b = (_a = this.executer.getQuery()) === null || _a === void 0 ? void 0 : _a.search) !== null && _b !== void 0 ? _b : "") == "") {
this.removeItems(this.searchItems.get().map(item => ({ item, priority: 1 })));
this.addItems(items.map(item => ({ item, priority: 1 })));
}
this.searchItems.set(items);
}
/**
* Adds an item to be searched in
* @param item The item to add
*/
addSearchItem(item) {
var _a, _b;
this.searchItems.set([...this.searchItems.get(), item]);
if (this.showAllOnEmptySearch && ((_b = (_a = this.executer.getQuery()) === null || _a === void 0 ? void 0 : _a.search) !== null && _b !== void 0 ? _b : "") == "")
this.addItem({ item, priority: 1 });
}
/**
* Removes an item and its search results
* @param item The item to remove
*/
removeSearchItem(item) {
var _a, _b;
this.searchItems.set(this.searchItems.get().filter(i => i != item));
if (this.showAllOnEmptySearch && ((_b = (_a = this.executer.getQuery()) === null || _a === void 0 ? void 0 : _a.search) !== null && _b !== void 0 ? _b : "") == "")
this.removeItem({ item, priority: 1 });
}
// Data retrieval
/**
* Retrieves the search text
* @param hook The hook to subscribe to changes
* @returns The search text
*/
getSearch(hook) {
var _a;
return ((_a = this.executer.getQuery(hook)) === null || _a === void 0 ? void 0 : _a.search) || null;
}
/**
* Retrieves the highlight data to use for highlighting within menu items
* @param hook The hook to subscribe to changes
* @returns The highlight data
*/
getHighlight(hook) {
return this.executer.getQuery(hook) || null;
}
/**
* Retrieves the pattern matches from searches
* @param hook The hook to subscribe to changes
* @returns The patterns in searches
*/
getPatternMatches(hook) {
return this.executer.getPatterns(hook);
}
}
exports.SearchMenu = SearchMenu;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoTWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW51cy9tZW51L1NlYXJjaE1lbnUudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtEQUEwQjtBQUUxQiw2Q0FBNkM7QUFHN0MsNkRBQXdEO0FBRXhELGtIQUE2RztBQUM3RyxxSEFBZ0g7QUFFaEgsMEVBQXFFO0FBQ3JFLDhFQUF5RTtBQUN6RSx1RkFBa0Y7QUFDbEYsdURBQWtEO0FBS2xEOztHQUVHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsaUNBQWU7SUFnQjNDOzs7O09BSUc7SUFDSCxZQUNJLE9BQW1CLEVBQ25CLE1BS0M7UUFFRCxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ1gsR0FBRyxNQUFNO1lBQ1QsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLDJCQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO1lBQzdFLHFEQUFxRDtZQUNyRCxTQUFTLEVBQUU7Z0JBQ1AsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFOztvQkFDUixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDcEQsTUFBTSxTQUFTLGVBQUcsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLFNBQVMsMENBQUUsR0FBRyxDQUFDLElBQUksb0NBQUssS0FBSyxDQUFDO29CQUN4RCxPQUFPLFdBQVcsSUFBSSxTQUFTLENBQUM7Z0JBQ3BDLENBQUM7YUFDSjtTQUNKLENBQUMsQ0FBQztRQXhDRyxnQkFBVyxHQUFHLElBQUksbUJBQUssQ0FBQyxFQUFpQixDQUFDLENBQUM7UUFHM0MsYUFBUSxHQUFHLElBQUksK0JBQWMsQ0FBQztZQUNwQyxVQUFVLEVBQUU7Z0JBQ1IsRUFBRSxFQUFFLE1BQU07Z0JBQ1YsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFhLEVB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