@finos/legend-application 15.0.75 → 15.1.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 (71) hide show
  1. package/lib/application/LegendApplication.d.ts +5 -1
  2. package/lib/application/LegendApplication.d.ts.map +1 -1
  3. package/lib/application/LegendApplication.js +13 -1
  4. package/lib/application/LegendApplication.js.map +1 -1
  5. package/lib/application/LegendApplicationConfig.d.ts.map +1 -1
  6. package/lib/application/LegendApplicationConfig.js.map +1 -1
  7. package/lib/components/ActionAlert.js.map +1 -1
  8. package/lib/components/ApplicationComponentFrameworkProvider.d.ts.map +1 -1
  9. package/lib/components/ApplicationComponentFrameworkProvider.js +14 -13
  10. package/lib/components/ApplicationComponentFrameworkProvider.js.map +1 -1
  11. package/lib/components/ApplicationFrameworkProvider.js.map +1 -1
  12. package/lib/components/ApplicationStoreProvider.d.ts.map +1 -1
  13. package/lib/components/BlockingAlert.js.map +1 -1
  14. package/lib/components/NotificationManager.js.map +1 -1
  15. package/lib/components/ReleaseNotesManager.d.ts +28 -0
  16. package/lib/components/ReleaseNotesManager.d.ts.map +1 -0
  17. package/lib/components/ReleaseNotesManager.js +82 -0
  18. package/lib/components/ReleaseNotesManager.js.map +1 -0
  19. package/lib/components/VirtualAssistant.d.ts.map +1 -1
  20. package/lib/components/VirtualAssistant.js +3 -0
  21. package/lib/components/VirtualAssistant.js.map +1 -1
  22. package/lib/components/useApplicationNavigationContext.js.map +1 -1
  23. package/lib/index.css +2 -2
  24. package/lib/index.css.map +1 -1
  25. package/lib/index.d.ts +1 -0
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +1 -0
  28. package/lib/index.js.map +1 -1
  29. package/lib/package.json +11 -11
  30. package/lib/stores/AlertService.js.map +1 -1
  31. package/lib/stores/ApplicationNavigationContextService.js.map +1 -1
  32. package/lib/stores/ApplicationStore.d.ts +2 -0
  33. package/lib/stores/ApplicationStore.d.ts.map +1 -1
  34. package/lib/stores/ApplicationStore.js +4 -0
  35. package/lib/stores/ApplicationStore.js.map +1 -1
  36. package/lib/stores/AssistantService.js.map +1 -1
  37. package/lib/stores/ClipboardService.js.map +1 -1
  38. package/lib/stores/CommandService.js.map +1 -1
  39. package/lib/stores/DocumentationService.js.map +1 -1
  40. package/lib/stores/KeyboardShortcutsService.js.map +1 -1
  41. package/lib/stores/LayoutService.js.map +1 -1
  42. package/lib/stores/NotificationService.d.ts +2 -2
  43. package/lib/stores/NotificationService.d.ts.map +1 -1
  44. package/lib/stores/NotificationService.js.map +1 -1
  45. package/lib/stores/ReleaseNotesService.d.ts +47 -0
  46. package/lib/stores/ReleaseNotesService.d.ts.map +1 -0
  47. package/lib/stores/ReleaseNotesService.js +68 -0
  48. package/lib/stores/ReleaseNotesService.js.map +1 -0
  49. package/lib/stores/SettingService.js.map +1 -1
  50. package/lib/stores/TimeService.js.map +1 -1
  51. package/lib/stores/UserDataService.js.map +1 -1
  52. package/lib/stores/navigation/BrowserNavigator.js.map +1 -1
  53. package/lib/stores/platform/BrowserPlatform.js.map +1 -1
  54. package/lib/stores/storage/StorageService.js.map +1 -1
  55. package/lib/stores/terminal/Terminal.d.ts +1 -1
  56. package/lib/stores/terminal/Terminal.d.ts.map +1 -1
  57. package/lib/stores/terminal/XTerm.js +4 -4
  58. package/lib/stores/terminal/XTerm.js.map +1 -1
  59. package/lib/util/DownloadHelperServiceWorker.js.map +1 -1
  60. package/package.json +14 -14
  61. package/src/application/LegendApplication.ts +21 -1
  62. package/src/application/LegendApplicationConfig.ts +0 -1
  63. package/src/components/ApplicationComponentFrameworkProvider.tsx +6 -0
  64. package/src/components/ReleaseNotesManager.tsx +247 -0
  65. package/src/components/VirtualAssistant.tsx +3 -0
  66. package/src/index.ts +1 -0
  67. package/src/stores/ApplicationStore.ts +5 -0
  68. package/src/stores/ReleaseNotesService.ts +104 -0
  69. package/src/stores/terminal/XTerm.ts +2 -2
  70. package/tsconfig.json +19 -1
  71. package/tsconfig.package.json +17 -1
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { observer } from 'mobx-react-lite';
18
+ import { useApplicationStore } from './ApplicationStoreProvider.js';
19
+ import {
20
+ ArrowCircleUpIcon,
21
+ BugIcon,
22
+ Dialog,
23
+ Modal,
24
+ ModalBody,
25
+ ModalFooter,
26
+ ModalFooterButton,
27
+ ModalHeader,
28
+ ShareIcon,
29
+ clsx,
30
+ } from '@finos/legend-art';
31
+ import {
32
+ RELEASE_UPDATE_TYPE,
33
+ type ReleaseNote,
34
+ type VersionReleaseNotes,
35
+ } from '../stores/ReleaseNotesService.js';
36
+ import {
37
+ isValidUrl,
38
+ prettyCONSTName,
39
+ returnUndefOnError,
40
+ } from '@finos/legend-shared';
41
+
42
+ const ReleaseNoteViewer = observer((props: { note: ReleaseNote }) => {
43
+ const { note } = props;
44
+ const applicationStore = useApplicationStore();
45
+ const isBug = note.type === RELEASE_UPDATE_TYPE.BUG_FIX;
46
+ const visitLink = (): void => {
47
+ if (note.docLink && isValidUrl(note.docLink)) {
48
+ applicationStore.navigationService.navigator.visitAddress(note.docLink);
49
+ }
50
+ };
51
+
52
+ return (
53
+ <div className="release-viewer__update__item" key={note.description}>
54
+ <div
55
+ className={clsx('release-viewer__update__item-btn', {
56
+ 'release-viewer__update__item-btn-bug': isBug,
57
+ })}
58
+ >
59
+ {isBug ? <BugIcon /> : <ArrowCircleUpIcon />}
60
+ </div>
61
+ <div className="release-viewer__update__description">
62
+ {note.description}
63
+ </div>
64
+ {note.docLink && (
65
+ <div className="release-viewer__update__link">
66
+ <button
67
+ className="release-viewer__update__link-btn"
68
+ title="Visit..."
69
+ onClick={visitLink}
70
+ >
71
+ <ShareIcon />
72
+ </button>
73
+ </div>
74
+ )}
75
+ </div>
76
+ );
77
+ });
78
+
79
+ export const ReleaseViewer = observer(
80
+ (props: { releaseNotes: VersionReleaseNotes }) => {
81
+ const { releaseNotes } = props;
82
+ const enhancements =
83
+ releaseNotes.notes?.filter(
84
+ (r) => r.type === RELEASE_UPDATE_TYPE.ENHANCEMENT,
85
+ ) ?? [];
86
+ const bugFixes =
87
+ releaseNotes.notes?.filter(
88
+ (r) => r.type === RELEASE_UPDATE_TYPE.BUG_FIX,
89
+ ) ?? [];
90
+
91
+ return (
92
+ <div className="release-viewer">
93
+ <div className="release-viewer__version">
94
+ Version {releaseNotes.label ?? releaseNotes.version}
95
+ </div>
96
+ <div className="release-viewer__content">
97
+ {Boolean(enhancements.length) && (
98
+ <div className="release-viewer__update">
99
+ <div className="release-viewer__update-type">ENHANCEMENTS</div>
100
+ <div className="release-viewer__update__items">
101
+ {enhancements.map((e) => (
102
+ <ReleaseNoteViewer note={e} key={e.description} />
103
+ ))}
104
+ </div>
105
+ </div>
106
+ )}
107
+ {Boolean(bugFixes.length) && (
108
+ <div className="release-viewer__update">
109
+ <div className="release-viewer__update-type">BUG FIXES</div>
110
+ <div className="release-viewer__update__items">
111
+ {bugFixes.map((e) => (
112
+ <ReleaseNoteViewer note={e} key={e.description} />
113
+ ))}
114
+ </div>
115
+ </div>
116
+ )}
117
+ </div>
118
+ </div>
119
+ );
120
+ },
121
+ );
122
+
123
+ export const ReleaseNotesManager = observer(() => {
124
+ const applicationStore = useApplicationStore();
125
+ const releaseService = applicationStore.releaseNotesService;
126
+ const releaseNotes = releaseService.releaseNotes;
127
+ const version = applicationStore.config.appVersion;
128
+ const currentVersion = releaseNotes?.find((r) => r.version === version);
129
+ const storage = returnUndefOnError(() => releaseService.getViewedVersions());
130
+ const isOpen = releaseService.showCurrentReleaseModal;
131
+ if (
132
+ !releaseService.isConfigured ||
133
+ !isOpen ||
134
+ !currentVersion ||
135
+ storage === version
136
+ ) {
137
+ return null;
138
+ }
139
+
140
+ const closeModal = (): void => {
141
+ releaseService.updateViewedVersion(currentVersion.version);
142
+ releaseService.setShowCurrentRelease(false);
143
+ };
144
+ const title = `Legend ${prettyCONSTName(
145
+ applicationStore.config.appName,
146
+ )} has been upgraded !`;
147
+ return (
148
+ <Dialog
149
+ open={isOpen}
150
+ onClose={closeModal}
151
+ classes={{
152
+ root: 'release-notes__root-container',
153
+ container: 'release-notes__container',
154
+ }}
155
+ >
156
+ <Modal
157
+ darkMode={
158
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
159
+ }
160
+ className="editor-modal release-notes__dialog"
161
+ >
162
+ <ModalHeader
163
+ className="release-notes__dialog__header__title"
164
+ title={title}
165
+ />
166
+
167
+ <ModalBody className="release-notes__dialog__body">
168
+ <div className="release-notes__dialog__content">
169
+ <div className="release-notes__dialog__content__title">
170
+ New features, enhancements and bug fixess that were released
171
+ </div>
172
+ <ReleaseViewer releaseNotes={currentVersion} />
173
+ </div>
174
+ </ModalBody>
175
+ <ModalFooter>
176
+ <ModalFooterButton
177
+ className="modal__footer__close-btn"
178
+ onClick={closeModal}
179
+ type={'primary'}
180
+ >
181
+ Close
182
+ </ModalFooterButton>
183
+ </ModalFooter>
184
+ </Modal>
185
+ </Dialog>
186
+ );
187
+ });
188
+
189
+ export const ReleaseLogManager = observer(() => {
190
+ const applicationStore = useApplicationStore();
191
+ const releaseService = applicationStore.releaseNotesService;
192
+
193
+ if (!releaseService.isConfigured || !releaseService.showReleaseLog) {
194
+ return null;
195
+ }
196
+ const releaseNotes = releaseService.releaseNotes ?? [];
197
+
198
+ const isOpen = releaseService.showCurrentReleaseModal;
199
+ const closeModal = (): void => {
200
+ releaseService.setReleaseLog(false);
201
+ };
202
+ const title = `Legend ${prettyCONSTName(
203
+ applicationStore.config.appName,
204
+ )} Release Log`;
205
+ return (
206
+ <Dialog
207
+ open={isOpen}
208
+ onClose={closeModal}
209
+ classes={{
210
+ root: 'release-notes__root-container',
211
+ container: 'release-notes__container',
212
+ }}
213
+ >
214
+ <Modal
215
+ darkMode={
216
+ !applicationStore.layoutService.TEMPORARY__isLightColorThemeEnabled
217
+ }
218
+ className="editor-modal release-notes__dialog"
219
+ >
220
+ <ModalHeader
221
+ className="release-notes__dialog__header__title"
222
+ title={title}
223
+ />
224
+
225
+ <ModalBody className="release-notes__dialog__body">
226
+ <div className="release-notes__dialog__content">
227
+ <div className="release-notes__dialog__content__title">
228
+ New features, enhancements and bug fixess that were released
229
+ </div>
230
+ {releaseNotes.map((e) => (
231
+ <ReleaseViewer key={e.version} releaseNotes={e} />
232
+ ))}
233
+ </div>
234
+ </ModalBody>
235
+ <ModalFooter>
236
+ <ModalFooterButton
237
+ className="modal__footer__close-btn"
238
+ onClick={closeModal}
239
+ type={'primary'}
240
+ >
241
+ Close
242
+ </ModalFooterButton>
243
+ </ModalFooter>
244
+ </Modal>
245
+ </Dialog>
246
+ );
247
+ });
@@ -768,6 +768,9 @@ export const VirtualAssistant = observer(() => {
768
768
  bounds="parent"
769
769
  onStart={onDragStart}
770
770
  onStop={onDragEnd}
771
+ // Avoid using deprecated findDOMNode method to rid of React warning
772
+ // See https://github.com/react-grid-layout/react-draggable/issues/749
773
+ nodeRef={assistantRef}
771
774
  // limit the dnd trigger to only the drag handle
772
775
  handle=".virtual-assistant__station__drag-handle"
773
776
  >
package/src/index.ts CHANGED
@@ -55,6 +55,7 @@ export * from './stores/event/IframeEventNotifierPlugin.js';
55
55
  export * from './stores/TelemetryService.js';
56
56
  export * from './stores/NotificationService.js';
57
57
  export * from './stores/AlertService.js';
58
+ export * from './stores/ReleaseNotesService.js';
58
59
  export * from './stores/AssistantService.js';
59
60
  export * from './stores/ApplicationNavigationContextService.js';
60
61
  export * from './stores/LegendApplicationPlugin.js';
@@ -49,6 +49,7 @@ import { SettingService } from './SettingService.js';
49
49
  import { DefaultNavigator } from './navigation/DefaultNavigator.js';
50
50
  import type { ApplicationPlatform } from './platform/ApplicationPlatform.js';
51
51
  import { UserDataService } from './UserDataService.js';
52
+ import { ReleaseNotesService } from './ReleaseNotesService.js';
52
53
 
53
54
  export type GenericLegendApplicationStore = ApplicationStore<
54
55
  LegendApplicationConfig,
@@ -105,6 +106,9 @@ export class ApplicationStore<
105
106
  readonly documentationService: DocumentationService;
106
107
  readonly assistantService: AssistantService;
107
108
 
109
+ // release
110
+ readonly releaseNotesService: ReleaseNotesService;
111
+
108
112
  // event
109
113
  readonly eventService: EventService;
110
114
  readonly telemetryService: TelemetryService;
@@ -138,6 +142,7 @@ export class ApplicationStore<
138
142
 
139
143
  this.documentationService = new DocumentationService(this);
140
144
  this.assistantService = new AssistantService(this);
145
+ this.releaseNotesService = new ReleaseNotesService(this);
141
146
 
142
147
  this.eventService = new EventService();
143
148
  this.eventService.registerEventNotifierPlugins(
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { guaranteeNonEmptyString } from '@finos/legend-shared';
18
+ import type { GenericLegendApplicationStore } from './ApplicationStore.js';
19
+ import { action, makeObservable, observable } from 'mobx';
20
+
21
+ export enum RELEASE_UPDATE_TYPE {
22
+ BUG_FIX = 'BUG_FIX',
23
+ ENHANCEMENT = 'ENHANCEMENT',
24
+ }
25
+
26
+ export interface ReleaseNote {
27
+ type: RELEASE_UPDATE_TYPE;
28
+ description: string;
29
+ docLink?: string | undefined;
30
+ }
31
+
32
+ export interface VersionReleaseNotes {
33
+ version: string;
34
+ label?: string | undefined;
35
+ docLink?: string | undefined;
36
+ notes?: ReleaseNote[] | undefined;
37
+ }
38
+
39
+ export const collectReleaseNotes = (
40
+ releaseNotes: VersionReleaseNotes[],
41
+ ): VersionReleaseNotes[] =>
42
+ releaseNotes.map((release) => {
43
+ guaranteeNonEmptyString(
44
+ release.version,
45
+ "Release notes 'version' is missing",
46
+ );
47
+ release.notes?.map((note) => {
48
+ guaranteeNonEmptyString(note.type, "Release note 'type' is missing");
49
+ guaranteeNonEmptyString(
50
+ note.description,
51
+ "Release note 'description' is missing",
52
+ );
53
+ return note;
54
+ });
55
+ return release;
56
+ });
57
+
58
+ export class ReleaseNotesService {
59
+ static STORAGE_NAME = 'application.release-notes.lastOpenedVersion';
60
+ applicationStore: GenericLegendApplicationStore;
61
+ releaseNotes: VersionReleaseNotes[] | undefined;
62
+ showCurrentReleaseModal = true;
63
+ showReleaseLog = false;
64
+ isConfigured = false;
65
+
66
+ constructor(applicationStore: GenericLegendApplicationStore) {
67
+ makeObservable(this, {
68
+ showCurrentReleaseModal: observable,
69
+ showReleaseLog: observable,
70
+ isConfigured: observable,
71
+ setShowCurrentRelease: action,
72
+ configure: action,
73
+ updateViewedVersion: action,
74
+ setReleaseLog: action,
75
+ });
76
+ this.applicationStore = applicationStore;
77
+ }
78
+
79
+ configure(releaseNotes: VersionReleaseNotes[]): void {
80
+ this.isConfigured = true;
81
+ this.releaseNotes = collectReleaseNotes(releaseNotes);
82
+ }
83
+
84
+ setShowCurrentRelease(val: boolean): void {
85
+ this.showCurrentReleaseModal = val;
86
+ }
87
+
88
+ setReleaseLog(val: boolean): void {
89
+ this.showReleaseLog = val;
90
+ }
91
+
92
+ getViewedVersions(): string | undefined {
93
+ return this.applicationStore.settingService.getStringValue(
94
+ ReleaseNotesService.STORAGE_NAME,
95
+ );
96
+ }
97
+
98
+ updateViewedVersion(version: string): void {
99
+ return this.applicationStore.settingService.persistValue(
100
+ ReleaseNotesService.STORAGE_NAME,
101
+ version,
102
+ );
103
+ }
104
+ }
@@ -567,8 +567,8 @@ export class XTerm extends Terminal {
567
567
  abs_cursorY > buffer.viewportY + rows
568
568
  ? abs_cursorY - (buffer.viewportY + rows)
569
569
  : abs_cursorY < buffer.viewportY
570
- ? abs_cursorY - buffer.viewportY
571
- : 0;
570
+ ? abs_cursorY - buffer.viewportY
571
+ : 0;
572
572
 
573
573
  return {
574
574
  // NOTE: currently, there is a design limitation with programmatically set the cursor using escape sequence
package/tsconfig.json CHANGED
@@ -24,7 +24,23 @@
24
24
  "outDir": "./lib",
25
25
  "tsBuildInfoFile": "./build/prod.tsbuildinfo",
26
26
  "rootDir": "./src",
27
- "jsx": "react-jsx"
27
+ "jsx": "react-jsx",
28
+ "moduleResolution": "nodenext",
29
+ "moduleDetection": "force",
30
+ "isolatedModules": true,
31
+ "esModuleInterop": true,
32
+ "allowSyntheticDefaultImports": true,
33
+ "preserveConstEnums": true,
34
+ "incremental": true,
35
+ "useDefineForClassFields": true,
36
+ "noImplicitAny": true,
37
+ "noImplicitThis": true,
38
+ "strictNullChecks": true,
39
+ "strictFunctionTypes": true,
40
+ "strictBindCallApply": true,
41
+ "strictPropertyInitialization": true,
42
+ "alwaysStrict": true,
43
+ "useUnknownInCatchVariables": true
28
44
  },
29
45
  "references": [
30
46
  {
@@ -58,6 +74,7 @@
58
74
  "./src/stores/LayoutService.ts",
59
75
  "./src/stores/LegendApplicationPlugin.ts",
60
76
  "./src/stores/NotificationService.ts",
77
+ "./src/stores/ReleaseNotesService.ts",
61
78
  "./src/stores/SettingService.ts",
62
79
  "./src/stores/TelemetryService.ts",
63
80
  "./src/stores/TerminalService.ts",
@@ -84,6 +101,7 @@
84
101
  "./src/components/BlockingAlert.tsx",
85
102
  "./src/components/BrowserEnvironmentProvider.tsx",
86
103
  "./src/components/NotificationManager.tsx",
104
+ "./src/components/ReleaseNotesManager.tsx",
87
105
  "./src/components/VirtualAssistant.tsx",
88
106
  "./src/components/useApplicationNavigationContext.tsx",
89
107
  "./src/components/useCommands.tsx",
@@ -23,7 +23,23 @@
23
23
  "forceConsistentCasingInFileNames": true,
24
24
  "outDir": "./lib",
25
25
  "tsBuildInfoFile": "./build/package.tsbuildinfo",
26
- "rootDir": "./"
26
+ "rootDir": "./",
27
+ "moduleResolution": "nodenext",
28
+ "moduleDetection": "force",
29
+ "isolatedModules": true,
30
+ "esModuleInterop": true,
31
+ "allowSyntheticDefaultImports": true,
32
+ "preserveConstEnums": true,
33
+ "incremental": true,
34
+ "useDefineForClassFields": true,
35
+ "noImplicitAny": true,
36
+ "noImplicitThis": true,
37
+ "strictNullChecks": true,
38
+ "strictFunctionTypes": true,
39
+ "strictBindCallApply": true,
40
+ "strictPropertyInitialization": true,
41
+ "alwaysStrict": true,
42
+ "useUnknownInCatchVariables": true
27
43
  },
28
44
  "files": [
29
45
  "./package.json"