Features simplify writing code that is shared between your resources as they automatically handle merging of configuration.
A simple feature feature could be implemented as follows:
const feature = (prevResourceOptions) {
return {
...prevResourceOptions,
actions: {
...prevResourceOptions.actions,
edit: {
...(prevResourceOptions.actions && prevResourceOptions.actions.edit),
//..
}
//..
}
}
}
export { feature }
As you can see, in the example above you have to take care of merging previous options, which could be problematic. Fortunately AdminJS gives you helper functions which help with this:
- a factory function buildFeature,
- optional helper mergeResourceOptions (when you need more control)
This is how a feature could look like when buildFeature is used:
import { buildFeature, FeatureType } from 'adminjs';
import SomeModel from 'some-model.entity.js';
const someBeforeHook = () => { /* noop */ };
const myFeature = (config = {}): FeatureType => {
// do something with your feature config?
return buildFeature({
actions: {
edit: {
before: [someBeforeHook],
},
}
});
}
const SomeResource: ResourceWithOptions = {
resource: SomeModel,
features: [myFeature({})],
};
/* "someBeforeHook" will be used as a "before" hook in "edit" actions
for every resource where "myFeature" is added */