Skip to content

Instantly share code, notes, and snippets.

View N1XUS's full-sized avatar

N1XUS

  • Valor Software
View GitHub Profile
import {
AbstractDataSourceProvider,
DataSource,
DataSourceParser,
isDataSource,
} from '@host-directives-app/data-source';
import { Nullable } from '@host-directives-app/shared';
import { isObservable, Observable, of } from 'rxjs';
export interface ComboboxItem {
import { Nullable } from '@host-directives-app/shared';
import { Observable } from 'rxjs';
/**
* Acceptable data source types.
*/
export type DataSource<T = unknown> =
| AbstractDataSourceProvider<T>
| Observable<T[]>
| T[];
@Component({
selector: 'app-combobox',
template: `
<input
#comboboxInput
class="combobox-input"
type="text"
[attr.list]="'inputOptions' + uniqueId"
[attr.placeholder]="placeholder"
autocomplete="off"
export class ComboboxDataProvider extends AbstractDataProvider<AcceptableComboboxItem> {
constructor(private _values: Observable<AcceptableComboboxItem[]> | AcceptableComboboxItem[]) {
super();
}
fetch(): Observable<AcceptableComboboxItem[]> {
return isObservable(this._values) ? this._values : of(this._values);
}
}
/**
* Acceptable data source types.
*/
export type DataSource<T = unknown> =
| AbstractDataSourceProvider<T>
| Observable<T[]>
| T[];
export interface DataSourceParser<
T = unknown,
export const DATA_SOURCE_TRANSFORMER = new InjectionToken<DataSourceParser>('DataSourceTransformerClass');
@Directive({
selector: '[appDataSource]',
standalone: true,
providers: [
// Small helper service to unsubscribe from streams when component destroys.
DestroyedService
],
})
export type ProviderParams = ReadonlyMap<string, unknown>;
export abstract class AbstractDataProvider<T> {
/**
* Method responsible for retrieving the data.
* @param params Set of parameters used for search query.
* @param start Start index of the items array.
* @param end End index of the items array.
*/
abstract fetch(params?: ProviderParams, start?: number, end?: number): Observable<T[]>
export abstract class AbstractDataProvider<T> {
abstract fetch(params?: ProviderParams, start?: number, end?: number): Observable<T[]>
}
export class AbstractDataSourceProvider<T = unknown> {
/** @hidden */
protected readonly _dataChanges$: BehaviorSubject<T[]> = new BehaviorSubject<
T[]
>([]);
/** @hidden */
@Component({
selector: 'app-combobox',
template: `
<input
#comboboxInput
class="combobox-input"
type="text"
[attr.list]="'inputOptions' + uniqueId"
[attr.placeholder]="placeholder"
autocomplete="off"
@Directive({
selector: '[appCva]',
standalone: true,
providers: [
// Small helper service to unsubscribe from streams when component destroys.
DestroyedService
],
})
export class CvaDirective<T = unknown> implements ControlValueAccessor, OnDestroy, AfterViewInit, DoCheck {
/**