@genesislcap/blank-app-seed 3.29.1 → 3.30.0-prerelease.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.
Files changed (58) hide show
  1. package/.genx/configure.js +1 -1
  2. package/.genx/package.json +1 -1
  3. package/.genx/scripts/update-versions.js +45 -15
  4. package/.genx/templates/angular/entityManager.hbs +3 -0
  5. package/.genx/templates/angular/route.hbs +0 -1
  6. package/.genx/templates/react/chart.hbs +6 -2
  7. package/.genx/templates/react/component/component.gridOptions.hbs +1 -1
  8. package/.genx/templates/react/component/component.hbs +22 -14
  9. package/.genx/templates/react/component/component.index.hbs +1 -1
  10. package/.genx/templates/react/entityManager.hbs +16 -9
  11. package/.genx/templates/react/form.hbs +6 -2
  12. package/.genx/templates/react/grid.hbs +15 -5
  13. package/.genx/templates/react/gridLayout.hbs +28 -28
  14. package/.genx/templates/react/horizontalLayout.hbs +5 -5
  15. package/.genx/templates/react/route.hbs +4 -18
  16. package/.genx/templates/web-components/entityManager.hbs +3 -0
  17. package/.genx/utils/formatRouteData.js +1 -1
  18. package/.genx/utils/generateTile.js +1 -0
  19. package/.genx/versions.json +3 -3
  20. package/.github/pull_request_template.md +1 -1
  21. package/.github/workflows/build.yml +3 -2
  22. package/.github/workflows/release.yml +1 -0
  23. package/.github/workflows/slack.yml +1 -1
  24. package/.github/workflows/upgrade.yml +8 -3
  25. package/.github/workflows/upgrade_prerelease.yml +1 -0
  26. package/CHANGELOG.md +107 -2
  27. package/client-tmp/react/.eslintrc.cjs +3 -1
  28. package/client-tmp/react/env.development.json +3 -0
  29. package/client-tmp/react/index.html +1 -1
  30. package/client-tmp/react/lint-css.js +18 -0
  31. package/client-tmp/react/package.json +31 -5
  32. package/client-tmp/react/playwright.config.ts +17 -0
  33. package/client-tmp/react/src/App.tsx +33 -6
  34. package/client-tmp/react/src/components/ErrorMessage/ErrorMessage.jsx +62 -0
  35. package/client-tmp/react/src/components/ErrorMessage.test.js +80 -0
  36. package/client-tmp/react/src/config.ts +2 -1
  37. package/client-tmp/react/src/custom-elements.d.ts +1 -1
  38. package/client-tmp/react/src/guards/PermissionsGuard.tsx +37 -0
  39. package/client-tmp/react/src/pages/NotPermittedPage/NotPermittedPage.css +0 -0
  40. package/client-tmp/react/src/pages/NotPermittedPage/NotPermittedPage.jsx +13 -0
  41. package/client-tmp/react/src/share/foundation-login.ts +1 -1
  42. package/client-tmp/react/src/svg-elements.d.ts +1 -1
  43. package/client-tmp/react/src/utils/fdc3.ts +32 -0
  44. package/client-tmp/react/src/utils/history.ts +1 -3
  45. package/client-tmp/react/src/utils/index.ts +4 -0
  46. package/client-tmp/react/src/utils/permissions.ts +7 -0
  47. package/client-tmp/react/src/utils/setApiHost.ts +9 -0
  48. package/client-tmp/react/test/e2e/fixture.ts +26 -0
  49. package/client-tmp/react/test/e2e/flows/001-protected.e2e.ts +6 -0
  50. package/client-tmp/react/test/e2e/index.ts +2 -0
  51. package/client-tmp/react/test/e2e/pages/index.ts +1 -0
  52. package/client-tmp/react/test/e2e/pages/protected.ts +16 -0
  53. package/client-tmp/react/tsconfig.node.json +1 -1
  54. package/client-tmp/react/vite.config.js +59 -0
  55. package/package.json +1 -1
  56. package/client-tmp/react/vite.config.ts +0 -14
  57. /package/client-tmp/react/src/pages/{auth → AuthPage}/AuthPage.css +0 -0
  58. /package/client-tmp/react/src/pages/{auth → AuthPage}/AuthPage.jsx +0 -0
@@ -16,7 +16,7 @@ module.exports = async (data, utils) => {
16
16
  // populate additional data fields
17
17
  data.pkgName = data.appName.replace(/[\W_]/g, '').toLowerCase();
18
18
  data.rootElement = `${data.pkgName}-root`;
19
- data.localGenId = data.appName.toUpperCase().replace('-', '_');
19
+ data.localGenId = data.appName.toUpperCase().replace(/-/g, '_');
20
20
  data.applicationVersionWeb = data.applicationVersion.split('-').shift();
21
21
  data.versions = versions;
22
22
 
@@ -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.29.1",
4
+ "version": "3.30.0-prerelease.1",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "lint": "eslint .",
@@ -4,23 +4,30 @@ const { resolve } = require('node:path');
4
4
  const current = require('../versions.json');
5
5
 
6
6
  const args = process.argv.slice(2);
7
- const patchOnly = args.indexOf("--patch-only") >= 0;
8
- const dryRun = args.indexOf("--dry-run") >= 0;
9
7
 
10
- const VERSION_REGEX = /\d+$/;
8
+ const argDefined = (name) => args.indexOf(name) >= 0;
9
+
10
+ const patchOnly = argDefined("--patch-only");
11
+ const dryRun = argDefined("--dry-run");
12
+ const skipServer = argDefined("--skip-server");
11
13
 
12
- const jfrogVersionMatcher = patchOnly ? current.GSF.replace(VERSION_REGEX, '*') : undefined;
14
+ const VERSION_REGEX = /\d+$/;
15
+ const JFROG_BASE_EXCLUSIONS = '*-SNAPSHOT*;*maven-metadata*;*test*;*TEST*';
13
16
 
14
- const npmVersionMatcher = patchOnly ? current.UI.replace(VERSION_REGEX, 'x') : 'latest';
17
+ const { jfrogVersionMatcher, jfrogExclusionsMatcher, npmVersionMatcher } = patchOnly
18
+ ? { jfrogVersionMatcher: current.GSF.replace(VERSION_REGEX, '*'), jfrogExclusionsMatcher: `*-beta*;*-RC*;${JFROG_BASE_EXCLUSIONS}`, npmVersionMatcher: current.UI.replace(VERSION_REGEX, 'x') }
19
+ : { jfrogVersionMatcher: undefined, jfrogExclusionsMatcher: JFROG_BASE_EXCLUSIONS, npmVersionMatcher: 'latest' };
15
20
 
16
- console.log('Running with: ', {patchOnly, dryRun, npmVersionMatcher, jfrogVersionMatcher})
21
+ console.log('Running with: ', { patchOnly, skipServer, dryRun, npmVersionMatcher, jfrogVersionMatcher, jfrogExclusionsMatcher });
17
22
 
18
- const run = (command) =>
19
- execSync(command, {
23
+ const run = (command) => {
24
+ console.debug('running:', command);
25
+ return execSync(command, {
20
26
  stdio: ['pipe', 'pipe', 'ignore'],
21
27
  })
22
28
  .toString('utf8')
23
29
  .trim();
30
+ };
24
31
 
25
32
  const writeJSON = (json, path) => {
26
33
  const data = JSON.stringify(json, null, 2) + '\n';
@@ -32,15 +39,38 @@ const writeJSON = (json, path) => {
32
39
  }
33
40
  };
34
41
 
35
- const UI = run(`npm info @genesislcap/foundation-ui@${npmVersionMatcher} version`);
42
+ /**
43
+ * NPM Info returns a string if there's only one version in the channel;, otherwise it returns a valid json array,
44
+ * where the most recent version will be the last value;
45
+ * @param {*} output
46
+ * @returns
47
+ */
48
+ const parseNpmInfo = (output) => {
49
+ try {
50
+ const versions = JSON.parse(output);
51
+ return Array.isArray(versions) ? versions[versions.length-1] : versions;
52
+ } catch (err) {
53
+ return output;
54
+ }
55
+ }
56
+
57
+ const npmInfo = run(`npm info @genesislcap/foundation-ui@${npmVersionMatcher} version --json`);
58
+ console.debug('Npm raw output:', npmInfo);
59
+ const UI = parseNpmInfo(npmInfo);
60
+
61
+ const serverOsCommandPipeline = `grep path | tr -s ' ' | sed 's/"path": //g' | awk -F'/' '{print $(NF-1)}' | sort -V | tail -n 1`;
36
62
 
37
- const GSF = run(
38
- `jf rt s "libs-release-client/global/genesis/genesis-distribution/${jfrogVersionMatcher ?? ''}" --exclusions="*-RC*;*-SNAPSHOT*;*maven-metadata*;*test*;*TEST*" | grep path | tr -s ' ' | sed 's/"path": //g' | awk -F'/' '{print $(NF-1)}' | sort -V | tail -n 1`,
39
- );
63
+ const { GSF, Auth } = skipServer
64
+ ? { GSF: current.GSF, Auth: current.Auth }
65
+ : {
66
+ GSF: run(
67
+ `jf rt s "libs-release-client/global/genesis/genesis-distribution/${jfrogVersionMatcher ?? ''}" --exclusions="${jfrogExclusionsMatcher}" | ${serverOsCommandPipeline}`
68
+ ),
69
+ Auth: run(
70
+ `jf rt s "libs-release-client/global/genesis/auth-distribution/${jfrogVersionMatcher ?? ''}" --exclusions="${jfrogExclusionsMatcher}" | ${serverOsCommandPipeline}`,
71
+ )
72
+ };
40
73
 
41
- const Auth = run(
42
- `jf rt s "libs-release-client/global/genesis/auth-distribution/${jfrogVersionMatcher ?? ''}" --exclusions="*-RC*;*-SNAPSHOT*;*maven-metadata*;*test*;*TEST*" | grep path | tr -s ' ' | sed 's/"path": //g' | awk -F'/' '{print $(NF-1)}' | sort -V | tail -n 1`,
43
- );
44
74
  const latest = { UI, GSF, Auth };
45
75
 
46
76
  console.log('Current:', current);
@@ -33,6 +33,9 @@
33
33
  {{#if config.reqrep}}
34
34
  [datasourceConfig]="reqrep"
35
35
  {{/if}}
36
+ {{#if config.entityName}}
37
+ entityLabel="{{ config.entityName }}"
38
+ {{/if}}
36
39
  {{#if config.columns}}
37
40
  [columns]="columnDefs"
38
41
  {{/if}}
@@ -5,7 +5,6 @@ import { {{pascalCase this.componentName}} } from './{{kebabCase this.title}}-{{
5
5
  {{/each}}
6
6
  import { environment } from '../../../environments/environment';
7
7
 
8
-
9
8
  @Component({
10
9
  selector: 'app-{{kebabCase route.name}}',
11
10
  standalone: true,
@@ -1,9 +1,13 @@
1
+ {{#if config.permissions.viewRight}}hasUserPermission('{{config.permissions.viewRight}}') ? ({{/if}}
1
2
  <rapid-g2plot-chart
2
3
  type="{{ config.type }}"
3
- config={tile{{ config.index }}.chartConfig}
4
+ config={chartConfig}
4
5
  >
5
6
  <chart-datasource
6
7
  resourceName="{{ config.resourceName }}"
7
8
  server-fields="{{ config.xField }} {{ config.yField }}"
8
9
  ></chart-datasource>
9
- </rapid-g2plot-chart>
10
+ </rapid-g2plot-chart>{{#if config.permissions.viewRight}}
11
+ ) : (
12
+ <ErrorMessage elementType="h3" message="You do not have access to view this component." />
13
+ ){{/if}}
@@ -6,4 +6,4 @@ import { sendEventOnChannel } from '../../../utils';
6
6
 
7
7
  {{#if tile.config.gridOptions}}
8
8
  export const gridOptions: GridOptionsConfig = {{{ tile.config.gridOptions }}}
9
- {{/if}}
9
+ {{/if}}
@@ -1,32 +1,40 @@
1
- import { Component, Input, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
1
  import { getUser } from '@genesislcap/foundation-user';
4
- import { ErrorMessageComponent } from '../../../components/error-message/error-message.component';
5
2
  import { getViewUpdateRightComponent } from '../../../utils';
6
- {{#if tile.config.gridOptions}}
7
- import { GridOptionsConfig } from "@genesislcap/rapid-grid-pro";
8
- {{/if}}
3
+ import ErrorMessage from '../../../components/ErrorMessage/ErrorMessage';
9
4
  {{#if tile.config.createFormUiSchema}}
10
- import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema';
5
+ import { createFormSchema as createFormSchemaTile } from './{{kebabCase tile.title}}.create.form.schema';
11
6
  {{/if}}
12
7
  {{#if tile.config.uischema}}
13
- import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema';
8
+ import { createFormSchema as createFormSchemaTile } from './{{kebabCase tile.title}}.create.form.schema';
14
9
  {{/if}}
15
10
  {{#if tile.config.updateFormUiSchema}}
16
- import { updateFormSchema } from './{{kebabCase tile.title}}.update.form.schema';
11
+ import { updateFormSchema as updateFormSchemaTile } from './{{kebabCase tile.title}}.update.form.schema';
17
12
  {{/if}}
18
13
  {{#if tile.config.columns}}
19
- import { columnDefs } from './{{kebabCase tile.title}}.column.defs';
14
+ import { columnDefs as columnDefsTile } from './{{kebabCase tile.title}}.column.defs';
20
15
  {{/if}}
21
16
  {{#if tile.config.gridOptions}}
22
- import { gridOptions } from './{{kebabCase tile.title}}.gridOptions';
17
+ import { gridOptions as gridOptionsTile } from './{{kebabCase tile.title}}.gridOptions';
23
18
  {{/if}}
24
19
  import './{{kebabCase tile.title}}.component.css';
25
20
 
26
- const {{pascalCase tile.componentName}} = () => {
21
+ export const {{pascalCase tile.componentName}} = () => {
22
+ const hasUserPermission = (permissionCode) => getViewUpdateRightComponent(getUser(), permissionCode);{{#if tile.config.createFormUiSchema}}
23
+ const createFormSchema = createFormSchemaTile;{{/if}}{{#if tile.config.uischema}}
24
+ const uischema = createFormSchemaTile;{{/if}}{{#if tile.config.updateFormUiSchema}}
25
+ const updateFormSchema = updateFormSchemaTile;{{/if}}{{#if tile.config.columns}}
26
+ const columnDefs = columnDefsTile;{{/if}}{{#if tile.config.gridOptions}}
27
+ const gridOptions = gridOptionsTile;{{/if}}{{#if tile.config.reqrep}}
28
+ const reqrep = { pollingInterval: 5000 };{{/if}}{{#if tile.config.type}}
29
+ const chartConfig = { {{#ifEquals tile.config.type 'pie'}}
30
+ "radius": 0.75,
31
+ "angleField": "value",
32
+ "colorField": "groupBy",{{else}}
33
+ "xField": "groupBy",
34
+ "yField": "value",{{/ifEquals}}
35
+ };{{/if}}
36
+
27
37
  return (
28
38
  {{> (lookup tile 'type') tile}}
29
39
  );
30
40
  };
31
-
32
- export default {{pascalCase tile.componentName}};
@@ -1 +1 @@
1
- export * from './{{kebabCase tile.title}}.component';
1
+ export * from './{{kebabCase tile.title}}.component.jsx';
@@ -1,3 +1,4 @@
1
+ {{#if config.permissions.viewRight}}hasUserPermission('{{config.permissions.viewRight}}') ? ({{/if}}
1
2
  <entity-management
2
3
  design-system-prefix="rapid"
3
4
  enable-row-flashing
@@ -7,31 +8,34 @@
7
8
  {{/if}}
8
9
  resourceName="{{ config.resourceName }}"
9
10
  {{#if config.createEvent}}
10
- createEvent="{{ config.createEvent }}"
11
+ createEvent={hasUserPermission('{{config.permissions.updateRight}}') ? '{{ config.createEvent }}' : undefined}
11
12
  {{#if config.createFormUiSchema}}
12
- createFormUiSchema={tile{{ config.index }}.createFormUiSchema}
13
+ createFormUiSchema={createFormSchema}
13
14
  {{/if}}
14
15
  {{/if}}
15
16
  {{#if config.updateEvent}}
16
- updateEvent="{{ config.updateEvent }}"
17
+ updateEvent={hasUserPermission('{{config.permissions.updateRight}}') ? '{{ config.updateEvent }}' : undefined}
17
18
  {{#if config.updateFormUiSchema}}
18
- updateFormUiSchema={tile{{ config.index }}.updateFormUiSchema}
19
+ updateFormUiSchema={updateFormSchema}
19
20
  {{/if}}
20
21
  {{/if}}
21
22
  {{#if config.deleteEvent}}
22
- deleteEvent="{{ config.deleteEvent }}"
23
+ deleteEvent={hasUserPermission('{{config.permissions.updateRight}}') ? '{{ config.deleteEvent }}' : undefined}
23
24
  {{/if}}
24
25
  {{#if config.gridOptions}}
25
- gridOptions={{{ config.gridOptions }}}
26
+ gridOptions={gridOptions}
26
27
  {{/if}}
27
28
  {{#if config.snapshot}}
28
29
  datasourceConfig={ isSnapshot: {{ config.snapshot }} }
29
30
  {{/if}}
30
31
  {{#if config.reqrep}}
31
- datasourceConfig={tile{{ config.index }}.reqrep}
32
+ datasourceConfig={reqrep}
33
+ {{/if}}
34
+ {{#if config.entityName}}
35
+ entityLabel="{{ config.entityName }}"
32
36
  {{/if}}
33
37
  {{#if config.columns}}
34
- columns={tile{{ config.index }}.columns}
38
+ columns={columnDefs}
35
39
  {{/if}}
36
40
  {{#if config.modalPosition}}
37
41
  modal-position="{{ config.modalPosition }}"
@@ -42,4 +46,7 @@
42
46
  {{#if config.enableSearchBar}}
43
47
  enable-search-bar
44
48
  {{/if}}
45
- ></entity-management>
49
+ ></entity-management>{{#if config.permissions.viewRight}}
50
+ ) : (
51
+ <ErrorMessage elementType="h3" message="You do not have access to view this component." />
52
+ ){{/if}}
@@ -1,8 +1,12 @@
1
+ {{#if config.permissions.updateRight}}hasUserPermission('{{config.permissions.updateRight}}') ? ({{/if}}
1
2
  <foundation-form
2
3
  design-system-prefix="rapid"
3
4
  resourceName="{{config.resourceName}}"
4
5
  {{#if config.uischema}}
5
- uischema={tile{{ config.index }}.uischema}
6
+ uischema={uischema}
6
7
  {{/if}}
7
8
  >
8
- </foundation-form>
9
+ </foundation-form>{{#if config.permissions.updateRight}}
10
+ ) : (
11
+ <ErrorMessage elementType="h3" message="You do not have access to view this component." />
12
+ ){{/if}}
@@ -1,4 +1,7 @@
1
+ {{#if config.permissions.viewRight}}hasUserPermission('{{config.permissions.viewRight}}') ? ({{/if}}
1
2
  <rapid-grid-pro
3
+ header-case-type="capitalCase"{{#if config.useOnlyTemplateCols}}
4
+ only-template-col-defs{{/if}}
2
5
  enable-row-flashing
3
6
  enable-cell-flashing
4
7
  >
@@ -8,11 +11,18 @@
8
11
  isSnapshot="{{config.snapshot}}"
9
12
  {{/if}}
10
13
  {{#if config.reqrep}}
11
- datasourceConfig={tile{{ config.index }}.reqrep}
14
+ datasourceConfig="reqrep"
12
15
  {{/if}}
13
16
  {{#if config.gridOptions}}
14
- deferredGridOptions={tile{{ config.index }}.gridOptions}
17
+ deferredGridOptions=\{{ onRowClicked: gridOptions?.onRowClicked }}
15
18
  {{/if}}
16
- >
17
- </grid-pro-genesis-datasource>
18
- </rapid-grid-pro>
19
+ ></grid-pro-genesis-datasource>
20
+ {{#if config.gridOptions}}
21
+ {gridOptions?.columnDefs?.map((columnDef, index) => (
22
+ <grid-pro-column key={index} definition={columnDef}></grid-pro-column>
23
+ ))}
24
+ {{/if}}
25
+ </rapid-grid-pro>{{#if config.permissions.viewRight}}
26
+ ) : (
27
+ <ErrorMessage elementType="h3" message="You do not have access to view this component." />
28
+ ){{/if}}
@@ -1,30 +1,30 @@
1
1
  <rapid-layout-region type="horizontal">
2
- <rapid-layout-region type="vertical">
3
- {{#each route.tiles}}
4
- {{#ifEquals @index 0}}
5
- <rapid-layout-item title="{{../title}}">
6
- {{> (lookup ../this 'type') ../this}}
7
- </rapid-layout-item>
8
- {{/ifEquals}}
9
- {{#ifEquals @index 1}}
10
- <rapid-layout-item title="{{../title}}">
11
- {{> (lookup ../this 'type') ../this}}
12
- </rapid-layout-item>
13
- {{/ifEquals}}
14
- {{/each}}
15
- </rapid-layout-region>
16
- <rapid-layout-region type="vertical">
17
- {{#each route.tiles}}
18
- {{#ifEquals @index 2}}
19
- <rapid-layout-item title="{{../title}}">
20
- {{> (lookup ../this 'type') ../this}}
21
- </rapid-layout-item>
22
- {{/ifEquals}}
23
- {{#ifEquals @index 3}}
24
- <rapid-layout-item title="{{../title}}">
25
- {{> (lookup ../this 'type') ../this}}
26
- </rapid-layout-item>
27
- {{/ifEquals}}
28
- {{/each}}
29
- </rapid-layout-region>
2
+ <rapid-layout-region type="vertical">
3
+ {{#each route.tiles}}
4
+ {{#ifEquals @index 0}}
5
+ <rapid-layout-item title="{{../title}}">
6
+ <{{pascalCase ../componentName}}></{{pascalCase ../componentName}}>
7
+ </rapid-layout-item>
8
+ {{/ifEquals}}
9
+ {{#ifEquals @index 1}}
10
+ <rapid-layout-item title="{{../title}}">
11
+ <{{pascalCase ../componentName}}></{{pascalCase ../componentName}}>
12
+ </rapid-layout-item>
13
+ {{/ifEquals}}
14
+ {{/each}}
15
+ </rapid-layout-region>
16
+ <rapid-layout-region type="vertical">
17
+ {{#each route.tiles}}
18
+ {{#ifEquals @index 2}}
19
+ <rapid-layout-item title="{{../title}}">
20
+ <{{pascalCase ../componentName}}></{{pascalCase ../componentName}}>
21
+ </rapid-layout-item>
22
+ {{/ifEquals}}
23
+ {{#ifEquals @index 3}}
24
+ <rapid-layout-item title="{{../title}}">
25
+ <{{pascalCase ../componentName}}></{{pascalCase ../componentName}}>
26
+ </rapid-layout-item>
27
+ {{/ifEquals}}
28
+ {{/each}}
29
+ </rapid-layout-region>
30
30
  </rapid-layout-region>
@@ -1,7 +1,7 @@
1
1
  <rapid-layout-region>
2
- {{#each route.tiles}}
3
- <rapid-layout-item title="{{this.title}}">
4
- {{> (lookup . 'type') }}
5
- </rapid-layout-item>
6
- {{/each}}
2
+ {{#each route.tiles}}
3
+ <rapid-layout-item title="{{this.title}}">
4
+ <{{pascalCase this.componentName}}></{{pascalCase this.componentName}}>
5
+ </rapid-layout-item>
6
+ {{/each}}
7
7
  </rapid-layout-region>
@@ -1,28 +1,14 @@
1
1
  import './{{pascalCase route.name}}.css';
2
+ {{#each route.tiles}}
3
+ import { {{pascalCase this.componentName}} } from './{{kebabCase this.title}}-{{this.componentType}}';
4
+ {{/each}}
2
5
 
3
6
  const {{pascalCase route.name}} = () => {
4
- {{#each route.tiles}}
5
- const tile{{this.config.index}} = { {{#if this.config.createFormUiSchema}}
6
- "createFormUiSchema": {{{ this.config.createFormUiSchema }}},{{/if}}{{#if this.config.updateFormUiSchema}}
7
- "updateFormUiSchema": {{{ this.config.updateFormUiSchema }}},{{/if}}{{#if this.config.uischema}}
8
- "uischema": {{{ this.config.uischema }}},{{/if}}{{#if this.config.gridOptions}}
9
- "gridOptions": {{{ this.config.gridOptions }}},{{/if}}{{#if this.config.reqrep}}
10
- "reqrep": {{{ this.config.reqrep }}},{{/if}}{{#if this.config.columns}}
11
- "columns": {{{ this.config.columns }}},{{/if}}{{#if this.config.type}}
12
- "chartConfig": { {{#ifEquals this.config.type 'pie'}}
13
- "radius": 0.75,
14
- "angleField": "value",
15
- "colorField": "groupBy",{{else}}
16
- "xField": "groupBy",
17
- "yField": "value",{{/ifEquals}}
18
- },{{/if}}
19
- };
20
- {{/each}}
21
7
 
22
8
  return (
23
9
  <section className="{{kebabCase route.name}}-page">
24
10
  {{#if route.tiles}}
25
- <rapid-layout auto-save-key="{{route.layoutKey}}">
11
+ <rapid-layout auto-save-key={process.env.NODE_ENV === 'production' ? "{{route.layoutKey}}" : null}>
26
12
  {{> (lookup ./route 'layoutType') }}
27
13
  </rapid-layout>
28
14
  {{else}}
@@ -34,6 +34,9 @@ ${whenElse(
34
34
  {{#if config.reqrep}}
35
35
  :datasourceConfig=${() => ({pollingInterval: 5000 })}
36
36
  {{/if}}
37
+ {{#if config.entityName}}
38
+ entityLabel="{{ config.entityName }}"
39
+ {{/if}}
37
40
  {{#if config.columns}}
38
41
  :columns=${() => columnDefs }
39
42
  {{/if}}
@@ -37,7 +37,7 @@ const formatRouteData = (framework, route) => {
37
37
  ...config,
38
38
  index,
39
39
  gridOptions: gridOptionsSerializer(gridOptions),
40
- useOnlyTemplateCols: !!gridOptions?.columnDefs,
40
+ useOnlyTemplateCols: !!gridOptions?.columns,
41
41
  createFormUiSchema: formatJSONValue(createFormUiSchema),
42
42
  updateFormUiSchema: formatJSONValue(updateFormUiSchema),
43
43
  uischema: formatJSONValue(uischema),
@@ -44,6 +44,7 @@ const getPathByFramework = {
44
44
  },
45
45
  [FRAMEWORK_REACT_ALIAS]: {
46
46
  ...defaultPathGetters,
47
+ index: (componentPath) => `${componentPath}/index.jsx`,
47
48
  clientSrcPath: `../../client/src/pages`,
48
49
  route: (clientSrcPath, tile, routeName) =>
49
50
  `${clientSrcPath}/${routeName}/${tile.name}-${tile.componentType}`,
@@ -1,5 +1,5 @@
1
1
  {
2
- "UI": "14.200.0",
3
- "GSF": "8.2.4",
4
- "Auth": "8.2.1"
2
+ "UI": "14.206.1",
3
+ "GSF": "8.3.0-beta5",
4
+ "Auth": "8.3.0-beta5"
5
5
  }
@@ -36,7 +36,7 @@ rm -rf blankappseedtest && npx -y @genesislcap/genx@latest init blankappseedtest
36
36
  ### Route and CSV parameter handling test
37
37
 
38
38
  ```
39
- rm -rf blankappseedtest && npx -y @genesislcap/genx@latest init blankappseedtest --ref %YOUR-BRANCH-NAME% --no-npm -x --routes '[{"name":"Home","tiles":[{"title":"Entity manager","type":"entity-manager","config":{ "modalPosition": "centre", "sizeColumnsToFit": true, "enableSearchBar": true, "resourceName":"ALL_POSITIONS","title":"My Positions","updateEvent":"EVENT_COUNTERPARTY_MODIFY","deleteEvent":"EVENT_COUNTERPARTY_DELETE","createEvent":"EVENT_COUNTERPARTY_INSERT", "createFormUiSchema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline create schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]}, "updateFormUiSchema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline update schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]}, "columns": [{"field":"INSTRUMENT_NAME","headerName":"Instrument Name"},{"field":"VALUE","headerName":"Inline coldef - VALUE"},{"field":"QUANTITY","headerName":"Quantity"},{"field":"PNL","headerName":"PNL"}] }},{"title":"Grid","type":"grid-pro","config":{"resourceName":"ALL_TRADES", "gridOptions": {"columnDefs":[{"field":"INSTRUMENT_NAME","headerName":"Instrument Name"},{"field":"VALUE","headerName":"Inline coldef - VALUE"},{"field":"QUANTITY","headerName":"Quantity"},{"field":"PNL","headerName":"PNL"}]} }},{"title":"Form","type":"smart-form","config":{"resourceName":"EVENT_COUNTERPARTY_INSERT", "uischema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline form schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]} }}]}, {"name":"Realtime Dashboard","tiles":[{"title":"Entity manager tile","type":"entity-manager","config":{"resourceName":"ALL_COUNTERPARTYS","title":"Counterparty Management","updateEvent":"EVENT_COUNTERPARTY_MODIFY","deleteEvent":"EVENT_COUNTERPARTY_DELETE","createEvent":"EVENT_COUNTERPARTY_INSERT"}},{"title":"Form tile","type":"smart-form","config":{"resourceName":"EVENT_COUNTERPARTY_INSERT"}}]},{"name":"Analytics","tiles":[{"title":"Grid Tile","type":"grid-pro","config":{"resourceName":"ALL_POSITIONS"}},{"title":"Charts Tile 1","type":"chart","config":{"type":"line","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_NAME","yField":"VALUE"}},{"title":"Charts Tile 2","type":"chart","config":{"type":"pie","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_NAME","yField":"VALUE"}},{"title":"Charts Tile 3","type":"chart","config":{"type":"column","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_ID","yField":"VALUE"}}]}]' --csv '[{"name": "trade", "fields": ["a", "B"]}, {"name": "position", "fields": ["id", "TYPE"]} ]' --apiHost 'wss://public-foundation.genesislab.global/gwf/' --no-shell && cd blankappseedtest/client && npm run bootstrap && npm run dev
39
+ rm -rf blankappseedtest && npx -y @genesislcap/genx@latest init blankappseedtest --ref %YOUR-BRANCH-NAME% --no-npm -x --routes '[{"name":"Home","tiles":[{"title":"Entity manager","type":"entity-manager","config":{ "modalPosition": "centre", "sizeColumnsToFit": true, "enableSearchBar": true, "resourceName":"ALL_POSITIONS","title":"My Positions","updateEvent":"EVENT_COUNTERPARTY_MODIFY","deleteEvent":"EVENT_COUNTERPARTY_DELETE","createEvent":"EVENT_COUNTERPARTY_INSERT", "createFormUiSchema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline create schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]}, "updateFormUiSchema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline update schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]}, "columns": [{"field":"INSTRUMENT_NAME","headerName":"Instrument Name"},{"field":"VALUE","headerName":"Inline coldef - VALUE"},{"field":"QUANTITY","headerName":"Quantity"},{"field":"PNL","headerName":"PNL"}] }},{"title":"Grid","type":"grid-pro","config":{"resourceName":"ALL_TRADES", "gridOptions": {"columns":[{"field":"INSTRUMENT_NAME","headerName":"Instrument Name"},{"field":"VALUE","headerName":"Inline coldef - VALUE"},{"field":"QUANTITY","headerName":"Quantity"},{"field":"PNL","headerName":"PNL"}]} }},{"title":"Form","type":"smart-form","config":{"resourceName":"EVENT_COUNTERPARTY_INSERT", "uischema": {"type":"VerticalLayout","elements":[{"type":"Control","label":"Inline form schema - main contact","scope":"#/properties/MAIN_CONTACT"},{"type":"Control","label":"Issuer Name - Local Schema","scope":"#/properties/ISSUER_NAME","options":{"readonly":true}},{"type":"Control","label":"Price","scope":"#/properties/PRICE"},{"type":"Control","scope":"#/properties/COUNTERPARTY","options":{"allOptionsResourceName":"ALL_COUNTERPARTYS","valueField":"COUNTERPARTY_ID","labelField":"COUNTERPARTY_ID"}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"isPassword":true}},{"type":"Control","label":"Password","scope":"#/properties/PASSWORD","options":{"textarea":true}}]} }}]}, {"name":"Realtime Dashboard","tiles":[{"title":"Entity manager tile","type":"entity-manager","config":{"resourceName":"ALL_COUNTERPARTYS","title":"Counterparty Management","updateEvent":"EVENT_COUNTERPARTY_MODIFY","deleteEvent":"EVENT_COUNTERPARTY_DELETE","createEvent":"EVENT_COUNTERPARTY_INSERT"}},{"title":"Form tile","type":"smart-form","config":{"resourceName":"EVENT_COUNTERPARTY_INSERT"}}]},{"name":"Analytics","tiles":[{"title":"Grid Tile","type":"grid-pro","config":{"resourceName":"ALL_POSITIONS"}},{"title":"Charts Tile 1","type":"chart","config":{"type":"line","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_NAME","yField":"VALUE"}},{"title":"Charts Tile 2","type":"chart","config":{"type":"pie","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_NAME","yField":"VALUE"}},{"title":"Charts Tile 3","type":"chart","config":{"type":"column","resourceName":"ALL_POSITIONS","xField":"INSTRUMENT_ID","yField":"VALUE"}}]}]' --csv '[{"name": "trade", "fields": ["a", "B"]}, {"name": "position", "fields": ["id", "TYPE"]} ]' --apiHost 'wss://public-foundation.genesislab.global/gwf/' --no-shell && cd blankappseedtest/client && npm run bootstrap && npm run dev
40
40
  ```
41
41
 
42
42
  ✅ &nbsp; **Checklist**
@@ -15,6 +15,7 @@ jobs:
15
15
  genesisArtifactoryUser: ${{ secrets.JFROG_LIBS_RELEASE_CLIENT_RO_USER }}
16
16
  genesisArtifactoryPassword: ${{ secrets.JFROG_LIBS_RELEASE_CLIENT_RO_KEY }}
17
17
  USE_DOCKER: 1
18
+ GRADLE_PARAMS: ${{ github.base_ref == 'prerelease' && '-PuseDevRepo=true' || '' }}
18
19
  runs-on: ubuntu-latest
19
20
  steps:
20
21
  - uses: actions/checkout@v4
@@ -46,7 +47,7 @@ jobs:
46
47
 
47
48
  - name: Build sample app
48
49
  working-directory: /tmp/testapp
49
- run: ./gradlew build --info
50
+ run: ./gradlew ${GRADLE_PARAMS} build --info
50
51
 
51
52
  - name: Lint UI
52
53
  working-directory: /tmp/testapp/client
@@ -62,7 +63,7 @@ jobs:
62
63
 
63
64
  - name: Create Server Dockerfile
64
65
  working-directory: /tmp/testapp
65
- run: ./gradlew :server:testapp-app:createDockerfile --info
66
+ run: ./gradlew ${GRADLE_PARAMS} :server:testapp-app:createDockerfile --info
66
67
 
67
68
  - name: Build Docker images
68
69
  working-directory: /tmp/testapp
@@ -1,6 +1,7 @@
1
1
  name: Release
2
2
 
3
3
  on:
4
+ workflow_dispatch:
4
5
  push:
5
6
  branches: [main, prerelease]
6
7
 
@@ -2,7 +2,7 @@ name: Slack PR notification
2
2
 
3
3
  on:
4
4
  pull_request:
5
- branches: [main]
5
+ branches: [main, prerelease]
6
6
  types: [opened, reopened]
7
7
 
8
8
  jobs:
@@ -11,6 +11,10 @@ on:
11
11
  type: boolean
12
12
  required: false
13
13
  description: Only update if there are newer patch versions
14
+ skip-server:
15
+ type: boolean
16
+ required: false
17
+ description: Skip updating server dependencies
14
18
  secrets:
15
19
  GH_USER_TOKEN:
16
20
  required: true
@@ -26,6 +30,7 @@ jobs:
26
30
  env:
27
31
  BRANCH: ${{ inputs.branch }}
28
32
  PATCH_ARG: ${{ inputs.patch-only && '--patch-only' || '' }}
33
+ SKIP_SERVER_ARG: ${{ inputs.skip-server && '--skip-server' || '' }}
29
34
  steps:
30
35
  - uses: actions/checkout@v4
31
36
  with:
@@ -47,7 +52,7 @@ jobs:
47
52
  jfrog config add --artifactory-url="https://genesisglobal.jfrog.io/artifactory" --user="${{ secrets.JFROG_LIBS_RELEASE_CLIENT_RO_USER }}" --password="${{ secrets.JFROG_LIBS_RELEASE_CLIENT_RO_KEY }}" --interactive=false
48
53
 
49
54
  - name: Update to latest versions if available
50
- run: node .genx/scripts/update-versions ${PATCH_ARG}
55
+ run: node .genx/scripts/update-versions ${PATCH_ARG} ${SKIP_SERVER_ARG}
51
56
 
52
57
  - name: Check for changes
53
58
  id: versions
@@ -82,8 +87,8 @@ jobs:
82
87
  repo = process.env.REPO,
83
88
  title = 'fix: automated dependency version update [skip-ci] PSD-9',
84
89
  body = 'Automated PR',
85
- head = 'chore-dep-update',
86
- base = 'main';
90
+ head = 'chore-dep-update-${{inputs.branch}}',
91
+ base = '${{inputs.branch}}';
87
92
 
88
93
  (async () => {
89
94
  const response = await octokit.request(
@@ -12,6 +12,7 @@ jobs:
12
12
  uses: ./.github/workflows/upgrade.yml
13
13
  with:
14
14
  branch: prerelease
15
+ skip-server: true
15
16
  secrets:
16
17
  GH_USER_TOKEN: ${{ secrets.GH_USER_TOKEN }}
17
18
  JFROG_LIBS_RELEASE_CLIENT_RO_USER: ${{ secrets.JFROG_LIBS_RELEASE_CLIENT_RO_USER }}