Control Option
The ControlOption
is the core Value Object of the project. It holds the information about the entities, and it is carried around the business logic and the presentational layer.
The Control Option mainly contain the following properties:
label
(String): The label of the control option.value
(mixed): The value of the control option.
An additional data structure is part of the EnrichedControlOption
interface implemented by ControlOption
. This DS is not consumed within any of the Base or Composite components of the project, it is there to permit the third parties to customize the UI.
The extra
property is of type Kensaku.Record
; it can hold a heterogeneous set of properties, we do not check against values or types, this is up to the consumer.
About the Value
The value
is a generic type to give the possibility to customize the shape of the value since we allow the consumer to implement they own components, and therefore we do not want to pose any restriction.
Nonetheless, the possible types the value
can assume within the project Components is string | number
; see Kensaku.Value
type for more info.
How to use the Extra Property
Let’s say you’re using the CompositeEntitiesByKind
component, and you want to render along with the Title of the entity the type
and the excerpt
.
In the example below we’re using the extra
property to carry the type
and the excerpt
of the entity.
The convertEntitiesToContrlOptions
will create the ControlOption
with the extra
property containing the post type and the post excerpt.
searchEntities: async (
phrase,
postType,
queryArguments
) => {
const postsEntities = await searchEntities(
'post',
postType,
phrase,
{...queryArguments, fields: ['title', 'id', 'type', 'excerpt']}
);
return convertEntitiesToControlOptions(
postsEntities,
'title',
'id',
// Extra properties
'type',
'excerpt'
);
}
Then you can access the extra properties within your component since the CompositeEntitiesByKind
will pass the entities
of type Kensaku.BaseControl< E >
to the children.
(entities: Kensaku.BaseControl< E >) => {
return <MyComponent {...entities} />;
}
And internally of your MyComponent
you can access the extra
property of the ControlOption
:
function MyComponent(entities: Options<V>): JSX.Element {
return (
<div>
{entities.options.map((option) => (
<label>
<input value={option.value} />
<span>{option.label}</span>
<span>
<span>{option.extra.get('type')}</span>
<span>{option.extra.get('excerpt')}</span>
</span>
</label>
))}
</div>
);
}