adminforth 1.1.106 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dataConnectors/baseConnector.ts +1 -0
- package/dist/dataConnectors/baseConnector.js +1 -0
- package/dist/index.js +11 -4
- package/dist/modules/codeInjector.js +2 -1
- package/dist/spa/spa/src/components/ValueRenderer.vue +0 -1
- package/dist/spa/spa/src/utils.ts +1 -1
- package/dist/spa/spa/src/views/ShowView.vue +7 -3
- package/index.ts +21 -11
- package/modules/codeInjector.ts +2 -1
- package/package.json +1 -1
- package/spa/src/components/ValueRenderer.vue +0 -1
- package/spa/src/utils.ts +1 -1
- package/spa/src/views/ShowView.vue +7 -3
- package/types/AdminForthConfig.ts +4 -2
|
@@ -50,6 +50,7 @@ export default class AdminForthBaseConnector implements IAdminForthDataSourceCon
|
|
|
50
50
|
for (const col of resource.dataSourceColumns) {
|
|
51
51
|
newRecord[col.name] = this.setFieldValue(col, record[col.name]);
|
|
52
52
|
}
|
|
53
|
+
process.env.HEAVY_DEBUG && console.log('🪲🪲🪲🪲 creating record', newRecord);
|
|
53
54
|
return this.createRecordOriginalValues({ resource, record: newRecord });
|
|
54
55
|
}
|
|
55
56
|
|
|
@@ -43,6 +43,7 @@ export default class AdminForthBaseConnector {
|
|
|
43
43
|
for (const col of resource.dataSourceColumns) {
|
|
44
44
|
newRecord[col.name] = this.setFieldValue(col, record[col.name]);
|
|
45
45
|
}
|
|
46
|
+
process.env.HEAVY_DEBUG && console.log('🪲🪲🪲🪲 creating record', newRecord);
|
|
46
47
|
return this.createRecordOriginalValues({ resource, record: newRecord });
|
|
47
48
|
}
|
|
48
49
|
updateRecord({ resource, recordId, newValues }) {
|
package/dist/index.js
CHANGED
|
@@ -101,7 +101,7 @@ class AdminForth {
|
|
|
101
101
|
catch (e) {
|
|
102
102
|
this.config.customization.customComponentsDir = undefined;
|
|
103
103
|
}
|
|
104
|
-
if (
|
|
104
|
+
if (this.config.auth) {
|
|
105
105
|
if (!this.config.auth.resourceId) {
|
|
106
106
|
throw new Error('No config.auth.resourceId defined');
|
|
107
107
|
}
|
|
@@ -520,7 +520,9 @@ class AdminForth {
|
|
|
520
520
|
});
|
|
521
521
|
}
|
|
522
522
|
}
|
|
523
|
-
if (((_c = column.required) === null || _c === void 0 ? void 0 : _c.create) &&
|
|
523
|
+
if (((_c = column.required) === null || _c === void 0 ? void 0 : _c.create) &&
|
|
524
|
+
record[column.name] === undefined &&
|
|
525
|
+
column.showIn.includes(AdminForthResourcePages.create)) {
|
|
524
526
|
return { error: `Column '${column.name}' is required` };
|
|
525
527
|
}
|
|
526
528
|
if (column.isUnique) {
|
|
@@ -553,6 +555,7 @@ class AdminForth {
|
|
|
553
555
|
}
|
|
554
556
|
}
|
|
555
557
|
const connector = this.connectors[resource.dataSource];
|
|
558
|
+
process.env.HEAVY_DEBUG && console.log('🪲🪲🪲🪲 creating record createResourceRecord', record);
|
|
556
559
|
yield connector.createRecord({ resource, record });
|
|
557
560
|
// execute hook if needed
|
|
558
561
|
for (const hook of listify((_g = (_f = resource.hooks) === null || _f === void 0 ? void 0 : _f.create) === null || _g === void 0 ? void 0 : _g.afterSave)) {
|
|
@@ -565,6 +568,7 @@ class AdminForth {
|
|
|
565
568
|
return { error: resp.error };
|
|
566
569
|
}
|
|
567
570
|
}
|
|
571
|
+
return { ok: true };
|
|
568
572
|
});
|
|
569
573
|
}
|
|
570
574
|
setupEndpoints(server) {
|
|
@@ -1024,10 +1028,13 @@ class AdminForth {
|
|
|
1024
1028
|
return { error };
|
|
1025
1029
|
}
|
|
1026
1030
|
const { record } = body;
|
|
1027
|
-
yield this.createResourceRecord({ resource, record, adminUser });
|
|
1031
|
+
const response = yield this.createResourceRecord({ resource, record, adminUser });
|
|
1032
|
+
if (response.error) {
|
|
1033
|
+
return { error: response.error };
|
|
1034
|
+
}
|
|
1028
1035
|
const connector = this.connectors[resource.dataSource];
|
|
1029
1036
|
return {
|
|
1030
|
-
newRecordId:
|
|
1037
|
+
newRecordId: record[connector.getPrimaryKey(resource)]
|
|
1031
1038
|
};
|
|
1032
1039
|
})
|
|
1033
1040
|
});
|
|
@@ -227,6 +227,7 @@ class CodeInjector {
|
|
|
227
227
|
}
|
|
228
228
|
yield fsExtra.copy(src, to, {
|
|
229
229
|
recursive: true,
|
|
230
|
+
dereference: true,
|
|
230
231
|
});
|
|
231
232
|
}
|
|
232
233
|
}
|
|
@@ -405,7 +406,7 @@ class CodeInjector {
|
|
|
405
406
|
let customPackgeNames = [];
|
|
406
407
|
if (usersPackage && usersLock) {
|
|
407
408
|
customPackgeNames = [
|
|
408
|
-
...Object.keys(usersPackage.dependencies),
|
|
409
|
+
...Object.keys(usersPackage.dependencies || []),
|
|
409
410
|
...Object.keys(usersPackage.devDependencies || [])
|
|
410
411
|
].reduce((acc, packageName) => {
|
|
411
412
|
const version = usersLock.packages[`node_modules/${packageName}`].version;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
|
|
4
3
|
<span @click="(e)=>{e.stopPropagation()}" v-if="column.foreignResource">
|
|
5
4
|
<RouterLink v-if="record[column.name]" class="font-medium text-blue-600 dark:text-blue-500 hover:brightness-110"
|
|
6
5
|
:to="{ name: 'resource-show', params: { resourceId: column.foreignResource.resourceId, primaryKey: record[column.name].pk } }">
|
|
@@ -74,7 +74,7 @@ export const loadFile = (file: string) => {
|
|
|
74
74
|
return baseUrl;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export function checkEmptyValues(value: any, viewType:'show' | 'list' ) {
|
|
77
|
+
export function checkEmptyValues(value: any, viewType: 'show' | 'list' ) {
|
|
78
78
|
const config: CoreConfig | {} = useCoreStore().config;
|
|
79
79
|
let emptyFieldPlaceholder = '';
|
|
80
80
|
if (config.emptyFieldPlaceholder) {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
<span class="sr-only">Loading...</span>
|
|
44
44
|
</div>
|
|
45
45
|
<div
|
|
46
|
-
v-else
|
|
46
|
+
v-else-if="coreStore.record"
|
|
47
47
|
class="relative overflow-x-auto shadow-resourseFormShadow "
|
|
48
48
|
>
|
|
49
49
|
<table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 rounded-default">
|
|
@@ -90,7 +90,12 @@
|
|
|
90
90
|
</template>
|
|
91
91
|
</tr>
|
|
92
92
|
</tbody>
|
|
93
|
-
|
|
93
|
+
</table>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div v-else class="text-center text-gray-500 dark:text-gray-400 mt-10">
|
|
97
|
+
Ooops. Record not found
|
|
98
|
+
</div>
|
|
94
99
|
|
|
95
100
|
<component
|
|
96
101
|
v-for="c in coreStore?.resourceOptions?.pageInjections?.show?.bottom || []"
|
|
@@ -101,7 +106,6 @@
|
|
|
101
106
|
:resource="coreStore.resource"
|
|
102
107
|
:adminUser="coreStore.adminUser"
|
|
103
108
|
/>
|
|
104
|
-
</div>
|
|
105
109
|
|
|
106
110
|
|
|
107
111
|
</div>
|
package/index.ts
CHANGED
|
@@ -138,7 +138,7 @@ class AdminForth implements IAdminForth {
|
|
|
138
138
|
this.config.customization.customComponentsDir = undefined;
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
-
if (
|
|
141
|
+
if (this.config.auth) {
|
|
142
142
|
if (!this.config.auth.resourceId) {
|
|
143
143
|
throw new Error('No config.auth.resourceId defined');
|
|
144
144
|
}
|
|
@@ -605,7 +605,11 @@ class AdminForth implements IAdminForth {
|
|
|
605
605
|
});
|
|
606
606
|
}
|
|
607
607
|
}
|
|
608
|
-
if (
|
|
608
|
+
if (
|
|
609
|
+
(column.required as {create?: boolean, edit?: boolean}) ?.create &&
|
|
610
|
+
record[column.name] === undefined &&
|
|
611
|
+
column.showIn.includes(AdminForthResourcePages.create)
|
|
612
|
+
) {
|
|
609
613
|
return { error: `Column '${column.name}' is required` };
|
|
610
614
|
}
|
|
611
615
|
|
|
@@ -625,15 +629,15 @@ class AdminForth implements IAdminForth {
|
|
|
625
629
|
|
|
626
630
|
// execute hook if needed
|
|
627
631
|
for (const hook of listify(resource.hooks?.create?.beforeSave as BeforeSaveFunction[])) {
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
+
const resp = await hook({ resource, record, adminUser });
|
|
633
|
+
if (!resp || (!resp.ok && !resp.error)) {
|
|
634
|
+
throw new Error(`Hook beforeSave must return object with {ok: true} or { error: 'Error' } `);
|
|
635
|
+
}
|
|
632
636
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
}
|
|
637
|
+
if (resp.error) {
|
|
638
|
+
return { error: resp.error };
|
|
636
639
|
}
|
|
640
|
+
}
|
|
637
641
|
|
|
638
642
|
// remove virtual columns from record
|
|
639
643
|
for (const column of resource.columns.filter((col) => col.virtual)) {
|
|
@@ -642,6 +646,7 @@ class AdminForth implements IAdminForth {
|
|
|
642
646
|
}
|
|
643
647
|
}
|
|
644
648
|
const connector = this.connectors[resource.dataSource];
|
|
649
|
+
process.env.HEAVY_DEBUG && console.log('🪲🪲🪲🪲 creating record createResourceRecord', record);
|
|
645
650
|
await connector.createRecord({ resource, record });
|
|
646
651
|
// execute hook if needed
|
|
647
652
|
for (const hook of listify(resource.hooks?.create?.afterSave as AfterSaveFunction[])) {
|
|
@@ -655,6 +660,8 @@ class AdminForth implements IAdminForth {
|
|
|
655
660
|
return { error: resp.error };
|
|
656
661
|
}
|
|
657
662
|
}
|
|
663
|
+
|
|
664
|
+
return { ok: true };
|
|
658
665
|
}
|
|
659
666
|
|
|
660
667
|
setupEndpoints(server: IHttpServer) {
|
|
@@ -1168,11 +1175,14 @@ class AdminForth implements IAdminForth {
|
|
|
1168
1175
|
|
|
1169
1176
|
const { record } = body;
|
|
1170
1177
|
|
|
1171
|
-
await this.createResourceRecord({ resource, record, adminUser });
|
|
1178
|
+
const response = await this.createResourceRecord({ resource, record, adminUser });
|
|
1179
|
+
if (response.error) {
|
|
1180
|
+
return { error: response.error };
|
|
1181
|
+
}
|
|
1172
1182
|
const connector = this.connectors[resource.dataSource];
|
|
1173
1183
|
|
|
1174
1184
|
return {
|
|
1175
|
-
newRecordId:
|
|
1185
|
+
newRecordId: record[connector.getPrimaryKey(resource)]
|
|
1176
1186
|
}
|
|
1177
1187
|
}
|
|
1178
1188
|
});
|
package/modules/codeInjector.ts
CHANGED
|
@@ -248,6 +248,7 @@ class CodeInjector implements ICodeInjector {
|
|
|
248
248
|
|
|
249
249
|
await fsExtra.copy(src, to, {
|
|
250
250
|
recursive: true,
|
|
251
|
+
dereference: true,
|
|
251
252
|
});
|
|
252
253
|
}
|
|
253
254
|
}
|
|
@@ -459,7 +460,7 @@ class CodeInjector implements ICodeInjector {
|
|
|
459
460
|
let customPackgeNames = [];
|
|
460
461
|
if (usersPackage && usersLock) {
|
|
461
462
|
customPackgeNames = [
|
|
462
|
-
...Object.keys(usersPackage.dependencies),
|
|
463
|
+
...Object.keys(usersPackage.dependencies || []),
|
|
463
464
|
...Object.keys(usersPackage.devDependencies || [])
|
|
464
465
|
].reduce(
|
|
465
466
|
(acc, packageName) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div>
|
|
3
|
-
|
|
4
3
|
<span @click="(e)=>{e.stopPropagation()}" v-if="column.foreignResource">
|
|
5
4
|
<RouterLink v-if="record[column.name]" class="font-medium text-blue-600 dark:text-blue-500 hover:brightness-110"
|
|
6
5
|
:to="{ name: 'resource-show', params: { resourceId: column.foreignResource.resourceId, primaryKey: record[column.name].pk } }">
|
package/spa/src/utils.ts
CHANGED
|
@@ -74,7 +74,7 @@ export const loadFile = (file: string) => {
|
|
|
74
74
|
return baseUrl;
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export function checkEmptyValues(value: any, viewType:'show' | 'list' ) {
|
|
77
|
+
export function checkEmptyValues(value: any, viewType: 'show' | 'list' ) {
|
|
78
78
|
const config: CoreConfig | {} = useCoreStore().config;
|
|
79
79
|
let emptyFieldPlaceholder = '';
|
|
80
80
|
if (config.emptyFieldPlaceholder) {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
<span class="sr-only">Loading...</span>
|
|
44
44
|
</div>
|
|
45
45
|
<div
|
|
46
|
-
v-else
|
|
46
|
+
v-else-if="coreStore.record"
|
|
47
47
|
class="relative overflow-x-auto shadow-resourseFormShadow "
|
|
48
48
|
>
|
|
49
49
|
<table class="w-full text-sm text-left rtl:text-right text-gray-500 dark:text-gray-400 rounded-default">
|
|
@@ -90,7 +90,12 @@
|
|
|
90
90
|
</template>
|
|
91
91
|
</tr>
|
|
92
92
|
</tbody>
|
|
93
|
-
|
|
93
|
+
</table>
|
|
94
|
+
</div>
|
|
95
|
+
|
|
96
|
+
<div v-else class="text-center text-gray-500 dark:text-gray-400 mt-10">
|
|
97
|
+
Ooops. Record not found
|
|
98
|
+
</div>
|
|
94
99
|
|
|
95
100
|
<component
|
|
96
101
|
v-for="c in coreStore?.resourceOptions?.pageInjections?.show?.bottom || []"
|
|
@@ -101,7 +106,6 @@
|
|
|
101
106
|
:resource="coreStore.resource"
|
|
102
107
|
:adminUser="coreStore.adminUser"
|
|
103
108
|
/>
|
|
104
|
-
</div>
|
|
105
109
|
|
|
106
110
|
|
|
107
111
|
</div>
|
|
@@ -1003,9 +1003,11 @@ export type AdminForthConfig = {
|
|
|
1003
1003
|
* }
|
|
1004
1004
|
* ```
|
|
1005
1005
|
*
|
|
1006
|
-
* Install HighCharts:
|
|
1006
|
+
* Install HighCharts into custom folder:
|
|
1007
1007
|
*
|
|
1008
|
-
* ```
|
|
1008
|
+
* ```bashcreating rec
|
|
1009
|
+
* cd custom
|
|
1010
|
+
* npm init -y
|
|
1009
1011
|
* npm install highcharts highcharts-vue
|
|
1010
1012
|
* ```
|
|
1011
1013
|
*
|