diff --git a/.gitignore b/.gitignore index e9369c56..069ea2de 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea .vscode +.cache node_modules dev/dist diff --git a/bridge/src/ajax.ts b/bridge/src/ajax.ts index 8797fb98..c870cfb4 100644 --- a/bridge/src/ajax.ts +++ b/bridge/src/ajax.ts @@ -1,5 +1,6 @@ -import { QueryFunction, QueryResult } from '../../control/src/search-controller'; +import { QueryFunction, QueryResult } from '../../control/src/abstract-select'; import { extend } from '../../control/src/util'; + export interface Ajax { url: string; params: (term: string, page: number) => object; diff --git a/bridge/src/data.ts b/bridge/src/data.ts new file mode 100644 index 00000000..0dc2fbfa --- /dev/null +++ b/bridge/src/data.ts @@ -0,0 +1,23 @@ +import { QueryFunction, QueryResult } from '../../control/src/abstract-select'; + +export interface DataParam { + term: string; + page: number; + selected: any[]; +} + +export interface DataResult { + values: any[]; + more: boolean; +} + +export type DataFunction = (param: DataParam) => QueryResult; + +export function createQueryFromData(callback: DataFunction): QueryFunction { + return (term: string, page: number, token: string) => { + return new Promise((resolve, reject) => { + const data = callback({ term, page, selected: [] }); + resolve({ values: data.values, more: data.more, token }); + }); + }; +} diff --git a/bridge/src/select25.tsx b/bridge/src/select25.tsx index c36b1125..39aefc20 100644 --- a/bridge/src/select25.tsx +++ b/bridge/src/select25.tsx @@ -7,6 +7,7 @@ import '../../control/src/select25.scss'; import { SingleSelect } from '../../control/src/single-select'; import { extend } from '../../control/src/util'; import { Ajax, createQueryFromAjax } from './ajax'; +import { DataFunction, createQueryFromData } from './data'; import { Store } from './store'; const forceImportOfH = h; @@ -26,6 +27,7 @@ export interface Options { valueContent?: ItemRenderer; resultContent?: ItemRenderer; query?: QueryFunction; + data?: DataFunction; ajax?: Ajax; quiet?: number; minimumCharacters?: number; @@ -74,6 +76,8 @@ const DEFAULT_OPTIONS = { return ''; } }, + itemId: 'id', + itemLabel: 'text', minimumCharacters: 0, multiple: false, openOnFocus: false @@ -208,8 +212,12 @@ function create(element: HTMLInputElement, options: Options) { const store = Store.getStore(element); options = extend({}, DEFAULT_OPTIONS, options); - if (!options.query && options.ajax) { - options.query = createQueryFromAjax(options.ajax); + if (!options.query) { + if (options.ajax) { + options.query = createQueryFromAjax(options.ajax); + } else if (options.data) { + options.query = createQueryFromData(options.data); + } } if (!options.tabIndex && element.tabIndex) { diff --git a/control/src/abstract-select.tsx b/control/src/abstract-select.tsx index cc2ef1ae..88ec9acb 100644 --- a/control/src/abstract-select.tsx +++ b/control/src/abstract-select.tsx @@ -57,6 +57,8 @@ function MarkupRenderer({ markup }) { export const DEFAULT_PROPS: Partial = { allowDuplicates: false, + itemId: 'id', + itemLabel: 'text', minimumCharacters: 0, quiet: 50, tabIndex: 0 diff --git a/control/src/multi-select.tsx b/control/src/multi-select.tsx index 6009525a..5dc54c2d 100644 --- a/control/src/multi-select.tsx +++ b/control/src/multi-select.tsx @@ -30,7 +30,7 @@ interface State extends AbstractSelectState { values: ValueListState; } -const DEFAULT_PROPS = extend({}, ABSTRACT_DEFAULT_PROPS, {}); +const DEFAULT_PROPS = extend({}, ABSTRACT_DEFAULT_PROPS, { values: [] }); export class MultiSelect extends AbstractSelect { private containerRef: RefObject; diff --git a/dev/index.html b/dev/index.html index d906764b..b25f1232 100644 --- a/dev/index.html +++ b/dev/index.html @@ -32,6 +32,10 @@

+
+ +
+