@genesislcap/blank-app-seed 5.22.1 → 5.23.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.
Files changed (191) hide show
  1. package/.genx/configure.js +11 -1
  2. package/.genx/package.json +1 -1
  3. package/.genx/scripts/generate-test-apps.sh +124 -0
  4. package/.genx/templates/angular/chart.hbs +19 -7
  5. package/.genx/templates/angular/component/component.column.defs.hbs +16 -4
  6. package/.genx/templates/angular/component/component.create.form.hbs +10 -2
  7. package/.genx/templates/angular/component/component.events.config.hbs +31 -6
  8. package/.genx/templates/angular/component/component.filter.form.hbs +1 -2
  9. package/.genx/templates/angular/component/component.gridOptions.hbs +15 -3
  10. package/.genx/templates/angular/component/component.hbs +77 -46
  11. package/.genx/templates/angular/component/component.index.hbs +1 -1
  12. package/.genx/templates/angular/component/component.update.form.hbs +1 -1
  13. package/.genx/templates/angular/entityManager.hbs +6 -6
  14. package/{client-tmp/angular/src/app/utils/fdc3.ts → .genx/templates/angular/fdc3.ts.hbs} +6 -8
  15. package/.genx/templates/angular/form.hbs +9 -12
  16. package/.genx/templates/angular/grid.hbs +43 -40
  17. package/.genx/templates/angular/route.hbs +8 -2
  18. package/.genx/templates/angular/route.template.hbs +7 -7
  19. package/.genx/templates/angular/slices/eventing.slice.hbs +21 -10
  20. package/.genx/templates/angular/store.hbs +1 -5
  21. package/.genx/templates/angular/tabsPanel.hbs +2 -2
  22. package/.genx/templates/react/chart.hbs +6 -15
  23. package/.genx/templates/react/component/component.column.defs.hbs +16 -10
  24. package/.genx/templates/react/component/component.create.form.hbs +2 -2
  25. package/.genx/templates/react/component/component.events.config.hbs +32 -5
  26. package/.genx/templates/react/component/component.filter.form.hbs +1 -2
  27. package/.genx/templates/react/component/component.gridOptions.hbs +17 -11
  28. package/.genx/templates/react/component/component.hbs +84 -42
  29. package/.genx/templates/react/component/component.update.form.hbs +1 -1
  30. package/.genx/templates/react/entityManager.hbs +8 -16
  31. package/{client-tmp/react/src/utils/fdc3.ts → .genx/templates/react/fdc3.ts.hbs} +7 -8
  32. package/.genx/templates/react/form.hbs +1 -15
  33. package/.genx/templates/react/grid.hbs +11 -11
  34. package/.genx/templates/react/gridLayout.hbs +44 -4
  35. package/.genx/templates/react/horizontalLayout.hbs +10 -1
  36. package/.genx/templates/react/route.hbs +21 -14
  37. package/.genx/templates/react/slices/eventing.slice.hbs +19 -8
  38. package/.genx/templates/react/store.hbs +1 -5
  39. package/.genx/templates/react/tabsLayout.hbs +5 -1
  40. package/.genx/templates/web-components/chart.hbs +25 -25
  41. package/.genx/templates/web-components/component/component.column.defs.hbs +11 -3
  42. package/.genx/templates/web-components/component/component.create.form.hbs +11 -4
  43. package/.genx/templates/web-components/component/component.events.config.hbs +33 -6
  44. package/.genx/templates/web-components/component/component.filter.form.hbs +1 -2
  45. package/.genx/templates/web-components/component/component.gridOptions.hbs +12 -3
  46. package/.genx/templates/web-components/component/component.hbs +19 -20
  47. package/.genx/templates/web-components/component/component.index.hbs +1 -1
  48. package/.genx/templates/web-components/component/component.template.hbs +9 -13
  49. package/.genx/templates/web-components/component/component.update.form.hbs +1 -1
  50. package/.genx/templates/web-components/entityManager.hbs +92 -73
  51. package/{client-tmp/web-components/src/utils/fdc3.ts → .genx/templates/web-components/fdc3.ts.hbs} +6 -7
  52. package/.genx/templates/web-components/form.hbs +16 -15
  53. package/.genx/templates/web-components/grid.hbs +49 -41
  54. package/.genx/templates/web-components/gridLayout.hbs +32 -28
  55. package/.genx/templates/web-components/horizontalLayout.hbs +5 -5
  56. package/.genx/templates/web-components/route.template.hbs +4 -6
  57. package/.genx/templates/web-components/slices/eventing.slice.hbs +23 -15
  58. package/.genx/templates/web-components/store.hbs +1 -9
  59. package/.genx/templates/web-components/tabsLayout.hbs +5 -5
  60. package/.genx/tests/fixtures/routes-full.json +299 -0
  61. package/.genx/tests/fixtures/testapp/client/src/pages/Home/Home.tsx +12 -0
  62. package/.genx/utils/formatJSONValue.js +38 -2
  63. package/.genx/utils/formatRouteData.js +67 -18
  64. package/.genx/utils/generateTile.js +10 -1
  65. package/.genx/utils/gridSerializers.js +63 -23
  66. package/.genx/utils/registerPartials.js +15 -12
  67. package/.genx/utils/toJsStringLiteral.js +37 -0
  68. package/.github/workflows/build.yml +22 -1
  69. package/.github/workflows/release.yaml +96 -0
  70. package/.husky/pre-commit +8 -0
  71. package/.releaserc +1 -1
  72. package/CHANGELOG.md +23 -0
  73. package/client-tmp/angular/.oxfmtrc.json +32 -0
  74. package/client-tmp/angular/.oxlintrc.json +4 -0
  75. package/client-tmp/angular/README.md +4 -4
  76. package/client-tmp/angular/jest.config.js +1 -1
  77. package/client-tmp/angular/lint-css.js +24 -3
  78. package/client-tmp/angular/oxlint-staged.js +45 -0
  79. package/client-tmp/angular/package.json +19 -9
  80. package/client-tmp/angular/playwright.config.ts +12 -11
  81. package/client-tmp/angular/src/app/app.component.html +0 -1
  82. package/client-tmp/angular/src/app/app.component.ts +8 -9
  83. package/client-tmp/angular/src/app/app.config.ts +2 -2
  84. package/client-tmp/angular/src/app/app.module.ts +6 -5
  85. package/client-tmp/angular/src/app/components/error-message/error-message.component.html +29 -15
  86. package/client-tmp/angular/src/app/components/error-message/error-message.component.spec.ts +2 -2
  87. package/client-tmp/angular/src/app/components/error-message/error-message.component.ts +3 -5
  88. package/client-tmp/angular/src/app/directive/app-lazy-load.directive.ts +1 -0
  89. package/client-tmp/angular/src/app/guards/chained.guard.ts +19 -19
  90. package/client-tmp/angular/src/app/guards/connection.guard.ts +12 -12
  91. package/client-tmp/angular/src/app/layouts/blank/blank.layout.spec.ts +1 -1
  92. package/client-tmp/angular/src/app/layouts/blank/blank.layout.ts +1 -5
  93. package/client-tmp/angular/src/app/layouts/default/default.layout.html +3 -4
  94. package/client-tmp/angular/src/app/layouts/default/default.layout.spec.ts +4 -4
  95. package/client-tmp/angular/src/app/layouts/default/default.layout.ts +1 -1
  96. package/client-tmp/angular/src/app/pages/auth-login/auth-login.component.ts +1 -2
  97. package/client-tmp/angular/src/app/pages/not-permitted/not-permitted.component.html +3 -3
  98. package/client-tmp/angular/src/app/pages/not-permitted/not-permitted.component.scss +1 -1
  99. package/client-tmp/angular/src/app/pages/not-permitted/not-permitted.component.spec.ts +5 -5
  100. package/client-tmp/angular/src/app/pages/not-permitted/not-permitted.component.ts +3 -4
  101. package/client-tmp/angular/src/app/services/route.service.ts +79 -74
  102. package/client-tmp/angular/src/app/share/foundation-auth.ts +7 -1
  103. package/client-tmp/angular/src/app/share/genesis-components.ts +66 -68
  104. package/client-tmp/angular/src/app/utils/index.ts +3 -1
  105. package/client-tmp/angular/src/app/utils/permissions.ts +7 -7
  106. package/client-tmp/angular/src/declaration.d.ts +1 -1
  107. package/client-tmp/angular/src/environments/environment.ts +1 -1
  108. package/client-tmp/angular/src/jest.setup.ts +8 -0
  109. package/client-tmp/angular/src/main.ts +2 -2
  110. package/client-tmp/angular/src/pbc/container.ts +28 -26
  111. package/client-tmp/angular/src/pbc/elementsRenderer.ts +49 -39
  112. package/client-tmp/angular/src/pbc/utils.ts +61 -60
  113. package/client-tmp/angular/src/styles/_mixins.scss +7 -8
  114. package/client-tmp/angular/src/styles/styles.css +6 -6
  115. package/client-tmp/angular/test/e2e/fixture.ts +2 -2
  116. package/client-tmp/angular/test/e2e/flows/001-protected.e2e.ts +1 -1
  117. package/client-tmp/angular/tsconfig.app.json +2 -8
  118. package/client-tmp/angular/tsconfig.json +1 -4
  119. package/client-tmp/angular/tsconfig.spec.json +4 -11
  120. package/client-tmp/angular/webpack.dev.config.js +3 -4
  121. package/client-tmp/angular/webpack.prod.config.js +3 -4
  122. package/client-tmp/angular/webpack.shared.config.js +20 -24
  123. package/client-tmp/react/.oxfmtrc.json +30 -0
  124. package/client-tmp/react/.oxlintrc.json +4 -0
  125. package/client-tmp/react/README.md +4 -4
  126. package/client-tmp/react/jest.config.ts +8 -4
  127. package/client-tmp/react/jest.setup.ts +85 -1
  128. package/client-tmp/react/oxlint-staged.js +45 -0
  129. package/client-tmp/react/package.json +24 -9
  130. package/client-tmp/react/playwright.config.ts +11 -10
  131. package/client-tmp/react/src/App.tsx +27 -29
  132. package/client-tmp/react/src/__mocks__/fileMock.js +1 -0
  133. package/client-tmp/react/src/components/ErrorMessage/ErrorMessage.test.tsx +16 -4
  134. package/client-tmp/react/src/components/ErrorMessage/ErrorMessage.tsx +32 -29
  135. package/client-tmp/react/src/components/error-boundary/ErrorBoundary.tsx +15 -6
  136. package/client-tmp/react/src/components/routes/AppRoutes.tsx +1 -1
  137. package/client-tmp/react/src/components/single-component/registry.ts +4 -0
  138. package/client-tmp/react/src/custom-elements.d.ts +4 -2
  139. package/client-tmp/react/src/helpers/hasPermissionHelper.tsx +1 -1
  140. package/client-tmp/react/src/helpers/isAuthenticatedHelper.tsx +1 -1
  141. package/client-tmp/react/src/helpers/isConnectedHelper.tsx +3 -3
  142. package/client-tmp/react/src/layouts/blank/BlankLayout.tsx +7 -11
  143. package/client-tmp/react/src/layouts/default/DefaultLayout.tsx +8 -8
  144. package/client-tmp/react/src/main.tsx +11 -11
  145. package/client-tmp/react/src/pages/AuthPage/AuthPage.test.tsx +13 -2
  146. package/client-tmp/react/src/pages/AuthPage/AuthPage.tsx +14 -13
  147. package/client-tmp/react/src/pages/NotFoundPage/NotFoundPage.tsx +2 -7
  148. package/client-tmp/react/src/pages/NotPermittedPage/NotPermittedPage.test.tsx +8 -4
  149. package/client-tmp/react/src/pages/NotPermittedPage/NotPermittedPage.tsx +1 -1
  150. package/client-tmp/react/src/pbc/container.tsx +9 -4
  151. package/client-tmp/react/src/pbc/elementsRenderer.tsx +13 -7
  152. package/client-tmp/react/src/pbc/utils.ts +60 -59
  153. package/client-tmp/react/src/services/auth.service.ts +1 -1
  154. package/client-tmp/react/src/services/store.service.ts +5 -3
  155. package/client-tmp/react/src/share/foundation-login.ts +2 -2
  156. package/client-tmp/react/src/share/genesis-components.ts +46 -47
  157. package/client-tmp/react/src/store/AuthContext.tsx +2 -10
  158. package/client-tmp/react/src/store/RoutesContext.test.tsx +99 -0
  159. package/client-tmp/react/src/store/RoutesContext.tsx +25 -5
  160. package/client-tmp/react/src/styles/styles.css +7 -7
  161. package/client-tmp/react/src/types/LayoutName.ts +1 -1
  162. package/client-tmp/react/src/utils/getLayoutNameByRoute.ts +1 -1
  163. package/client-tmp/react/src/utils/index.ts +2 -0
  164. package/client-tmp/react/src/utils/layout.ts +8 -1
  165. package/client-tmp/react/src/utils/permissions.ts +7 -7
  166. package/client-tmp/react/src/utils/useDocumentTitle.ts +5 -6
  167. package/client-tmp/react/test/e2e/fixture.ts +5 -2
  168. package/client-tmp/react/test/e2e/flows/001-protected.e2e.ts +3 -1
  169. package/client-tmp/react/tsconfig.app.json +1 -1
  170. package/client-tmp/react/tsconfig.json +1 -5
  171. package/client-tmp/web-components/.oxfmtrc.json +30 -0
  172. package/client-tmp/web-components/.oxlintrc.json +4 -0
  173. package/client-tmp/web-components/oxlint-staged.js +45 -0
  174. package/client-tmp/web-components/package.json +14 -22
  175. package/client-tmp/web-components/src/components/components.ts +9 -7
  176. package/client-tmp/web-components/src/main/main.css +1 -2
  177. package/client-tmp/web-components/src/main/main.ts +1 -1
  178. package/client-tmp/web-components/src/routes/config.ts +4 -0
  179. package/client-tmp/web-components/src/utils/index.ts +2 -0
  180. package/client-tmp/web-components/tsconfig.json +1 -4
  181. package/package.json +1 -1
  182. package/.genx/templates/angular/gridLayout.hbs +0 -30
  183. package/.genx/templates/angular/horizontalLayout.hbs +0 -7
  184. package/.genx/templates/angular/tabsLayout.hbs +0 -7
  185. package/.genx/tests/fixtures/testapp/client/src/routes/home/home.template.ts +0 -6
  186. package/.github/workflows/release.yml +0 -50
  187. package/client-tmp/react/.babelrc +0 -10
  188. package/client-tmp/react/.eslintrc.cjs +0 -21
  189. package/client-tmp/react/git +0 -0
  190. package/client-tmp/react/webpack.config.js +0 -121
  191. package/client-tmp/web-components/.prettierignore +0 -14
@@ -60,7 +60,7 @@ module.exports = async (data, utils) => {
60
60
  if (!fs.existsSync(templateDir)) {
61
61
  fs.mkdirSync(templateDir, { recursive: true });
62
62
  }
63
- fs.writeFileSync(templateFile, jsonContent);
63
+ fs.writeFileSync(templateFile, `${jsonContent}\n`);
64
64
  } catch (err) {
65
65
  console.warn('Failed to write designTokens to template:', err?.message || err);
66
66
  }
@@ -153,6 +153,16 @@ module.exports = async (data, utils) => {
153
153
 
154
154
  excludeFrameworks(data.framework);
155
155
 
156
+ if (data.FDC3.includeDependencies) {
157
+ const frameworkDir = FRAMEWORKS_DIR_MAP.get(data.framework);
158
+ const utilsDir = frameworkDir === 'angular' ? 'src/app/utils' : 'src/utils';
159
+ utils.writeFileWithData(
160
+ path.resolve(__dirname, `../client/${utilsDir}/fdc3.ts`),
161
+ data,
162
+ path.resolve(__dirname, `templates/${frameworkDir}/fdc3.ts.hbs`),
163
+ );
164
+ }
165
+
156
166
  generateStore(data.routes, utils, data.framework);
157
167
 
158
168
  data.routes.forEach((route) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@genesislcap/blank-app-seed-config",
3
3
  "description": "Genesis Blank App Seed Configuration",
4
- "version": "5.22.1",
4
+ "version": "5.23.0",
5
5
  "license": "Apache-2.0",
6
6
  "scripts": {
7
7
  "lint": "eslint .",
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # Generate test apps from this seed and verify they are lint-clean out of the box.
4
+ #
5
+ # For each requested framework this generates three apps — the defaults app (no
6
+ # routes), a "full" app driven by .genx/tests/fixtures/routes-full.json
7
+ # (every tile type: entity-manager with permissions/custom events/eventing/FDC3,
8
+ # grid-pro with listener/reqrep, chart, smart-form), and an "fdc3" app with
9
+ # FDC3 channels enabled — then runs the ox lint pipeline with zero tolerance:
10
+ #
11
+ # oxlint . --deny-warnings # zero errors, zero warnings
12
+ # oxfmt --check . # formatting is already canonical
13
+ # npm run lint # genx lint -l ox (Oxlint -> Oxfmt -> Stylelint)
14
+ #
15
+ # Usage:
16
+ # .genx/scripts/generate-test-apps.sh [framework...]
17
+ #
18
+ # framework: react | webcomponents | angular (default: all three)
19
+ #
20
+ # Env:
21
+ # WORK_DIR scratch dir for generated apps (default: a fresh mktemp dir).
22
+ # A caller-supplied WORK_DIR is never deleted by this script.
23
+ # KEEP=1 keep each generated app (and the scratch dir) for inspection.
24
+ # By default an app is deleted as soon as it passes, so a run only
25
+ # ever holds one app's node_modules at a time. Failing apps are
26
+ # always kept.
27
+ # BUILD=1 additionally run `npx tsc --noEmit` and `npm run build` per app
28
+ #
29
+ # Installs use the app's own bootstrap semantics (plain `npm install`) — NOT
30
+ # --legacy-peer-deps, which would skip the ag-grid peer deps and break builds.
31
+
32
+ set -uo pipefail
33
+
34
+ SEED_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
35
+ FIXTURE="$SEED_DIR/.genx/tests/fixtures/routes-full.json"
36
+
37
+ if [ $# -gt 0 ]; then
38
+ FRAMEWORKS=("$@")
39
+ else
40
+ FRAMEWORKS=(react webcomponents angular)
41
+ fi
42
+
43
+ # `mktemp -d -t <name>` is BSD-only; spell the template out so this works on GNU
44
+ # coreutils too. Bail out rather than carry on with an empty WORK_DIR, which would
45
+ # turn the `rm -rf` calls below into absolute paths.
46
+ OWNS_WORK_DIR=0
47
+ if [ -z "${WORK_DIR:-}" ]; then
48
+ WORK_DIR="$(mktemp -d "${TMPDIR:-/tmp}/blank-app-seed-lint.XXXXXXXX")" || exit 1
49
+ OWNS_WORK_DIR=1
50
+ fi
51
+ if [ -z "$WORK_DIR" ] || [ ! -d "$WORK_DIR" ]; then
52
+ echo "Could not create or resolve WORK_DIR ('${WORK_DIR}')" >&2
53
+ exit 1
54
+ fi
55
+
56
+ FAILURES=()
57
+
58
+ run_lint_checks() {
59
+ local app_dir="$1" label="$2"
60
+ (
61
+ cd "$app_dir/client" || exit 1
62
+ echo "--- [$label] npm install"
63
+ npm install --no-fund --no-audit || exit 1
64
+ echo "--- [$label] oxlint . --deny-warnings"
65
+ ./node_modules/.bin/oxlint . --deny-warnings || exit 1
66
+ echo "--- [$label] oxfmt --check ."
67
+ ./node_modules/.bin/oxfmt --check . || exit 1
68
+ echo "--- [$label] npm run lint"
69
+ npm run lint || exit 1
70
+ if [ "${BUILD:-0}" = "1" ]; then
71
+ echo "--- [$label] tsc --noEmit"
72
+ npx tsc --noEmit || exit 1
73
+ echo "--- [$label] npm run build"
74
+ npm run build || exit 1
75
+ fi
76
+ )
77
+ }
78
+
79
+ for fw in "${FRAMEWORKS[@]}"; do
80
+ for variant in default full fdc3; do
81
+ label="$fw-$variant"
82
+ app_dir="$WORK_DIR/$label"
83
+ rm -rf "$app_dir"
84
+ echo "=== Generating $label into $app_dir"
85
+ extra_args=()
86
+ if [ "$variant" = "full" ]; then
87
+ extra_args=(--routes "$(cat "$FIXTURE")")
88
+ fi
89
+ if [ "$variant" = "fdc3" ]; then
90
+ extra_args=(--ui '{"fdc3":{"channels":[{"name":"positions","type":"position"},{"name":"instrumentChannel","type":"fdc3.instrument"}]}}')
91
+ fi
92
+ (
93
+ cd "$WORK_DIR" || exit 1
94
+ # `"${extra_args[@]}"` alone is an unbound-variable error on an empty array
95
+ # under `set -u` in bash 3.2 (the macOS system bash).
96
+ npx -y @genesislcap/genx@latest init "$label" -s "$SEED_DIR" -x --no-shell \
97
+ --framework "$fw" --apiHost 'wss://localhost/gwf/' \
98
+ ${extra_args[@]+"${extra_args[@]}"}
99
+ ) || { FAILURES+=("$label: generation failed"); continue; }
100
+ if run_lint_checks "$app_dir" "$label"; then
101
+ # Reclaim the app's node_modules straight away — CI runners are disk-tight and
102
+ # each generated app installs well over a gigabyte.
103
+ [ "${KEEP:-0}" = "1" ] || rm -rf "$app_dir"
104
+ else
105
+ FAILURES+=("$label: lint checks failed")
106
+ fi
107
+ done
108
+ done
109
+
110
+ echo
111
+ if [ ${#FAILURES[@]} -gt 0 ]; then
112
+ echo "FAILED:"
113
+ printf ' - %s\n' "${FAILURES[@]}"
114
+ echo "Generated apps kept in $WORK_DIR for inspection"
115
+ exit 1
116
+ fi
117
+
118
+ echo "All generated apps are lint-clean: ${FRAMEWORKS[*]} (default + full + fdc3)"
119
+ if [ "${KEEP:-0}" = "1" ]; then
120
+ echo "Generated apps kept in $WORK_DIR"
121
+ elif [ "$OWNS_WORK_DIR" = "1" ]; then
122
+ # Only ever remove a scratch dir this script created.
123
+ rm -rf "$WORK_DIR"
124
+ fi
@@ -1,8 +1,10 @@
1
- <rapid-g2plot-chart
1
+ {{#if config.permissions.viewRight}}<rapid-g2plot-chart
2
2
  type="{{ config.type }}"
3
- [config]="chartConfig"{{#if config.permissions.viewRight}}
4
- [ngStyle]="hasUserPermission('{{config.permissions.viewRight}}') ? { width: '100%', height: '100%' } : { display: 'none' }"{{/if}}
5
- >
3
+ [config]="chartConfig"
4
+ [ngStyle]="
5
+ hasUserPermission('{{config.permissions.viewRight}}') ? { width: '100%', height: '100%' } : { display: 'none' }
6
+ "
7
+ >{{else}}<rapid-g2plot-chart type="{{ config.type }}" [config]="chartConfig">{{/if}}
6
8
  <chart-datasource
7
9
  resourceName="{{ config.resourceName }}"
8
10
  server-fields="{{ config.xField }} {{ config.yField }}"
@@ -10,7 +12,17 @@
10
12
  </rapid-g2plot-chart>{{#if config.permissions.viewRight}}
11
13
 
12
14
  <app-error-message
13
- [ngStyle]="!hasUserPermission('{{config.permissions.viewRight}}') ? { width: '100%', height: '100%', display: 'flex', 'justify-content': 'center', 'align-items': 'center' } : { display: 'none' }"
15
+ [ngStyle]="
16
+ !hasUserPermission('{{config.permissions.viewRight}}')
17
+ ? {
18
+ width: '100%',
19
+ height: '100%',
20
+ display: 'flex',
21
+ 'justify-content': 'center',
22
+ 'align-items': 'center',
23
+ }
24
+ : { display: 'none' }
25
+ "
14
26
  elementType="h3"
15
- message="You do not have access to view this component.">
16
- </app-error-message>{{/if}}
27
+ message="You do not have access to view this component."
28
+ ></app-error-message>{{/if}}
@@ -1,9 +1,21 @@
1
- import { ColDef } from '@ag-grid-community/core';
2
- import { getNumberFormatter, getDateFormatter } from '@genesislcap/foundation-utils';
1
+ import type { ColDef } from '@ag-grid-community/core';
2
+ {{#ifContains tile.config.columns 'getDateFormatter'}}
3
+ {{#ifContains tile.config.columns 'getNumberFormatter'}}
4
+ import { getDateFormatter, getNumberFormatter } from '@genesislcap/foundation-utils';
5
+ {{else}}
6
+ import { getDateFormatter } from '@genesislcap/foundation-utils';
7
+ {{/ifContains}}
8
+ {{else}}
9
+ {{#ifContains tile.config.columns 'getNumberFormatter'}}
10
+ import { getNumberFormatter } from '@genesislcap/foundation-utils';
11
+ {{/ifContains}}
12
+ {{/ifContains}}
3
13
  {{#if route.FDC3EventHandlersEnabled}}
4
- import { sendEventOnChannel } from '../../../utils';
14
+ {{#ifContains tile.config.columns 'sendEventOnChannel'}}
15
+ import { sendEventOnChannel } from '../../../utils';
16
+ {{/ifContains}}
5
17
  {{/if}}
6
18
 
7
19
  {{#if tile.config.columns}}
8
- export const columnDefs: ColDef[] = {{{ tile.config.columns }}}
20
+ export const columnDefs: ColDef[] = {{{ tile.config.columns }}};
9
21
  {{/if}}
@@ -1,8 +1,16 @@
1
+ {{#ifAny tile.config.createFormUiSchema tile.config.uischema}}
1
2
  import { UiSchema } from '@genesislcap/foundation-forms';
2
3
 
3
4
  {{#if tile.config.createFormUiSchema}}
4
- export const createFormSchema: UiSchema = {{{ tile.config.createFormUiSchema }}}
5
+ export const createFormSchema: UiSchema = {{{ tile.config.createFormUiSchema }}};
5
6
  {{/if}}
6
7
  {{#if tile.config.uischema}}
7
- export const createFormSchema: UiSchema = {{{ tile.config.uischema }}}
8
+ export const createFormSchema: UiSchema = {{{ tile.config.uischema }}};
8
9
  {{/if}}
10
+ {{else}}
11
+ /**
12
+ * No `uischema` was supplied for this form, so its fields are derived from the resource metadata.
13
+ * Export a `createFormSchema` here and pass it to the form to take control of the layout.
14
+ */
15
+ export {};
16
+ {{/ifAny}}
@@ -1,4 +1,13 @@
1
- import { type CustomAction, CrudMenuPosition, UiSchema } from '@genesislcap/foundation-entity-management';
1
+ {{#ifContains tile.config.customEvents '"hasForm":true'}}
2
+ {{#ifContains tile.config.customEvents '"position":"'}}
3
+ import {
4
+ type CustomAction,
5
+ CrudMenuPosition,
6
+ UiSchema,
7
+ } from '@genesislcap/foundation-entity-management';
8
+ {{else}}
9
+ import { type CustomAction, UiSchema } from '@genesislcap/foundation-entity-management';
10
+ {{/ifContains}}
2
11
 
3
12
  {{#each tile.config.customEvents}}
4
13
  {{#if this.hasForm}}
@@ -6,6 +15,20 @@ export const {{camelCase this.name}}FormSchema: UiSchema = {{{this.uischema}}};
6
15
  {{/if}}
7
16
  {{/each}}
8
17
 
18
+ {{else}}
19
+ {{#ifContains tile.config.customEvents '"position":"'}}
20
+ import { type CustomAction, CrudMenuPosition } from '@genesislcap/foundation-entity-management';
21
+ {{else}}
22
+ import { type CustomAction } from '@genesislcap/foundation-entity-management';
23
+ {{/ifContains}}
24
+
25
+ {{/ifContains}}
26
+ {{#each tile.config.customEvents}}
27
+ {{#if this.defaultValues}}
28
+ const {{camelCase this.name}}DefaultValues = {{{this.defaultValues}}};
29
+
30
+ {{/if}}
31
+ {{/each}}
9
32
  export const customActions: CustomAction[] = [
10
33
  {{#each tile.config.customEvents}}
11
34
  {
@@ -17,7 +40,9 @@ export const customActions: CustomAction[] = [
17
40
  {{#if this.hasForm}}
18
41
  uiSchema: {{camelCase this.name}}FormSchema,
19
42
  {{/if}}
20
- defaultValues: {{{this.defaultValues}}},
43
+ {{#if this.defaultValues}}
44
+ defaultValues: {{camelCase this.name}}DefaultValues,
45
+ {{/if}}
21
46
  },
22
47
  {{#if this.position}}
23
48
  position: CrudMenuPosition.{{{pascalCase this.position}}},
@@ -26,15 +51,15 @@ export const customActions: CustomAction[] = [
26
51
  icon: '{{this.icon}}',
27
52
  {{/if}}
28
53
  {{#if this.tooltip}}
29
- tooltip: '{{this.tooltip}}',
54
+ tooltip: {{{this.tooltipJs}}},
30
55
  {{/if}}
31
56
  {{#if this.confirmSubmit}}
32
57
  confirmSubmit: {
33
- state: '{{this.confirmSubmit.state}}',
34
- message: '{{this.confirmSubmit.message}}'
58
+ state: '{{#if this.confirmSubmit.state}}{{this.confirmSubmit.state}}{{else}}enabled{{/if}}',
59
+ message: {{{this.confirmSubmitMessageJs}}},
35
60
  },
36
61
  {{/if}}
37
62
  requiresSelection: true,
38
63
  },
39
64
  {{/each}}
40
- ];
65
+ ];
@@ -1,6 +1,5 @@
1
1
  import { UiSchema } from '@genesislcap/foundation-forms';
2
2
 
3
3
  {{#if tile.config.filterFormUiSchema}}
4
- export const filterFormSchema: UiSchema = {{{ tile.config.filterFormUiSchema }}}
4
+ export const filterFormSchema: UiSchema = {{{ tile.config.filterFormUiSchema }}};
5
5
  {{/if}}
6
-
@@ -1,9 +1,21 @@
1
+ {{#ifContains tile.config.gridOptions 'getDateFormatter'}}
2
+ {{#ifContains tile.config.gridOptions 'getNumberFormatter'}}
3
+ import { getDateFormatter, getNumberFormatter } from '@genesislcap/foundation-utils';
4
+ {{else}}
5
+ import { getDateFormatter } from '@genesislcap/foundation-utils';
6
+ {{/ifContains}}
7
+ {{else}}
8
+ {{#ifContains tile.config.gridOptions 'getNumberFormatter'}}
9
+ import { getNumberFormatter } from '@genesislcap/foundation-utils';
10
+ {{/ifContains}}
11
+ {{/ifContains}}
1
12
  import { GridOptionsConfig } from '@genesislcap/rapid-grid-pro';
2
- import { getNumberFormatter, getDateFormatter } from '@genesislcap/foundation-utils';
3
13
  {{#if route.FDC3EventHandlersEnabled}}
4
- import { sendEventOnChannel } from '../../../utils';
14
+ {{#ifContains tile.config.gridOptions 'sendEventOnChannel'}}
15
+ import { sendEventOnChannel } from '../../../utils';
16
+ {{/ifContains}}
5
17
  {{/if}}
6
18
 
7
19
  {{#if tile.config.gridOptions}}
8
- export const gridOptions: GridOptionsConfig = {{{ tile.config.gridOptions }}}
20
+ export const gridOptions: GridOptionsConfig = {{{ tile.config.gridOptions }}};
9
21
  {{/if}}
@@ -1,13 +1,27 @@
1
- import { Component, Input, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
2
1
  import { CommonModule } from '@angular/common';
2
+ import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
3
3
  import { getUser } from '@genesislcap/foundation-user';
4
+ {{#if tile.config.gridOptions}}
5
+ import { GridOptionsConfig } from '@genesislcap/rapid-grid-pro';
6
+ {{/if}}
7
+ {{#if tile.config.eventing.listener}}
8
+ import { injectSelector } from '@reduxjs/angular-redux';
9
+ {{/if}}
4
10
  import { ErrorMessageComponent } from '../../../components/error-message/error-message.component';
5
- import { getViewUpdateRightComponent } from '../../../utils';
6
- {{#if tile.config.customEvents}}
7
- import { customActions as emCustomActions } from './{{kebabCase tile.title}}.events.config';
11
+ {{#if tile.config.eventing.publishEventName}}
12
+ {{#if tile.config.eventing.listener}}
13
+ import { actions, selectors } from '../../../store/store';
14
+ {{else}}
15
+ import { actions } from '../../../store/store';
8
16
  {{/if}}
9
- {{#if tile.config.gridOptions}}
10
- import { GridOptionsConfig } from "@genesislcap/rapid-grid-pro";
17
+ {{else}}
18
+ {{#if tile.config.eventing.listener}}
19
+ import { selectors } from '../../../store/store';
20
+ {{/if}}
21
+ {{/if}}
22
+ import { getViewUpdateRightComponent } from '../../../utils';
23
+ {{#if tile.config.columns}}
24
+ import { columnDefs } from './{{kebabCase tile.title}}.column.defs';
11
25
  {{/if}}
12
26
  {{#if tile.config.createFormUiSchema}}
13
27
  import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema';
@@ -15,65 +29,76 @@ import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema'
15
29
  {{#if tile.config.uischema}}
16
30
  import { createFormSchema } from './{{kebabCase tile.title}}.create.form.schema';
17
31
  {{/if}}
18
- {{#if tile.config.updateFormUiSchema}}
19
- import { updateFormSchema } from './{{kebabCase tile.title}}.update.form.schema';
32
+ {{#if tile.config.customEvents}}
33
+ import { customActions as emCustomActions } from './{{kebabCase tile.title}}.events.config';
20
34
  {{/if}}
21
35
  {{#if tile.config.filterFormUiSchema}}
22
36
  import { filterFormSchema } from './{{kebabCase tile.title}}.filter.form.schema';
23
37
  {{/if}}
24
- {{#if tile.config.columns}}
25
- import { columnDefs } from './{{kebabCase tile.title}}.column.defs';
26
- {{/if}}
27
38
  {{#if tile.config.gridOptions}}
28
39
  import { gridOptions } from './{{kebabCase tile.title}}.gridOptions';
29
40
  {{/if}}
30
- {{#ifAny tile.config.eventing.publishEventName tile.config.eventing.listener}}
31
- import { actions, selectors } from '../../../store/store';
32
- import { injectSelector } from '@reduxjs/angular-redux';
33
- {{/ifAny}}
41
+ {{#if tile.config.updateFormUiSchema}}
42
+ import { updateFormSchema } from './{{kebabCase tile.title}}.update.form.schema';
43
+ {{/if}}
34
44
 
35
45
  {{#ifAny tile.metadata.comment tile.metadata.todo}}
36
46
  /**
37
47
  {{~#if tile.metadata.comment}}{{{ tile.metadata.comment }}}{{/if}}
38
- {{~#if tile.metadata.todo}}{{#if tile.metadata.comment}}
48
+ {{~#if tile.metadata.todo}}{{#if tile.metadata.comment}}
39
49
  *{{/if}}
40
50
  * TODO: {{{ tile.metadata.todo }}}{{/if}}
41
51
  */
42
52
  {{/ifAny}}
43
-
44
53
  @Component({
45
54
  selector: 'app-{{kebabCase tile.componentName}}',
46
55
  templateUrl: './{{kebabCase tile.title}}.component.html',
47
56
  styleUrl: './{{kebabCase tile.title}}.component.css',
48
57
  standalone: true,
49
- imports: [
50
- ErrorMessageComponent,
51
- CommonModule,
52
- ],
58
+ imports: [ErrorMessageComponent, CommonModule],
53
59
  schemas: [CUSTOM_ELEMENTS_SCHEMA],
54
60
  })
55
61
  export class {{pascalCase tile.componentName}} {
56
- hasUserPermission = (permissionCode: string) => getViewUpdateRightComponent(getUser(), permissionCode);{{#if tile.config.createFormUiSchema}}
57
- createFormSchema = createFormSchema;{{/if}}{{#if tile.config.uischema}}
58
- uischema = createFormSchema;{{/if}}{{#if tile.config.updateFormUiSchema}}
59
- updateFormSchema = updateFormSchema;{{/if}}{{#if tile.config.filterFormUiSchema}}
60
- filterFormSchema = filterFormSchema;{{/if}}{{#if tile.config.gridOptions}}
61
- gridOptions = gridOptions as GridOptionsConfig;{{/if}}{{#if tile.config.columns}}
62
- columnDefs = [
63
- ...columnDefs,
64
- ];{{/if}}{{#if tile.config.type}}
65
- chartConfig = { {{#ifEquals tile.config.type 'pie'}}
66
- "radius": 0.75,
67
- "angleField": "value",
68
- "colorField": "groupBy",{{else}}
69
- "xField": "groupBy",
70
- "yField": "value",{{/ifEquals}}
71
- };{{/if}}{{#if tile.config.customEvents}}
72
- customActions = emCustomActions;{{/if}}{{#ifAny tile.config.eventing.publishEventName tile.config.eventing.listener}}
62
+ hasUserPermission = (permissionCode: string) =>
63
+ getViewUpdateRightComponent(getUser(), permissionCode);
64
+ {{#if tile.config.createFormUiSchema}}
65
+ createFormSchema = createFormSchema;
66
+ {{/if}}
67
+ {{#if tile.config.uischema}}
68
+ uischema = createFormSchema;
69
+ {{/if}}
70
+ {{#if tile.config.updateFormUiSchema}}
71
+ updateFormSchema = updateFormSchema;
72
+ {{/if}}
73
+ {{#if tile.config.filterFormUiSchema}}
74
+ filterFormSchema = filterFormSchema;
75
+ {{/if}}
76
+ {{#if tile.config.gridOptions}}
77
+ gridOptions = gridOptions as GridOptionsConfig;
78
+ {{/if}}
79
+ {{#if tile.config.columns}}
80
+ columnDefs = [...columnDefs];
81
+ {{/if}}
82
+ {{#ifEquals tile.type 'chart'}}
83
+ {{! Declared for every chart tile: the chart template always binds [config]="chartConfig". }}
84
+ chartConfig = {
85
+ {{#ifEquals tile.config.type 'pie'}}
86
+ radius: 0.75,
87
+ angleField: 'value',
88
+ colorField: 'groupBy',
89
+ {{else}}
90
+ xField: 'groupBy',
91
+ yField: 'value',
92
+ {{/ifEquals}}
93
+ };
94
+ {{/ifEquals}}
95
+ {{#if tile.config.customEvents}}
96
+ customActions = emCustomActions;
97
+ {{/if}}
73
98
  {{#if tile.config.eventing.listener}}
74
99
  criteria = injectSelector(selectors.eventing.getCriteriaFor{{pascalCase tile.title}});
75
100
  {{/if}}
76
- {{/ifAny}}{{#if tile.config.eventing.publishEventName}}
101
+ {{#if tile.config.eventing.publishEventName}}
77
102
  handleRowSelection = (e: any) => {
78
103
  {{#ifEquals tile.componentType 'grid'}}
79
104
  const selectedRows = e.api.getSelectedRows();
@@ -81,18 +106,24 @@ export class {{pascalCase tile.componentName}} {
81
106
  const selectedRows = e.detail.api.getSelectedRows();
82
107
  {{/ifEquals}}
83
108
  if (!selectedRows || !selectedRows.length) {
84
- actions.eventing.publish{{pascalCase tile.config.eventing.publishEventName}}(null);
85
- return;
86
- };
109
+ actions.eventing.publish{{pascalCase tile.config.eventing.publishEventName}}(null);
110
+ return;
111
+ }
87
112
  const { TIMESTAMP, RECORD_ID, ROW_REF, ...data } = selectedRows[0];
88
113
  actions.eventing.publish{{pascalCase tile.config.eventing.publishEventName}}(data);
89
- };{{/if}}
114
+ };
115
+ {{/if}}
90
116
  {{#ifAny tile.config.gridOptions tile.config.eventing.publishEventName}}
91
117
  gridOptionsModel = {
92
118
  {{#if tile.config.gridOptions}}
93
- onRowClicked: gridOptions?.onRowClicked,{{/if}}{{#if tile.config.eventing.publishEventName}}{{#ifEquals tile.componentType 'grid'}}
119
+ onRowClicked: gridOptions?.onRowClicked,
120
+ {{/if}}
121
+ {{#if tile.config.eventing.publishEventName}}
122
+ {{#ifEquals tile.componentType 'grid'}}
94
123
  onSelectionChanged: this.handleRowSelection,
95
- rowSelection: 'single'{{/ifEquals}}{{/if}}
124
+ rowSelection: 'single',
125
+ {{/ifEquals}}
126
+ {{/if}}
96
127
  };
97
128
  {{/ifAny}}
98
- }
129
+ }
@@ -1 +1 @@
1
- export * from './{{kebabCase tile.title}}.component';
1
+ export * from './{{kebabCase tile.title}}.component';
@@ -1,5 +1,5 @@
1
1
  import { UiSchema } from '@genesislcap/foundation-forms';
2
2
 
3
3
  {{#if tile.config.updateFormUiSchema}}
4
- export const updateFormSchema: UiSchema = {{{ tile.config.updateFormUiSchema }}}
4
+ export const updateFormSchema: UiSchema = {{{ tile.config.updateFormUiSchema }}};
5
5
  {{/if}}
@@ -1,5 +1,5 @@
1
- <section style="height: 100%; width: 100%;">
2
- <ng-container {{#if config.permissions.viewRight}}*ngIf="hasUserPermission('{{config.permissions.viewRight}}'); else notPermitted{{ config.index }}"{{/if}}>
1
+ <section style="height: 100%; width: 100%">
2
+ <ng-container{{#if config.permissions.viewRight}} *ngIf="hasUserPermission('{{config.permissions.viewRight}}'); else notPermitted{{ config.index }}"{{/if}}>
3
3
  <entity-management
4
4
  design-system-prefix="rapid"
5
5
  header-case-type="capitalCase"
@@ -40,7 +40,7 @@
40
40
  requestAutoSetup: false,
41
41
  {{/if}}
42
42
  {{#if config.eventing.listener}}
43
- criteria: criteria()
43
+ criteria: criteria(),
44
44
  {{/if}}
45
45
  }"
46
46
  {{/ifAny}}
@@ -74,9 +74,9 @@
74
74
 
75
75
  <ng-template #notPermitted{{ config.index }}>
76
76
  <app-error-message
77
- style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;"
77
+ style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center"
78
78
  elementType="h3"
79
- message="You do not have access to view this component.">
80
- </app-error-message>
79
+ message="You do not have access to view this component."
80
+ ></app-error-message>
81
81
  </ng-template>{{/if}}
82
82
  </section>
@@ -1,15 +1,14 @@
1
- {{#if FDC3.includeDependencies}}
2
1
  import { DefaultFDC3 } from '@genesislcap/foundation-fdc3';
3
- {{/if}}
4
- export const isFDC3 = (): boolean => !!(window as any).fdc3;
5
- {{#if FDC3.includeDependencies}}
6
2
 
3
+ export const isFDC3 = (): boolean => !!(window as any).fdc3;
7
4
  export const onFDC3Ready = async (FDC3ReadyCb: () => any): Promise<void> => {
8
- isFDC3()
9
- ? await FDC3ReadyCb()
10
- : window.addEventListener('fdc3Ready', async () => {
5
+ if (isFDC3()) {
6
+ await FDC3ReadyCb();
7
+ } else {
8
+ window.addEventListener('fdc3Ready', async () => {
11
9
  await FDC3ReadyCb();
12
10
  });
11
+ }
13
12
  };
14
13
 
15
14
  export const listenToChannel = async (
@@ -29,4 +28,3 @@ export const sendEventOnChannel = (channelName: string, type: string) => {
29
28
  await fdc3Service.broadcastOnChannel(channelName, type, payload);
30
29
  };
31
30
  };
32
- {{/if}}
@@ -1,21 +1,18 @@
1
- <section style="height: 100%; width: 100%;">
2
- <ng-container {{#if config.permissions.updateRight}}*ngIf="hasUserPermission('{{config.permissions.updateRight}}'); else notPermitted{{ config.index }}"{{/if}}>
3
- <foundation-form
1
+ <section style="height: 100%; width: 100%">
2
+ <ng-container{{#if config.permissions.updateRight}} *ngIf="hasUserPermission('{{config.permissions.updateRight}}'); else notPermitted{{ config.index }}"{{/if}}>
3
+ {{#if config.uischema}}<foundation-form
4
4
  design-system-prefix="rapid"
5
5
  resourceName="{{config.resourceName}}"
6
- {{#if config.uischema}}
7
6
  [uischema]="uischema"
8
- {{/if}}
9
- >
10
- </foundation-form>
7
+ ></foundation-form>{{else}}<foundation-form design-system-prefix="rapid" resourceName="{{config.resourceName}}"></foundation-form>{{/if}}
11
8
  </ng-container>
12
9
  {{#if config.permissions.updateRight}}
13
10
  <ng-template #notPermitted{{ config.index }}>
14
11
  <app-error-message
15
- style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center;"
12
+ style="width: 100%; height: 100%; display: flex; justify-content: center; align-items: center"
16
13
  elementType="h3"
17
- message="You do not have access to view this component.">
18
- </app-error-message>
19
- </ng-template>{{/if}}
14
+ message="You do not have access to view this component."
15
+ ></app-error-message>
16
+ </ng-template>
17
+ {{/if}}
20
18
  </section>
21
-