All files / blong-browser/src/widgets index.ts

100% Statements 98/98
100% Branches 6/6
80% Functions 4/5
100% Lines 98/98

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 991x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 32x 32x 32x 1x 1x  
/**
 * Widget registry — central map of widget type → React component.
 * Can be extended per suite using registry.register().
 */
import type {IWidgetProps, IWidgetRegistry, WidgetType} from '@feasibleone/blong';
import type React from 'react';
import {AutoCompleteWidget} from './AutoCompleteWidget.js';
import {BooleanWidget} from './BooleanWidget.js';
import {ChipsWidget} from './ChipsWidget.js';
import {ComponentWidget} from './ComponentWidget.js';
import {CurrencyWidget} from './CurrencyWidget.js';
import {DateRangeWidget} from './DateRangeWidget.js';
import {DateTimeWidget} from './DateTimeWidget.js';
import {DateWidget} from './DateWidget.js';
import {DropdownTreeWidget} from './DropdownTreeWidget.js';
import {DropdownWidget} from './DropdownWidget.js';
import {FileWidget} from './FileWidget.js';
import {ImageUploadWidget} from './ImageUploadWidget.js';
import {ImageWidget} from './ImageWidget.js';
import {IntegerWidget} from './IntegerWidget.js';
import {JsonWidget} from './JsonWidget.js';
import {MaskWidget} from './MaskWidget.js';
import {MultiSelectTreeTableWidget} from './MultiSelectTreeTableWidget.js';
import {MultiSelectTreeWidget} from './MultiSelectTreeWidget.js';
import {MultiSelectWidget} from './MultiSelectWidget.js';
import {NavigatorWidget} from './NavigatorWidget.js';
import {NumberWidget} from './NumberWidget.js';
import {PasswordWidget} from './PasswordWidget.js';
import {SelectTableWidget} from './SelectTableWidget.js';
import {SelectWidget} from './SelectWidget.js';
import {TableWidget} from './TableWidget.js';
import {TextWidget} from './TextWidget.js';
import {TextareaWidget} from './TextareaWidget.js';
import {TimeWidget} from './TimeWidget.js';
 
class WidgetRegistryImpl implements IWidgetRegistry {
    private map = new Map<string, React.ComponentType<IWidgetProps>>();
 
    register(type: string, component: React.ComponentType<IWidgetProps>): void {
        this.map.set(type, component);
    }
 
    get(type: string): React.ComponentType<IWidgetProps> | undefined {
        return this.map.get(type);
    }
 
    list(): string[] {
        return [...this.map.keys()];
    }
}
 
/** Global singleton widget registry */
export const widgetRegistry = new WidgetRegistryImpl();
 
const builtins: Array<[WidgetType, React.ComponentType<IWidgetProps>]> = [
    ['input', TextWidget as React.ComponentType<IWidgetProps>],
    ['text', TextareaWidget as React.ComponentType<IWidgetProps>],
    ['textArea', TextareaWidget as React.ComponentType<IWidgetProps>],
    ['number', NumberWidget as React.ComponentType<IWidgetProps>],
    ['currency', CurrencyWidget as React.ComponentType<IWidgetProps>],
    ['percent', NumberWidget as React.ComponentType<IWidgetProps>],
    ['integer', IntegerWidget as React.ComponentType<IWidgetProps>],
    ['boolean', BooleanWidget as React.ComponentType<IWidgetProps>],
    ['checkbox', BooleanWidget as React.ComponentType<IWidgetProps>],
    ['date', DateWidget as React.ComponentType<IWidgetProps>],
    ['time', TimeWidget as React.ComponentType<IWidgetProps>],
    ['dateTime', DateTimeWidget as React.ComponentType<IWidgetProps>],
    ['dateRange', DateRangeWidget as React.ComponentType<IWidgetProps>],
    ['password', PasswordWidget as React.ComponentType<IWidgetProps>],
    ['mask', MaskWidget as React.ComponentType<IWidgetProps>],
    ['chips', ChipsWidget as React.ComponentType<IWidgetProps>],
    ['autocomplete', AutoCompleteWidget as React.ComponentType<IWidgetProps>],
    ['dropdown', DropdownWidget as React.ComponentType<IWidgetProps>],
    ['dropdownTree', DropdownTreeWidget as React.ComponentType<IWidgetProps>],
    ['multiSelect', MultiSelectWidget as React.ComponentType<IWidgetProps>],
    ['multiSelectTree', MultiSelectTreeWidget as React.ComponentType<IWidgetProps>],
    ['multiSelectPanel', MultiSelectWidget as React.ComponentType<IWidgetProps>],
    ['multiSelectTreeTable', MultiSelectTreeTableWidget as React.ComponentType<IWidgetProps>],
    ['select', SelectWidget as React.ComponentType<IWidgetProps>],
    ['selectTable', SelectTableWidget as React.ComponentType<IWidgetProps>],
    ['table', TableWidget as React.ComponentType<IWidgetProps>],
    ['navigator', NavigatorWidget as React.ComponentType<IWidgetProps>],
    ['json', JsonWidget as React.ComponentType<IWidgetProps>],
    ['file', FileWidget as React.ComponentType<IWidgetProps>],
    ['image', ImageWidget as React.ComponentType<IWidgetProps>],
    ['imageUpload', ImageUploadWidget as React.ComponentType<IWidgetProps>],
    ['component', ComponentWidget as React.ComponentType<IWidgetProps>],
];
 
/** Register all built-in widgets synchronously */
export function registerBuiltinWidgets(): void {
    for (const [type, component] of builtins) {
        widgetRegistry.register(type, component);
    }
}
 
// Auto-register on module load so widgets are always available
registerBuiltinWidgets();