import * as React from "bloatless-react"; import { StringEntryObject, collectObjectValuesForKey, localeCompare, } from "../../Model/Utility/utility"; export function PropertyValueList( propertyKey: string, stringEntryObjectConverter: (object: T) => StringEntryObject, objects: React.ListState | React.MapState, viewBuilder: ( keys: React.ListState, sortedKeys: React.State ) => HTMLElement ) { const propertyValues: React.ListState = new React.ListState(); const sortedPropertyValues: React.State = createSortedPropertyValueState(propertyValues) objects.subscribe(() => { collectPropertyValuesToState( propertyKey, stringEntryObjectConverter, objects, propertyValues ); }); return viewBuilder(propertyValues, sortedPropertyValues); } export function collectPropertyValuesToState( propertyKey: string, stringEntryObjectConverter: (object: T) => StringEntryObject, objects: React.ListState | React.MapState, propertyValues: React.ListState ) { const values: string[] = collectObjectValuesForKey( propertyKey, stringEntryObjectConverter, [...objects.value.values()] ); for (const existingValue of values) { if (propertyValues.value.has(existingValue)) continue; propertyValues.add(existingValue); } for (const displayedValue of propertyValues.value.values()) { if (values.includes(displayedValue) == false) { propertyValues.remove(displayedValue); } } } export function createSortedPropertyValueState( propertyValues: React.ListState ): React.State { return React.createProxyState([propertyValues], () => [...propertyValues.value.values()].sort(localeCompare) ); } export function createPropertyValueIndexState( sortedKeys: React.State, key: string ): React.State { return React.createProxyState([sortedKeys], () => sortedKeys.value.indexOf(key) ); }