@genesislcap/blank-app-seed 3.24.0 → 3.25.0

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/blank-app-seed-config",
3
3
  "description": "Genesis Blank App Seed Configuration",
4
- "version": "3.24.0",
4
+ "version": "3.25.0",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "lint": "eslint .",
@@ -1,10 +1,9 @@
1
- <section style="height: 100%; width: 100%;">
2
- <ng-container *ngIf="hasUserPermission('{{config.permissions.viewRight}}'); else notPermitted{{ config.index }}">
3
1
  <rapid-grid-pro
4
2
  header-case-type="capitalCase"
5
3
  only-template-col-defs
6
4
  enable-row-flashing
7
5
  enable-cell-flashing
6
+ [ngStyle]="{ display: hasUserPermission('{{config.permissions.viewRight}}') ? 'block' : 'none' }"
8
7
  >
9
8
  <grid-pro-genesis-datasource
10
9
  resource-name="{{config.resourceName}}"
@@ -22,13 +21,16 @@
22
21
  <grid-pro-column *ngFor="let columnDef of tile{{ config.index }}.gridOptions?.columnDefs" [definition]="columnDef"></grid-pro-column>
23
22
  {{/if}}
24
23
  </rapid-grid-pro>
25
- </ng-container>
26
-
27
- <ng-template #notPermitted{{ config.index }}>
24
+ <section
25
+ [ngStyle]="{
26
+ height: '100%',
27
+ width: '100%',
28
+ display: !hasUserPermission('{{config.permissions.viewRight}}') ? 'block' : 'none'
29
+ }"
30
+ >
28
31
  <app-error-message
29
32
  style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;"
30
33
  elementType="h3"
31
34
  message="You do not have access to view this component.">
32
35
  </app-error-message>
33
- </ng-template>
34
- </section>
36
+ </section>
@@ -4,6 +4,10 @@ import { User, getUser } from '@genesislcap/foundation-user';
4
4
  import { GridOptionsConfig } from "@genesislcap/rapid-grid-pro";
5
5
  import { getDateFormatter, getNumberFormatter, getViewUpdateRightComponent } from '../../utils';
6
6
  import { ErrorMessageComponent } from '../../components/error-message/error-message.component';
7
+ import { environment } from '../../../environments/environment';
8
+ {{#if route.FDC3EventHandlersEnabled}}
9
+ import { sendEventOnChannel } from '../../utils';
10
+ {{/if}}
7
11
 
8
12
  @Component({
9
13
  selector: 'app-{{pascalCase route.name}}',
@@ -17,7 +21,11 @@ import { ErrorMessageComponent } from '../../components/error-message/error-mess
17
21
  styleUrls: ['./{{kebabCase route.name}}.component.css'],
18
22
  })
19
23
  export class {{pascalCase route.name}}Component {
24
+ environment = environment;
20
25
  hasUserPermission = (permissionCode: string) => getViewUpdateRightComponent(getUser(), permissionCode);
26
+ {{#if route.FDC3EventHandlersEnabled}}
27
+ sendEventOnChannel = sendEventOnChannel;
28
+ {{/if}}
21
29
 
22
30
  {{#each route.tiles}}
23
31
  tile{{this.config.index}} = { {{#if this.config.createFormUiSchema}}
@@ -1,5 +1,5 @@
1
1
  {{#if route.tiles}}
2
- <rapid-layout auto-save-key="{{route.layoutKey}}">
2
+ <rapid-layout [auto-save-key]="environment.production ? '{{route.layoutKey}}' : null">
3
3
  {{> (lookup ./route 'layoutType') }}
4
4
  </rapid-layout>
5
5
  {{else}}
@@ -1,7 +1,6 @@
1
1
  const { resolve } = require('node:path');
2
2
  const makeDirectory = require('./makeDirectory');
3
3
  const {
4
- COMPONENT_TYPE,
5
4
  FRAMEWORK_WEB_COMPONENTS_ALIAS,
6
5
  FRAMEWORK_ANGULAR_ALIAS,
7
6
  DIR_TEMPLATE_BY_FRAMEWORK,
@@ -10,119 +9,155 @@ const {
10
9
  const getPathByFramework = {
11
10
  [FRAMEWORK_WEB_COMPONENTS_ALIAS]: {
12
11
  clientSrcPath: `../../client/src/routes`,
13
- route: (clientSrcPath, tileName, tileType, routeName) => `${clientSrcPath}/${routeName}/${tileName}-${tileType}`,
12
+ route: (clientSrcPath, tileName, tileType, routeName) =>
13
+ `${clientSrcPath}/${routeName}/${tileName}-${tileType}`,
14
14
  index: (componentPath) => `${componentPath}/index.ts`,
15
15
  component: (componentPath, tileName) => `${componentPath}/${tileName}.ts`,
16
- template: (componentPath, tileName) => `${componentPath}/${tileName}.template.ts`,
17
- style: (componentPath, tileName) => `${componentPath}/${tileName}.styles.ts`,
18
- addForm: (componentPath, tileName) => `${componentPath}/${tileName}.create.form.schema.ts`,
19
- updateForm: (componentPath, tileName) => `${componentPath}/${tileName}.update.form.schema.ts`,
20
- columnDefs: (componentPath, tileName) => `${componentPath}/${tileName}.column.defs.ts`,
21
- gridOptions: (componentPath, tileName) => `${componentPath}/${tileName}.gridOptions.ts`,
16
+ template: (componentPath, tileName) =>
17
+ `${componentPath}/${tileName}.template.ts`,
18
+ style: (componentPath, tileName) =>
19
+ `${componentPath}/${tileName}.styles.ts`,
20
+ addForm: (componentPath, tileName) =>
21
+ `${componentPath}/${tileName}.create.form.schema.ts`,
22
+ updateForm: (componentPath, tileName) =>
23
+ `${componentPath}/${tileName}.update.form.schema.ts`,
24
+ columnDefs: (componentPath, tileName) =>
25
+ `${componentPath}/${tileName}.column.defs.ts`,
26
+ gridOptions: (componentPath, tileName) =>
27
+ `${componentPath}/${tileName}.gridOptions.ts`,
22
28
  },
23
29
  // Placeholder for angular part
24
30
  [FRAMEWORK_ANGULAR_ALIAS]: {},
25
31
  };
26
32
 
27
- const getFilesToWrite = (tile, tileName, routeName, path, sourceTemplateDir) => {
28
- const {
29
- clientSrcPath,
30
- route: getRouteDir,
31
- index: getComponentIndexTarget,
32
- component: getComponentTarget,
33
- template: getTemplateTarget,
34
- style: getStyleTarget,
35
- addForm: getAddFormTarget,
36
- updateForm: getUpdateFormTarget,
37
- columnDefs: getColumnDefsTarget,
38
- gridOptions: getGridOptionsTarget,
39
- } = path;
40
-
41
- const routeDir = getRouteDir(clientSrcPath, tileName, tile.componentType, routeName);
42
-
43
- const componentIndexFile = {
44
- source: `${sourceTemplateDir}/component/component.index.hbs`,
45
- target: getComponentIndexTarget(routeDir, tileName),
46
- };
47
-
48
- const componentFile = {
49
- source: `${sourceTemplateDir}/component/component.hbs`,
50
- target: getComponentTarget(routeDir, tileName),
51
- };
52
-
53
- const componentTemplateFile = {
54
- source: `${sourceTemplateDir}/component/component.template.hbs`,
55
- target: getTemplateTarget(routeDir, tileName),
56
- };
57
-
58
- const componentStylesFile = {
59
- source: `${sourceTemplateDir}/component/component.styles.hbs`,
60
- target: getStyleTarget(routeDir, tileName),
61
- };
62
-
63
- const componentAddFormFile = {
64
- source: `${sourceTemplateDir}/component/component.create.form.hbs`,
65
- target: getAddFormTarget(routeDir, tileName),
66
- };
67
-
68
- const componentUpdateFormFile = {
69
- source: `${sourceTemplateDir}/component/component.update.form.hbs`,
70
- target: getUpdateFormTarget(routeDir, tileName),
33
+ const getFilesToWrite = (
34
+ tile,
35
+ tileName,
36
+ routeName,
37
+ path,
38
+ sourceTemplateDir,
39
+ ) => {
40
+ const {
41
+ clientSrcPath,
42
+ route: getRouteDir,
43
+ index: getComponentIndexTarget,
44
+ component: getComponentTarget,
45
+ template: getTemplateTarget,
46
+ style: getStyleTarget,
47
+ addForm: getAddFormTarget,
48
+ updateForm: getUpdateFormTarget,
49
+ columnDefs: getColumnDefsTarget,
50
+ gridOptions: getGridOptionsTarget,
51
+ } = path;
52
+
53
+ const routeDir = getRouteDir(
54
+ clientSrcPath,
55
+ tileName,
56
+ tile.componentType,
57
+ routeName,
58
+ );
59
+
60
+ const componentIndexFile = {
61
+ source: `${sourceTemplateDir}/component/component.index.hbs`,
62
+ target: getComponentIndexTarget(routeDir, tileName),
63
+ };
64
+
65
+ const componentFile = {
66
+ source: `${sourceTemplateDir}/component/component.hbs`,
67
+ target: getComponentTarget(routeDir, tileName),
68
+ };
69
+
70
+ const componentTemplateFile = {
71
+ source: `${sourceTemplateDir}/component/component.template.hbs`,
72
+ target: getTemplateTarget(routeDir, tileName),
73
+ };
74
+
75
+ const componentStylesFile = {
76
+ source: `${sourceTemplateDir}/component/component.styles.hbs`,
77
+ target: getStyleTarget(routeDir, tileName),
78
+ };
79
+
80
+ const componentAddFormFile = {
81
+ source: `${sourceTemplateDir}/component/component.create.form.hbs`,
82
+ target: getAddFormTarget(routeDir, tileName),
83
+ };
84
+
85
+ const componentUpdateFormFile = {
86
+ source: `${sourceTemplateDir}/component/component.update.form.hbs`,
87
+ target: getUpdateFormTarget(routeDir, tileName),
88
+ };
89
+
90
+ const componentColumnsFile = {
91
+ source: `${sourceTemplateDir}/component/component.column.defs.hbs`,
92
+ target: getColumnDefsTarget(routeDir, tileName),
93
+ };
94
+
95
+ const componentGridOptionsFile = {
96
+ source: `${sourceTemplateDir}/component/component.gridOptions.hbs`,
97
+ target: getGridOptionsTarget(routeDir, tileName),
98
+ };
99
+
100
+ const filesToWrite = [
101
+ componentIndexFile,
102
+ componentFile,
103
+ componentTemplateFile,
104
+ componentStylesFile,
105
+ ];
106
+
107
+ switch (tile.type) {
108
+ case 'entity-manager':
109
+ if (tile.config?.columns) {
110
+ filesToWrite.push(componentColumnsFile);
71
111
  }
72
-
73
- const componentColumnsFile = {
74
- source: `${sourceTemplateDir}/component/component.column.defs.hbs`,
75
- target: getColumnDefsTarget(routeDir, tileName),
76
- };
77
-
78
- const componentGridOptionsFile = {
79
- source: `${sourceTemplateDir}/component/component.gridOptions.hbs`,
80
- target: getGridOptionsTarget(routeDir, tileName),
81
- };
82
-
83
- const filesToWrite = [componentIndexFile, componentFile, componentTemplateFile, componentStylesFile];
84
-
85
- switch (tile.type) {
86
- case 'entity-manager':
87
- if (tile.config?.columns) {
88
- filesToWrite.push(componentColumnsFile);
89
- }
90
- if (tile.config?.gridOptions) {
91
- filesToWrite.push(componentGridOptionsFile);
92
- }
93
- if (tile.config?.createFormUiSchema) {
94
- filesToWrite.push(componentAddFormFile);
95
- }
96
- if (tile.config?.updateFormUiSchema) {
97
- filesToWrite.push(componentUpdateFormFile);
98
- }
99
- break;
100
- case 'grid-pro':
101
- if (tile.config?.gridOptions) {
102
- filesToWrite.push(componentGridOptionsFile);
103
- }
104
- break;
105
- case 'smart-form':
106
- filesToWrite.push(componentAddFormFile);
107
- break
108
- default:
109
- break;
112
+ if (tile.config?.gridOptions) {
113
+ filesToWrite.push(componentGridOptionsFile);
110
114
  }
115
+ if (tile.config?.createFormUiSchema) {
116
+ filesToWrite.push(componentAddFormFile);
117
+ }
118
+ if (tile.config?.updateFormUiSchema) {
119
+ filesToWrite.push(componentUpdateFormFile);
120
+ }
121
+ break;
122
+ case 'grid-pro':
123
+ if (tile.config?.gridOptions) {
124
+ filesToWrite.push(componentGridOptionsFile);
125
+ }
126
+ break;
127
+ case 'smart-form':
128
+ filesToWrite.push(componentAddFormFile);
129
+ break;
130
+ default:
131
+ break;
132
+ }
133
+
134
+ return filesToWrite;
135
+ };
111
136
 
112
- return filesToWrite
113
- }
114
-
115
- const generateTile = (tile, route, { changeCase, writeFileWithData }, framework) => {
137
+ const generateTile = (
138
+ tile,
139
+ route,
140
+ { changeCase, writeFileWithData },
141
+ framework,
142
+ ) => {
116
143
  const tileName = changeCase.paramCase(tile.title);
117
144
  const routeName = changeCase.paramCase(route.name);
118
145
  const sourceTemplateDir = `../${DIR_TEMPLATE_BY_FRAMEWORK[framework]}`;
119
- const {
146
+ const { clientSrcPath, route: getRouteDir } = getPathByFramework[framework];
147
+ const routeDir = getRouteDir(
120
148
  clientSrcPath,
121
- route: getRouteDir,
122
- } = getPathByFramework[framework];
123
- const routeDir = getRouteDir(clientSrcPath, tileName, tile.componentType, routeName);
124
-
125
- const filesToWrite = getFilesToWrite(tile, tileName, routeName, getPathByFramework[framework], sourceTemplateDir)
149
+ tileName,
150
+ tile.componentType,
151
+ routeName,
152
+ );
153
+
154
+ const filesToWrite = getFilesToWrite(
155
+ tile,
156
+ tileName,
157
+ routeName,
158
+ getPathByFramework[framework],
159
+ sourceTemplateDir,
160
+ );
126
161
 
127
162
  makeDirectory(resolve(__dirname, routeDir));
128
163
  filesToWrite.forEach(({ source, target }) => {
@@ -1,13 +1,8 @@
1
1
  const { resolve } = require('node:path');
2
- const {
3
- DIR_TEMPLATE_ROOT_ALIAS,
4
- DIRS_MAP,
5
- DIR_TEMPLATE_BY_FRAMEWORK,
6
- } = require('../static');
2
+ const { DIR_TEMPLATE_BY_FRAMEWORK } = require('../static');
7
3
 
8
4
  const registerPartials = ({ registerPartial }, framework) => {
9
5
  // It can be reverted after adding changes for angular
10
- const rootTemplateDir = `../${DIRS_MAP.get(DIR_TEMPLATE_ROOT_ALIAS)}`;
11
6
  const sourceTemplateDir = `../${DIR_TEMPLATE_BY_FRAMEWORK[framework]}`;
12
7
 
13
8
  registerPartial(
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [3.25.0](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.24.0...v3.25.0) (2024-07-18)
4
+
5
+
6
+ ### Features
7
+
8
+ * FDC3 support in angular - [FUI-2068](https://github.com/genesiscommunitysuccess/blank-app-seed/issues/2068) (#281) 8d30d4c
9
+
3
10
  ## [3.24.0](https://github.com/genesiscommunitysuccess/blank-app-seed/compare/v3.23.0...v3.24.0) (2024-07-16)
4
11
 
5
12
 
@@ -140,6 +140,7 @@
140
140
  }
141
141
  },
142
142
  "cli": {
143
+ "analytics": false,
143
144
  "schematicCollections": ["@angular-eslint/schematics"]
144
145
  }
145
146
  }
@@ -40,6 +40,9 @@
40
40
  "@angular/platform-browser": "^18.0.4",
41
41
  "@angular/platform-browser-dynamic": "^18.0.4",
42
42
  "@angular/router": "^18.0.4",
43
+ {{#if FDC3.includeDependencies}}
44
+ "@genesislcap/foundation-fdc3": "{{versions.UI}}",
45
+ {{/if}}
43
46
  "@genesislcap/foundation-comms": "{{versions.UI}}",
44
47
  "@genesislcap/foundation-login": "{{versions.UI}}",
45
48
  "@genesislcap/foundation-entity-management": "{{versions.UI}}",
@@ -1,8 +1,11 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, AfterViewInit } from '@angular/core';
2
2
  import { Router, NavigationEnd } from '@angular/router';
3
3
  import getLayoutNameByRoute from './utils/getLayoutNameByRoute';
4
4
  import type { LayoutComponentName } from './types/layout';
5
5
  import { configureFoundationLogin } from './share/foundation-login';
6
+ {{#if FDC3.channels.length}}
7
+ import { listenToChannel, onFDC3Ready } from './utils';
8
+ {{/if}}
6
9
 
7
10
  // Genesis Components
8
11
  import './share/genesis-components';
@@ -12,7 +15,7 @@ import './share/genesis-components';
12
15
  templateUrl: './app.component.html',
13
16
  styleUrl: './app.component.css',
14
17
  })
15
- export class AppComponent {
18
+ export class AppComponent implements AfterViewInit {
16
19
  layoutName?: LayoutComponentName;
17
20
  title = '{{capitalCase appName}}';
18
21
 
@@ -28,4 +31,22 @@ export class AppComponent {
28
31
  }
29
32
  });
30
33
  }
34
+
35
+ ngAfterViewInit() {
36
+ {{#if FDC3.channels.length}}
37
+ onFDC3Ready(this.FDC3ReadyHandler);
38
+ {{/if}}
39
+ }
40
+
41
+ {{#if FDC3.channels.length}}
42
+ FDC3ReadyHandler = () => {
43
+ {{#each FDC3.channels}}
44
+ listenToChannel('{{this.name}}', '{{this.type}}', (result) => {
45
+ console.log('Received FDC3 channel message on: {{this.name}} channel, type: {{this.type}}', result);
46
+ // TODO: Add your listener logic here
47
+ // E.g. open a modal or route to specific page: Route.path.push(`[Route name]`);
48
+ });
49
+ {{/each}}
50
+ };
51
+ {{/if}}
31
52
  }
@@ -0,0 +1,32 @@
1
+ {{#if FDC3.includeDependencies}}
2
+ import { DefaultFDC3 } from '@genesislcap/foundation-fdc3';
3
+ {{/if}}
4
+ export const isFDC3 = (): boolean => !!(window as any).fdc3;
5
+ {{#if FDC3.includeDependencies}}
6
+
7
+ export const onFDC3Ready = async (FDC3ReadyCb: () => any): Promise<void> => {
8
+ isFDC3()
9
+ ? await FDC3ReadyCb()
10
+ : window.addEventListener('fdc3Ready', async () => {
11
+ await FDC3ReadyCb();
12
+ });
13
+ };
14
+
15
+ export const listenToChannel = async (
16
+ channelName: string,
17
+ type: string,
18
+ callback: (result: any) => void,
19
+ ): Promise<void> => {
20
+ const fdc3Service = new DefaultFDC3();
21
+ fdc3Service.addChannelListener(channelName, type, callback);
22
+ };
23
+
24
+ export const sendEventOnChannel = (channelName: string, type: string) => {
25
+ return async (e: any) => {
26
+ const fdc3Service = new DefaultFDC3();
27
+ // check for ag-grid-specific events, fall back to standard events
28
+ const payload = e.data || e.detail;
29
+ await fdc3Service.broadcastOnChannel(channelName, type, payload);
30
+ };
31
+ };
32
+ {{/if}}
@@ -1,3 +1,4 @@
1
1
  export * from './formatters';
2
2
  export * from './getLayoutNameByRoute';
3
3
  export * from './permissions';
4
+ export * from './fdc3';
@@ -10,7 +10,6 @@
10
10
  "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
11
11
  "serve": "vite preview",
12
12
  "clean": "rm -rf node_modules dist",
13
-
14
13
  "lint:fix": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix"
15
14
  },
16
15
  "dependencies": {
@@ -17,9 +17,9 @@ const BlankLayout: React.FC<BlankLayoutProps> = ({ children }) =>{
17
17
  }, []);
18
18
 
19
19
  return (
20
- <zero-design-system-provider className={styles['blank-layout']}>
20
+ <rapid-design-system-provider className={styles['blank-layout']}>
21
21
  <section className={styles.content}>{children}</section>
22
- </zero-design-system-provider>
22
+ </rapid-design-system-provider>
23
23
  );
24
24
  };
25
25
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/blank-app-seed",
3
3
  "description": "Genesis Blank App Seed",
4
- "version": "3.24.0",
4
+ "version": "3.25.0",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "release": "semantic-release"
@@ -1,5 +0,0 @@
1
- import { history } from './history';
2
-
3
- export const navigateTo = (path: string): void => {
4
- history.push(path);
5
- };