Skip to content

Commit 386834c

Browse files
alejandromumokpsherva
authored andcommitted
widget: extended loader to load from multiple sources.
1 parent 75528b3 commit 386834c

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

src/lib/forms/widgets/custom_fields/CustomFields.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ export class CustomFields extends Component {
3131
}
3232

3333
async loadCustomFieldsWidgets() {
34-
const { config, fieldPathPrefix, templateLoader } = this.props;
34+
const { config, fieldPathPrefix, templateLoaders } = this.props;
3535

3636
const sections = [];
3737
for (const sectionCfg of config) {
3838
// Path to end user's folder defining custom fields ui widgets
3939
const fields = await loadWidgetsFromConfig({
40-
templateLoader: templateLoader,
40+
templateLoaders: templateLoaders,
4141
fieldPathPrefix: fieldPathPrefix,
4242
fields: sectionCfg.fields,
4343
});
@@ -73,7 +73,7 @@ CustomFields.propTypes = {
7373
),
7474
})
7575
).isRequired,
76-
templateLoader: PropTypes.func.isRequired,
76+
templateLoaders: PropTypes.array.isRequired,
7777
fieldPathPrefix: PropTypes.string.isRequired,
7878
includesPaths: PropTypes.func,
7979
};

src/lib/forms/widgets/loader.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,37 @@ import React from "react";
88
* dynamic import cannot rely on purely a dynamic path i.e a variable.
99
*/
1010
export async function importWidget(
11-
templateLoader,
11+
templateLoaders,
1212
{ ui_widget: UIWidget, fieldPath, props }
1313
) {
14-
let component = null;
15-
try {
16-
// First try import widget from user's defined templateLoader
17-
const module = await templateLoader(UIWidget);
18-
component = module.default ?? module[UIWidget];
19-
} catch (error) {
14+
let component = undefined;
15+
16+
// Try import widget from user's defined templateLoaders
17+
for (const loader of templateLoaders) {
2018
try {
21-
// If not then look into widgets folder for the component
22-
const module = await import("./index");
19+
const module = await loader(UIWidget);
2320
component = module.default ?? module[UIWidget];
21+
// Component was found, stop looking.
22+
if (component) {
23+
break;
24+
}
2425
} catch (error) {
25-
console.error(`Failed to import default component ${UIWidget}.js`);
26+
// If the component failed to load from a loader, try other loaders first.
27+
continue;
2628
}
2729
}
28-
if (component) {
29-
return React.createElement(component, {
30-
...props,
31-
key: fieldPath,
32-
fieldPath: fieldPath,
33-
});
30+
31+
// Loading failed, log it and throw an error.
32+
if (component === undefined) {
33+
console.error(`Failed to import default component ${UIWidget}.js`);
34+
throw Error("Component not found in any loader");
3435
}
36+
37+
return React.createElement(component, {
38+
...props,
39+
key: fieldPath,
40+
fieldPath: fieldPath,
41+
});
3542
}
3643

3744
/**
@@ -62,7 +69,7 @@ export async function importWidget(
6269
*
6370
*/
6471
export async function loadWidgetsFromConfig({
65-
templateLoader,
72+
templateLoaders,
6673
fieldPathPrefix,
6774
fields,
6875
}) {
@@ -81,7 +88,7 @@ export async function loadWidgetsFromConfig({
8188
return Promise.all(tplPromises);
8289
};
8390
const _fields = await importWidgetsFromFolder(
84-
templateLoader,
91+
templateLoaders,
8592
fieldPathPrefix,
8693
fields
8794
);

0 commit comments

Comments
 (0)