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.
@@ -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 (!this.config.auth) {
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) && record[column.name] === undefined) {
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: body['record'][connector.getPrimaryKey(resource)]
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
- </table>
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 (!this.config.auth) {
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 ((column.required as {create?: boolean, edit?: boolean}) ?.create && record[column.name] === undefined) {
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
- const resp = await hook({ resource, record, adminUser });
629
- if (!resp || (!resp.ok && !resp.error)) {
630
- throw new Error(`Hook beforeSave must return object with {ok: true} or { error: 'Error' } `);
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
- if (resp.error) {
634
- return { error: resp.error };
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: body['record'][connector.getPrimaryKey(resource)]
1185
+ newRecordId: record[connector.getPrimaryKey(resource)]
1176
1186
  }
1177
1187
  }
1178
1188
  });
@@ -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,6 @@
1
1
  {
2
2
  "name": "adminforth",
3
- "version": "1.1.106",
3
+ "version": "1.2.1",
4
4
  "description": "OpenSource Vue3 powered forth-generation admin panel",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -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
- </table>
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
- * ```bash
1008
+ * ```bashcreating rec
1009
+ * cd custom
1010
+ * npm init -y
1009
1011
  * npm install highcharts highcharts-vue
1010
1012
  * ```
1011
1013
  *