@finsemble/finsemble-ui 7.0.0-beta.3 → 7.0.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 (72) hide show
  1. package/package.json +15 -15
  2. package/react/assets/css/notificationsCenter.css +1 -1
  3. package/react/assets/css/windowTitleBar.css +4 -4
  4. package/react/components/common/helpers.js +4 -0
  5. package/react/components/common/helpers.js.map +1 -1
  6. package/react/components/legacyControls/FinsembleDialog.js +1 -1
  7. package/react/components/legacyControls/FinsembleDialog.js.map +1 -1
  8. package/react/components/notifications/components/notificationsToasts/NotificationsToasts.js +14 -10
  9. package/react/components/notifications/components/notificationsToasts/NotificationsToasts.js.map +1 -1
  10. package/react/components/search/Highlight.stories.js +1 -1
  11. package/react/components/search/Highlight.stories.js.map +1 -1
  12. package/react/components/search/SearchResult.d.ts +5 -0
  13. package/react/components/search/SearchResult.js.map +1 -1
  14. package/react/components/search/SearchResult.spec.d.ts +1 -0
  15. package/react/components/search/SearchResult.spec.js +39 -0
  16. package/react/components/search/SearchResult.spec.js.map +1 -0
  17. package/react/components/search/SearchResult.stories.d.ts +16 -0
  18. package/react/components/search/SearchResult.stories.js +109 -0
  19. package/react/components/search/SearchResult.stories.js.map +1 -0
  20. package/react/components/search/SearchResults.spec.d.ts +1 -0
  21. package/react/components/search/SearchResults.spec.js +28 -0
  22. package/react/components/search/SearchResults.spec.js.map +1 -0
  23. package/react/components/search/SearchResults.stories.d.ts +11 -0
  24. package/react/components/search/SearchResults.stories.js +458 -0
  25. package/react/components/search/SearchResults.stories.js.map +1 -0
  26. package/react/components/singleInputDialog/SingleInputDialog.stories.js +2 -2
  27. package/react/components/singleInputDialog/SingleInputDialog.stories.js.map +1 -1
  28. package/react/components/toolbar/AutoArrange.spec.js +9 -4
  29. package/react/components/toolbar/AutoArrange.spec.js.map +1 -1
  30. package/react/components/toolbar/advancedAppLauncher/components/AppDefinition.js +7 -10
  31. package/react/components/toolbar/advancedAppLauncher/components/AppDefinition.js.map +1 -1
  32. package/react/components/toolbar/advancedAppLauncher/utils/sort-functions.js +1 -3
  33. package/react/components/toolbar/advancedAppLauncher/utils/sort-functions.js.map +1 -1
  34. package/react/components/toolbar/workspaceManagementMenu/WorkspaceManagementMenu.d.ts +1 -1
  35. package/react/components/toolbar/workspaceManagementMenu/WorkspaceManagementMenu.js.map +1 -1
  36. package/react/components/toolbar/workspaceManagementMenu/components/Workspace.d.ts +1 -1
  37. package/react/components/toolbar/workspaceManagementMenu/components/Workspace.js.map +1 -1
  38. package/react/components/toolbar/workspaceManagementMenu/components/WorkspaceList.d.ts +1 -1
  39. package/react/components/toolbar/workspaceManagementMenu/components/WorkspaceList.js.map +1 -1
  40. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.d.ts +1 -1
  41. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js +1 -1
  42. package/react/components/toolbar/workspaceManagementMenu/stores/workspaceManagementMenuStore.js.map +1 -1
  43. package/react/components/userPreferences/components/content/Workspaces.js +1 -1
  44. package/react/components/userPreferences/components/content/Workspaces.js.map +1 -1
  45. package/react/components/userPreferences/stores/UserPreferencesStore.d.ts +1 -1
  46. package/react/components/userPreferences/stores/UserPreferencesStore.js +8 -6
  47. package/react/components/userPreferences/stores/UserPreferencesStore.js.map +1 -1
  48. package/react/components/userPreferences/tests/LeftNav.spec.js +15 -1
  49. package/react/components/userPreferences/tests/LeftNav.spec.js.map +1 -1
  50. package/react/components/userPreferences/tests/UserPreferencesBase.spec.d.ts +1 -0
  51. package/react/components/userPreferences/tests/UserPreferencesBase.spec.js +42 -0
  52. package/react/components/userPreferences/tests/UserPreferencesBase.spec.js.map +1 -0
  53. package/react/components/userPreferences/tests/Workspace.spec.d.ts +1 -0
  54. package/react/components/userPreferences/tests/Workspace.spec.js +119 -0
  55. package/react/components/userPreferences/tests/Workspace.spec.js.map +1 -0
  56. package/react/components/windowTitleBar/WindowTitleBarShell.d.ts +2 -0
  57. package/react/components/windowTitleBar/WindowTitleBarShell.js +57 -23
  58. package/react/components/windowTitleBar/WindowTitleBarShell.js.map +1 -1
  59. package/react/components/windowTitleBar/components/windowTitle.js +78 -51
  60. package/react/components/windowTitleBar/components/windowTitle.js.map +1 -1
  61. package/react/components/windowTitleBar/stores/windowTitleBarStore.js +4 -10
  62. package/react/components/windowTitleBar/stores/windowTitleBarStore.js.map +1 -1
  63. package/react/components/yesNoDialog/YesNoDialog.stories.js +2 -2
  64. package/react/components/yesNoDialog/YesNoDialog.stories.js.map +1 -1
  65. package/react/enzymeSetup.js +5 -0
  66. package/react/enzymeSetup.js.map +1 -1
  67. package/react/hooks/useNotifications.js +4 -8
  68. package/react/hooks/useNotifications.js.map +1 -1
  69. package/react/hooks/useToolbar.d.ts +1 -1
  70. package/react/hooks/useToolbar.js +2 -2
  71. package/react/hooks/useToolbar.js.map +1 -1
  72. package/react/tsconfig.tsbuildinfo +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finsemble/finsemble-ui",
3
- "version": "7.0.0-beta.3",
3
+ "version": "7.0.0",
4
4
  "description": "Ready-made React components to give you a head-start building your SmartDesktop.",
5
5
  "types": "index.d.ts",
6
6
  "files": [
@@ -28,28 +28,28 @@
28
28
  "build-storybook": "build-storybook"
29
29
  },
30
30
  "dependencies": {
31
- "@finsemble/finsemble-api": "7.0.0-beta.3",
31
+ "@finsemble/finsemble-api": "7.0.0",
32
32
  "@q42/floating-focus-a11y": "^1.3.3",
33
33
  "@reduxjs/toolkit": "^1.5.0",
34
34
  "@svgr/webpack": "^5.5.0",
35
35
  "@types/async": "3.2.12",
36
- "@types/chai": "4.3.0",
37
- "@types/lodash": "4.14.181",
38
- "@types/mocha": "9.1.0",
39
- "@types/react": "17.0.43",
40
- "@types/react-dom": "17.0.14",
41
- "@types/react-redux": "7.1.23",
36
+ "@types/chai": "4.3.1",
37
+ "@types/lodash": "4.14.182",
38
+ "@types/mocha": "9.1.1",
39
+ "@types/react": "17.0.44",
40
+ "@types/react-dom": "17.0.15",
41
+ "@types/react-redux": "7.1.24",
42
42
  "@types/react-relative-portal": "^1.8.1",
43
43
  "async": "3.2.3",
44
44
  "date-fns": "^2.25.0",
45
45
  "immer": "9.0.12",
46
46
  "lodash": "4.17.21",
47
47
  "react-circular-progressbar": "^2.0.3",
48
- "react-redux": "7.2.6",
48
+ "react-redux": "7.2.8",
49
49
  "react-relative-portal": "^1.8.0",
50
50
  "react-sortable-hoc": "2.0.0",
51
51
  "react-transition-group": "4.4.2",
52
- "redux": "4.1.2",
52
+ "redux": "4.2.0",
53
53
  "redux-loop": "6.2.0",
54
54
  "unionize": "3.1.0"
55
55
  },
@@ -61,10 +61,10 @@
61
61
  "@babel/preset-env": "^7.16.0",
62
62
  "@babel/preset-react": "^7.12.10",
63
63
  "@babel/register": "^7.16.0",
64
- "@storybook/addon-actions": "6.4.19",
65
- "@storybook/addon-essentials": "6.4.19",
66
- "@storybook/addon-links": "6.4.19",
67
- "@storybook/react": "6.4.19",
64
+ "@storybook/addon-actions": "6.4.22",
65
+ "@storybook/addon-essentials": "6.4.22",
66
+ "@storybook/addon-links": "6.4.22",
67
+ "@storybook/react": "6.4.22",
68
68
  "@types/enzyme": "^3.10.8",
69
69
  "@types/react-syntax-highlighter": "13.5.2",
70
70
  "@types/react-transition-group": "4.4.4",
@@ -75,7 +75,7 @@
75
75
  "canvas": "^2.9.0",
76
76
  "chai": "4.3.6",
77
77
  "chokidar-cli": "3.0.0",
78
- "concurrently": "7.0.0",
78
+ "concurrently": "7.1.0",
79
79
  "copyfiles": "2.4.1",
80
80
  "core-js": "^3.15.2",
81
81
  "depcheck": "^1.4.3",
@@ -6,7 +6,7 @@ body.notifications-center-body {
6
6
  background-color: transparent;
7
7
  bottom: 0;
8
8
  margin: 0;
9
- overflow: hidden;
9
+ overflow: hidden !important; /* necessary to hide default scrollbar, cause the parent html element is restyled at the `hackScrollbar()` function */
10
10
  }
11
11
 
12
12
  body.notifications-center-body.notifications-popped-in {
@@ -56,8 +56,8 @@ body:after {
56
56
  background-color: var(--window-border-color);
57
57
  }
58
58
 
59
- /*
60
- * The next few items give the border of windows
59
+ /*
60
+ * The next few items give the border of windows
61
61
  * thickness so that the user can see them
62
62
  */
63
63
  html:before {
@@ -631,7 +631,7 @@ html.desktop-active .fsbl-active-tab .fsbl-tab-title {
631
631
  top: 1px;
632
632
  }
633
633
 
634
- .tab__input {
634
+ #title_editor_input {
635
635
  font-size: 12px;
636
636
  padding: 2px 10px;
637
637
  width: 80%;
@@ -642,7 +642,7 @@ html.desktop-active .fsbl-active-tab .fsbl-tab-title {
642
642
  background: transparent;
643
643
  }
644
644
 
645
- input:focus {
645
+ input.tab__input:focus {
646
646
  outline: none;
647
647
  animation: inputHighlighter 0.3s ease;
648
648
  }
@@ -72,6 +72,9 @@ export const initFSBL = (windowObject) => {
72
72
  addListener: () => { },
73
73
  subscribe: () => { },
74
74
  },
75
+ SearchClient: {
76
+ invokeItemAction: () => { },
77
+ },
75
78
  StorageClient: {
76
79
  save: () => { },
77
80
  clearCache: () => { },
@@ -81,6 +84,7 @@ export const initFSBL = (windowObject) => {
81
84
  },
82
85
  WorkspaceClient: {
83
86
  bringWindowsToFront: () => { },
87
+ autoArrange: () => { },
84
88
  minimizeAll: () => { },
85
89
  activeWorkspace: {
86
90
  name: " ",
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/common/helpers.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { FileInputUploadCb } from \"./FileInput\";\nimport { Story } from \"@storybook/react/types-6-0\";\n\nimport { SDServerInfo } from \"../../types/smartDesktopDesignerTypes\";\nimport { Provider } from \"react-redux\";\nimport { createStore } from \"../../store\";\n\nexport const uploadFunction: FileInputUploadCb = (fileObject: File) =>\n\tnew Promise((resolve) => {\n\t\tresolve({\n\t\t\terr: \"\",\n\t\t\tpath: fileObject.name,\n\t\t});\n\t});\n\nexport const initFSBL = (windowObject?: any) => {\n\t// Poor man's global that can take any appendage\n\tconst globalAsAny: any = global;\n\n\tif (!windowObject) {\n\t\twindowObject = globalAsAny.window = {} as any;\n\t} else {\n\t\twindowObject = window;\n\n\t\tsetTimeout(() => {\n\t\t\tconst event = window.document.createEvent(\"Event\");\n\n\t\t\tevent?.initEvent(\"FSBLReady\", true, true);\n\n\t\t\twindow.dispatchEvent(event);\n\t\t});\n\t}\n\n\tglobalAsAny.FSBL = windowObject.FSBL = {\n\t\taddEventListener: (name: String, callback: () => void) => {\n\t\t\tcallback();\n\t\t},\n\t\tgetFSBLInfo: () =>\n\t\t\tnew Promise((resolve) => {\n\t\t\t\tresolve({\n\t\t\t\t\tFSBLVersion: \"1.0.0\",\n\t\t\t\t});\n\t\t\t}),\n\t\tClients: {\n\t\t\tTmpSmartDesktopClient: {\n\t\t\t\tcheckValidURL(url: string) {\n\t\t\t\t\tif (url.length === 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn /^https?:\\/\\/[^\\s]+$/.test(url);\n\t\t\t\t},\n\t\t\t\tcheckValidProjectName(name: string) {\n\t\t\t\t\treturn /^[a-zA-Z0-9 \\-_.]{1,}$/.test(name) && /[a-zA-Z0-9]{1,}/.test(name);\n\t\t\t\t},\n\t\t\t} as unknown,\n\t\t\tConfigClient: {\n\t\t\t\tsetPreference: () => {},\n\t\t\t\tgetValues: () => {},\n\t\t\t\tgetPreferences: () => {},\n\t\t\t},\n\t\t\tDialogManager: {\n\t\t\t\tspawnDialog: (obj1: any) => {\n\t\t\t\t\tconsole.table(obj1);\n\t\t\t\t},\n\t\t\t\tregisterDialogCallback: () => {},\n\t\t\t\trespondToOpener: () => {},\n\t\t\t},\n\t\t\tLauncherClient: {\n\t\t\t\tshowWindow: () => {},\n\t\t\t},\n\t\t\tLogger: {\n\t\t\t\tlog: () => {},\n\t\t\t\terror: () => {},\n\t\t\t\tsystem: {\n\t\t\t\t\tdebug: () => {},\n\t\t\t\t\tlog: () => {},\n\t\t\t\t\terror: () => {},\n\t\t\t\t\tverbose: () => {},\n\t\t\t\t\tdeprecated: () => {},\n\t\t\t\t},\n\t\t\t},\n\t\t\tRouterClient: {\n\t\t\t\ttransmit: () => {},\n\t\t\t\taddListener: () => {},\n\t\t\t\tsubscribe: () => {},\n\t\t\t},\n\t\t\tStorageClient: {\n\t\t\t\tsave: () => {},\n\t\t\t\tclearCache: () => {},\n\t\t\t},\n\t\t\tWindowClient: {\n\t\t\t\tfitToDOM: () => {},\n\t\t\t},\n\t\t\tWorkspaceClient: {\n\t\t\t\tbringWindowsToFront: () => {},\n\t\t\t\tminimizeAll: () => {},\n\t\t\t\tactiveWorkspace: {\n\t\t\t\t\tname: \" \",\n\t\t\t\t},\n\t\t\t\tgetWorkspaceDefinition: (obj: Object, cb: Function) => {\n\t\t\t\t\tcb(null, null);\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tonShutdown: () => {},\n\t\tSystem: {\n\t\t\tgetSDServerInfo: () =>\n\t\t\t\tnew Promise((resolve) => {\n\t\t\t\t\tresolve({} as SDServerInfo);\n\t\t\t\t}),\n\t\t},\n\t\tSystemManagerClient: {\n\t\t\tpublishCheckpointState: () => {},\n\t\t},\n\t} as any;\n\n\tglobalAsAny.FSBL.Clients = {\n\t\t...globalAsAny.FSBL.Clients,\n\t\tWindowClient: {\n\t\t\tfitToDOM: () => {},\n\t\t} as any,\n\t};\n\n\tglobalAsAny.finsembleWindow = windowObject.finsembleWindow = {\n\t\tsetAlwaysOnTop: () => {},\n\t\taddEventListener: () => {},\n\t\tremoveEventListener: () => {},\n\t};\n};\n\nexport function createStory<T>(Component: Function, args: T) {\n\tconst template: Story<T> = (props: T) => {\n\t\tinitFSBL(window);\n\n\t\treturn (\n\t\t\t<Provider store={createStore()}>\n\t\t\t\t<Component {...{ ...args, ...props }} />\n\t\t\t</Provider>\n\t\t);\n\t};\n\n\ttemplate.args = args;\n\n\treturn template;\n}\n"]}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/components/common/helpers.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { FileInputUploadCb } from \"./FileInput\";\nimport { Story } from \"@storybook/react/types-6-0\";\n\nimport { SDServerInfo } from \"../../types/smartDesktopDesignerTypes\";\nimport { Provider } from \"react-redux\";\nimport { createStore } from \"../../store\";\n\nexport const uploadFunction: FileInputUploadCb = (fileObject: File) =>\n\tnew Promise((resolve) => {\n\t\tresolve({\n\t\t\terr: \"\",\n\t\t\tpath: fileObject.name,\n\t\t});\n\t});\n\nexport const initFSBL = (windowObject?: any) => {\n\t// Poor man's global that can take any appendage\n\tconst globalAsAny: any = global;\n\n\tif (!windowObject) {\n\t\twindowObject = globalAsAny.window = {} as any;\n\t} else {\n\t\twindowObject = window;\n\n\t\tsetTimeout(() => {\n\t\t\tconst event = window.document.createEvent(\"Event\");\n\n\t\t\tevent?.initEvent(\"FSBLReady\", true, true);\n\n\t\t\twindow.dispatchEvent(event);\n\t\t});\n\t}\n\n\tglobalAsAny.FSBL = windowObject.FSBL = {\n\t\taddEventListener: (name: String, callback: () => void) => {\n\t\t\tcallback();\n\t\t},\n\t\tgetFSBLInfo: () =>\n\t\t\tnew Promise((resolve) => {\n\t\t\t\tresolve({\n\t\t\t\t\tFSBLVersion: \"1.0.0\",\n\t\t\t\t});\n\t\t\t}),\n\t\tClients: {\n\t\t\tTmpSmartDesktopClient: {\n\t\t\t\tcheckValidURL(url: string) {\n\t\t\t\t\tif (url.length === 0) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn /^https?:\\/\\/[^\\s]+$/.test(url);\n\t\t\t\t},\n\t\t\t\tcheckValidProjectName(name: string) {\n\t\t\t\t\treturn /^[a-zA-Z0-9 \\-_.]{1,}$/.test(name) && /[a-zA-Z0-9]{1,}/.test(name);\n\t\t\t\t},\n\t\t\t} as unknown,\n\t\t\tConfigClient: {\n\t\t\t\tsetPreference: () => {},\n\t\t\t\tgetValues: () => {},\n\t\t\t\tgetPreferences: () => {},\n\t\t\t},\n\t\t\tDialogManager: {\n\t\t\t\tspawnDialog: (obj1: any) => {\n\t\t\t\t\tconsole.table(obj1);\n\t\t\t\t},\n\t\t\t\tregisterDialogCallback: () => {},\n\t\t\t\trespondToOpener: () => {},\n\t\t\t},\n\t\t\tLauncherClient: {\n\t\t\t\tshowWindow: () => {},\n\t\t\t},\n\t\t\tLogger: {\n\t\t\t\tlog: () => {},\n\t\t\t\terror: () => {},\n\t\t\t\tsystem: {\n\t\t\t\t\tdebug: () => {},\n\t\t\t\t\tlog: () => {},\n\t\t\t\t\terror: () => {},\n\t\t\t\t\tverbose: () => {},\n\t\t\t\t\tdeprecated: () => {},\n\t\t\t\t},\n\t\t\t},\n\t\t\tRouterClient: {\n\t\t\t\ttransmit: () => {},\n\t\t\t\taddListener: () => {},\n\t\t\t\tsubscribe: () => {},\n\t\t\t},\n\t\t\tSearchClient: {\n\t\t\t\tinvokeItemAction: () => {},\n\t\t\t},\n\t\t\tStorageClient: {\n\t\t\t\tsave: () => {},\n\t\t\t\tclearCache: () => {},\n\t\t\t},\n\t\t\tWindowClient: {\n\t\t\t\tfitToDOM: () => {},\n\t\t\t},\n\t\t\tWorkspaceClient: {\n\t\t\t\tbringWindowsToFront: () => {},\n\t\t\t\tautoArrange: () => {},\n\t\t\t\tminimizeAll: () => {},\n\t\t\t\tactiveWorkspace: {\n\t\t\t\t\tname: \" \",\n\t\t\t\t},\n\t\t\t\tgetWorkspaceDefinition: (obj: Object, cb: Function) => {\n\t\t\t\t\tcb(null, null);\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tonShutdown: () => {},\n\t\tSystem: {\n\t\t\tgetSDServerInfo: () =>\n\t\t\t\tnew Promise((resolve) => {\n\t\t\t\t\tresolve({} as SDServerInfo);\n\t\t\t\t}),\n\t\t},\n\t\tSystemManagerClient: {\n\t\t\tpublishCheckpointState: () => {},\n\t\t},\n\t} as any;\n\n\tglobalAsAny.FSBL.Clients = {\n\t\t...globalAsAny.FSBL.Clients,\n\t\tWindowClient: {\n\t\t\tfitToDOM: () => {},\n\t\t} as any,\n\t};\n\n\tglobalAsAny.finsembleWindow = windowObject.finsembleWindow = {\n\t\tsetAlwaysOnTop: () => {},\n\t\taddEventListener: () => {},\n\t\tremoveEventListener: () => {},\n\t};\n};\n\nexport function createStory<T>(Component: Function, args: T) {\n\tconst template: Story<T> = (props: T) => {\n\t\tinitFSBL(window);\n\n\t\treturn (\n\t\t\t<Provider store={createStore()}>\n\t\t\t\t<Component {...{ ...args, ...props }} />\n\t\t\t</Provider>\n\t\t);\n\t};\n\n\ttemplate.args = args;\n\n\treturn template;\n}\n"]}
@@ -7,7 +7,7 @@ const DIALOG_BASE_CLASS = "dialog";
7
7
  export const FinsembleDialog = (props) => {
8
8
  let { userInputTimeout, onShowRequested, isModal, className, children } = props;
9
9
  const handleKeyDown = (e) => {
10
- if (FSBL.Clients.DialogManager.openerMessage === null && e.key === "Escape") {
10
+ if (e.key === "Escape" && FSBL.Clients.DialogManager.openerMessage === null) {
11
11
  finsembleWindow.hide();
12
12
  }
13
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"FinsembleDialog.js","sourceRoot":"","sources":["../../../src/components/legacyControls/FinsembleDialog.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAcnC,MAAM,CAAC,MAAM,eAAe,GAAkD,CAAC,KAAU,EAAE,EAAE;IAC5F,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEhF,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE;YAC5E,eAAe,CAAC,IAAI,EAAE,CAAC;SACvB;IACF,CAAC,CAAC;IAEF,eAAe,CAAC,cAAc,CAAC;QAC9B,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,OAAO,eAAe,KAAK,WAAW,EAAE;QAC3C,MAAM,IAAI,KAAK,CACd,oHAAoH,CACpH,CAAC;KACF;IAMD,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC5C,gBAAgB,GAAG,KAAK,CAAC;KACzB;IAED,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAM/D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACpB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC;QAE9D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAEnE,IAAI,OAAO,EAAE;YACZ,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAChF,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACjF;QAED,OAAO,GAAG,EAAE;YACX,IAAI,OAAO,EAAE;gBACZ,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBACnF,eAAe,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;aACpF;QACF,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,iBAAiB,EAAE,CAAC;IACpD,OAAO,6BAAK,SAAS,EAAE,OAAO,IAAG,QAAQ,CAAO,CAAC;AAClD,CAAC,CAAC","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\n\nimport * as React from \"react\";\nconst DIALOG_BASE_CLASS = \"dialog\";\nexport type FinsembleDialogProps = {\n\tbehaviorOnResponse?: \"close\" | \"hide\";\n\tuserInputTimeout?: number;\n\tonShowRequested?: (err: any, response: any) => void;\n\tisModal: boolean;\n\tclassName?: string;\n\tchildren?: any;\n};\n\n/**\n * This is a component that adds some baked in behavior that is common accross several\n * of the finsemble dialogs. Hiding/closing on blur, timing out, etc.\n */\nexport const FinsembleDialog: React.FunctionComponent<FinsembleDialogProps> = (props: any) => {\n\tlet { userInputTimeout, onShowRequested, isModal, className, children } = props;\n\n\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\tif (FSBL.Clients.DialogManager.openerMessage === null && e.key === \"Escape\") {\n\t\t\tfinsembleWindow.hide();\n\t\t}\n\t};\n\n\tfinsembleWindow.setAlwaysOnTop({\n\t\talwaysOnTop: true,\n\t});\n\n\tif (typeof onShowRequested === \"undefined\") {\n\t\tthrow new Error(\n\t\t\t\"No onShowRequested passed to FinsembleDialog. Pass onShowRequested as a property to the FinsembleDialog component.\"\n\t\t);\n\t}\n\n\t/*if (typeof behaviorOnResponse === \"undefined\") {\n\t\tbehaviorOnResponse = \"hide\";\n\t}*/\n\n\tif (typeof userInputTimeout === \"undefined\") {\n\t\tuserInputTimeout = 10000;\n\t}\n\n\tFSBL.Clients.DialogManager.userInputTimeout = userInputTimeout;\n\t//FSBL.Clients.DialogManager.behaviorOnResponse = behaviorOnResponse;\n\n\t/**\n\t * Registers some event listeners the first time this component is rendered.\n\t */\n\tReact.useEffect(() => {\n\t\tdocument.body.addEventListener(\"keydown\", handleKeyDown);\n\t\tdocument.body.className = `${document.body.className} dialog`;\n\n\t\tFSBL.Clients.DialogManager.registerDialogCallback(onShowRequested);\n\n\t\tif (isModal) {\n\t\t\tfinsembleWindow.addEventListener(\"shown\", FSBL.Clients.DialogManager.showModal);\n\t\t\tfinsembleWindow.addEventListener(\"hidden\", FSBL.Clients.DialogManager.hideModal);\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (isModal) {\n\t\t\t\tfinsembleWindow.removeEventListener(\"shown\", FSBL.Clients.DialogManager.showModal);\n\t\t\t\tfinsembleWindow.removeEventListener(\"hidden\", FSBL.Clients.DialogManager.hideModal);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst classes = `${className} ${DIALOG_BASE_CLASS}`;\n\treturn <div className={classes}>{children}</div>;\n};\n"]}
1
+ {"version":3,"file":"FinsembleDialog.js","sourceRoot":"","sources":["../../../src/components/legacyControls/FinsembleDialog.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAcnC,MAAM,CAAC,MAAM,eAAe,GAAkD,CAAC,KAAU,EAAE,EAAE;IAC5F,IAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAEhF,MAAM,aAAa,GAAG,CAAC,CAAgB,EAAE,EAAE;QAK1C,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI,EAAE;YAC5E,eAAe,CAAC,IAAI,EAAE,CAAC;SACvB;IACF,CAAC,CAAC;IAEF,eAAe,CAAC,cAAc,CAAC;QAC9B,WAAW,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,IAAI,OAAO,eAAe,KAAK,WAAW,EAAE;QAC3C,MAAM,IAAI,KAAK,CACd,oHAAoH,CACpH,CAAC;KACF;IAMD,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC5C,gBAAgB,GAAG,KAAK,CAAC;KACzB;IAED,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAM/D,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACpB,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;QACzD,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC;QAE9D,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,eAAe,CAAC,CAAC;QAEnE,IAAI,OAAO,EAAE;YACZ,eAAe,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YAChF,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SACjF;QAED,OAAO,GAAG,EAAE;YACX,IAAI,OAAO,EAAE;gBACZ,eAAe,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;gBACnF,eAAe,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;aACpF;QACF,CAAC,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,iBAAiB,EAAE,CAAC;IACpD,OAAO,6BAAK,SAAS,EAAE,OAAO,IAAG,QAAQ,CAAO,CAAC;AAClD,CAAC,CAAC","sourcesContent":["/*!\n * Copyright 2017 by ChartIQ, Inc.\n * All rights reserved.\n */\n\nimport * as React from \"react\";\nconst DIALOG_BASE_CLASS = \"dialog\";\nexport type FinsembleDialogProps = {\n\tbehaviorOnResponse?: \"close\" | \"hide\";\n\tuserInputTimeout?: number;\n\tonShowRequested?: (err: any, response: any) => void;\n\tisModal: boolean;\n\tclassName?: string;\n\tchildren?: any;\n};\n\n/**\n * This is a component that adds some baked in behavior that is common accross several\n * of the finsemble dialogs. Hiding/closing on blur, timing out, etc.\n */\nexport const FinsembleDialog: React.FunctionComponent<FinsembleDialogProps> = (props: any) => {\n\tlet { userInputTimeout, onShowRequested, isModal, className, children } = props;\n\n\tconst handleKeyDown = (e: KeyboardEvent) => {\n\t\t// If the user hits escape then hide the window\n\t\t// openerMessage won't be null if data is in transit to the originating window, in which\n\t\t// case we bypass the hide() -- this is some sort of race condition from a long time ago\n\t\t// that is not fully understood\n\t\tif (e.key === \"Escape\" && FSBL.Clients.DialogManager.openerMessage === null) {\n\t\t\tfinsembleWindow.hide();\n\t\t}\n\t};\n\n\tfinsembleWindow.setAlwaysOnTop({\n\t\talwaysOnTop: true,\n\t});\n\n\tif (typeof onShowRequested === \"undefined\") {\n\t\tthrow new Error(\n\t\t\t\"No onShowRequested passed to FinsembleDialog. Pass onShowRequested as a property to the FinsembleDialog component.\"\n\t\t);\n\t}\n\n\t/*if (typeof behaviorOnResponse === \"undefined\") {\n\t\tbehaviorOnResponse = \"hide\";\n\t}*/\n\n\tif (typeof userInputTimeout === \"undefined\") {\n\t\tuserInputTimeout = 10000;\n\t}\n\n\tFSBL.Clients.DialogManager.userInputTimeout = userInputTimeout;\n\t//FSBL.Clients.DialogManager.behaviorOnResponse = behaviorOnResponse;\n\n\t/**\n\t * Registers some event listeners the first time this component is rendered.\n\t */\n\tReact.useEffect(() => {\n\t\tdocument.body.addEventListener(\"keydown\", handleKeyDown);\n\t\tdocument.body.className = `${document.body.className} dialog`;\n\n\t\tFSBL.Clients.DialogManager.registerDialogCallback(onShowRequested);\n\n\t\tif (isModal) {\n\t\t\tfinsembleWindow.addEventListener(\"shown\", FSBL.Clients.DialogManager.showModal);\n\t\t\tfinsembleWindow.addEventListener(\"hidden\", FSBL.Clients.DialogManager.hideModal);\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (isModal) {\n\t\t\t\tfinsembleWindow.removeEventListener(\"shown\", FSBL.Clients.DialogManager.showModal);\n\t\t\t\tfinsembleWindow.removeEventListener(\"hidden\", FSBL.Clients.DialogManager.hideModal);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tconst classes = `${className} ${DIALOG_BASE_CLASS}`;\n\treturn <div className={classes}>{children}</div>;\n};\n"]}
@@ -4,13 +4,22 @@ import { NotificationCardShell } from "../shared/NotificationCardShell";
4
4
  import { CSSTransition } from "react-transition-group";
5
5
  import "../../../../assets/css/notificationsCenter.css";
6
6
  const ToastCard = (props) => {
7
- const notificationRef = useRef();
8
7
  const { notification, informationalNotificationTimeout, removeFunction, isActiveFunction, actionableTimeoutEnabled } = props;
8
+ const notificationRef = useRef(notification);
9
9
  const [slideIn, setSlideIn] = useState(isActiveFunction(notification));
10
10
  const [showNotification] = useState(isActiveFunction(notification));
11
+ const [timeoutId, setTimeoutId] = useState();
11
12
  useEffect(() => {
12
- notificationRef.current = notification;
13
- let timeoutId;
13
+ return () => {
14
+ if (timeoutId) {
15
+ clearInterval(timeoutId);
16
+ }
17
+ };
18
+ }, []);
19
+ useEffect(() => {
20
+ if (timeoutId) {
21
+ clearInterval(timeoutId);
22
+ }
14
23
  if (!notification.actions || notification.actions.length == 0 || actionableTimeoutEnabled) {
15
24
  let timeoutLength;
16
25
  if (informationalNotificationTimeout !== false) {
@@ -20,16 +29,11 @@ const ToastCard = (props) => {
20
29
  }
21
30
  }
22
31
  if (timeoutLength) {
23
- timeoutId = setTimeout(() => {
32
+ setTimeoutId(setTimeout(() => {
24
33
  setSlideIn(false);
25
- }, timeoutLength);
34
+ }, timeoutLength));
26
35
  }
27
36
  }
28
- return () => {
29
- clearInterval(timeoutId);
30
- };
31
- }, []);
32
- useEffect(() => {
33
37
  if (!isActiveFunction(notificationRef.current)) {
34
38
  removeFunction(notification);
35
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NotificationsToasts.js","sourceRoot":"","sources":["../../../../../src/components/notifications/components/notificationsToasts/NotificationsToasts.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport useNotifications, {\n\tuseNotificationUI,\n\tmoveToToolbarMonitor,\n\tgetNotificationConfig,\n\tgetOS,\n} from \"../../../../hooks/useNotifications\";\nimport { NotificationCardShell } from \"../shared/NotificationCardShell\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { INotificationToastsProps } from \"../../types\";\nimport \"../../../../assets/css/notificationsCenter.css\";\nimport { services } from \"@finsemble/finsemble-api\";\n\ntype INotification = services.notification.types.INotification;\n\ntype ToastCardProps = {\n\tnotification: INotification;\n\tremoveFunction: Function;\n\tisActiveFunction: Function;\n\tinformationalNotificationTimeout: number | false;\n\tactionableTimeoutEnabled: boolean;\n\tnotificationCard?: React.ComponentType<any>;\n};\n\nconst ToastCard = (props: ToastCardProps) => {\n\tconst notificationRef = useRef<INotification>();\n\tconst { notification, informationalNotificationTimeout, removeFunction, isActiveFunction, actionableTimeoutEnabled } =\n\t\tprops;\n\tconst [slideIn, setSlideIn] = useState(isActiveFunction(notification));\n\tconst [showNotification] = useState(isActiveFunction(notification));\n\n\tuseEffect(() => {\n\t\tnotificationRef.current = notification;\n\t\tlet timeoutId: any;\n\n\t\tif (!notification.actions || notification.actions.length == 0 || actionableTimeoutEnabled) {\n\t\t\t// Is an informational notification or timeout enabled actionable notifications\n\t\t\tlet timeoutLength;\n\n\t\t\tif (informationalNotificationTimeout !== false) {\n\t\t\t\t// Convert to milliseconds\n\t\t\t\ttimeoutLength = informationalNotificationTimeout * 1000;\n\t\t\t\tif (notification.timeout && Number.isInteger(notification.timeout)) {\n\t\t\t\t\ttimeoutLength = notification.timeout;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (timeoutLength) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tsetSlideIn(false);\n\t\t\t\t}, timeoutLength);\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tclearInterval(timeoutId);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (!isActiveFunction(notificationRef.current)) {\n\t\t\tremoveFunction(notification);\n\t\t}\n\t\tsetSlideIn(isActiveFunction(notification));\n\t}, [notification]);\n\n\tconst onExited = () => {\n\t\tremoveFunction(notification);\n\t};\n\n\tconst Card = props.notificationCard ? props.notificationCard : NotificationCardShell;\n\n\treturn (\n\t\tshowNotification && (\n\t\t\t<CSSTransition in={slideIn} timeout={500} onExited={onExited} classNames=\"notifications-toast\">\n\t\t\t\t<div className=\"notifications-toast__offscreen\">\n\t\t\t\t\t<Card\n\t\t\t\t\t\tnotification={notification}\n\t\t\t\t\t\tuiContext=\"toasts\"\n\t\t\t\t\t\tremoveNotification={() => {\n\t\t\t\t\t\t\tsetSlideIn(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"divider\">&nbsp;</div>\n\t\t\t\t</div>\n\t\t\t</CSSTransition>\n\t\t)\n\t);\n};\n\nexport const NotificationsToasts: React.FunctionComponent<INotificationToastsProps> = (props) => {\n\tconst { notifications, notificationIsActive, setOpaqueClassName, removeNotification, activeNotifications } =\n\t\tuseNotifications({ config: { notificationsHistory: { options: { sentAfter: \"startup\" } } } });\n\tconst notificationsRef = useRef<INotification[]>(notifications);\n\tconst [uiState] = useNotificationUI();\n\n\tconst isNotificationActive = (notification: INotification): boolean => {\n\t\tconst notificationCenterNotActive = !uiState.showCenter || uiState.poppedOut;\n\t\treturn notificationIsActive(notification) && notificationCenterNotActive;\n\t};\n\n\tconst config = getNotificationConfig();\n\tconst [isMac] = useState(getOS() === \"Mac\");\n\n\tconst [informationalTimeout, setInformationalTimeout] = useState<number | false>(false);\n\tconst [actionableTimeoutEnabled, setActionableTimeoutEnabled] = useState<boolean>(true);\n\n\tuseEffect(() => {\n\t\tasync function listenForPreferenceChange(error: any, response: any) {\n\t\t\tif (error) {\n\t\t\t\tconsole.error(\"FinsembleUserPreferencesChannel: \", error);\n\t\t\t} else {\n\t\t\t\tconst { data } = response;\n\t\t\t\tif (data.notificationPreferences) {\n\t\t\t\t\tconst { informationalNotificationToastPeriodSeconds, toastTimeoutOnActionableNotifications } =\n\t\t\t\t\t\tdata.notificationPreferences;\n\n\t\t\t\t\tif (informationalNotificationToastPeriodSeconds) {\n\t\t\t\t\t\tsetInformationalTimeout(informationalNotificationToastPeriodSeconds);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof toastTimeoutOnActionableNotifications !== \"undefined\") {\n\t\t\t\t\t\tsetActionableTimeoutEnabled(toastTimeoutOnActionableNotifications);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tFSBL.Clients.RouterClient.addListener(\"FinsembleUserPreferencesChannel\", listenForPreferenceChange);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"FinsembleUserPreferencesChannel\", listenForPreferenceChange);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst transparencySupported = config.isTransparent;\n\n\t\tsetOpaqueClassName(!transparencySupported);\n\n\t\tif (transparencySupported) {\n\t\t\tfinsembleWindow.show();\n\t\t}\n\n\t\tasync function getNotificationsPreferences() {\n\t\t\treturn await FSBL.Clients.NotificationClient.getPreferences();\n\t\t}\n\n\t\tgetNotificationsPreferences().then((preferences: any) => {\n\t\t\tsetInformationalTimeout(preferences.informationalNotificationToastPeriodSeconds);\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tmoveToToolbarMonitor().then(async () => {\n\t\t\tlet forceHide = false;\n\t\t\tif (\n\t\t\t\tactiveNotifications(notifications).length === 0 &&\n\t\t\t\tactiveNotifications(notificationsRef.current).length === 0\n\t\t\t) {\n\t\t\t\t// Bug fix: Toasts flash when inActive components (partially caused by allowing notifications to animate out)\n\t\t\t\tforceHide = true;\n\t\t\t}\n\n\t\t\tnotificationsRef.current = notifications;\n\t\t\tconst rect = document.getElementById(\"notifications-toasts\")?.getBoundingClientRect();\n\t\t\tif (notifications.length === 0 || forceHide) {\n\t\t\t\tif (config.isTransparent && !isMac) {\n\t\t\t\t\tconst roundedRect = {\n\t\t\t\t\t\tx: Math.round(rect?.x as number),\n\t\t\t\t\t\ty: Math.round(rect?.y as number),\n\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t};\n\n\t\t\t\t\tfinsembleWindow.setShape([roundedRect]);\n\t\t\t\t}\n\n\t\t\t\tfinsembleWindow.hide();\n\t\t\t} else {\n\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\tif (config.isTransparent && !isMac) {\n\t\t\t\t\tconst roundedRect = {\n\t\t\t\t\t\tx: Math.round(rect?.x as number),\n\t\t\t\t\t\ty: Math.round(rect?.y as number),\n\t\t\t\t\t\twidth: Math.round(rect?.width as number),\n\t\t\t\t\t\theight: Math.round(rect?.height as number),\n\t\t\t\t\t};\n\n\t\t\t\t\tawait finsembleWindow.show();\n\t\t\t\t\tfinsembleWindow.setShape([roundedRect]);\n\t\t\t\t} else {\n\t\t\t\t\tawait finsembleWindow.show();\n\t\t\t\t\tconst { err, data } = await FSBL.Clients.LauncherClient.getMonitorInfo({ monitor: \"mine\" });\n\t\t\t\t\tif (err || !data) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { data: bounds } = await finsembleWindow.getBounds();\n\t\t\t\t\tconst width = (bounds?.right ?? 0) - (bounds?.left ?? 0);\n\t\t\t\t\tconst height = Math.round(rect?.height as number) + 6;\n\n\t\t\t\t\tawait finsembleWindow.setBounds({\n\t\t\t\t\t\tbounds: {\n\t\t\t\t\t\t\ttop: data[\"availableRect\"][\"top\"],\n\t\t\t\t\t\t\tleft: data[\"availableRect\"][\"right\"] - width,\n\t\t\t\t\t\t\theight: height + 10,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}, [notifications]);\n\n\treturn (\n\t\t<div>\n\t\t\t{notifications.map((notification: INotification) => (\n\t\t\t\t<ToastCard\n\t\t\t\t\tkey={`toast-card-${notification.id}`}\n\t\t\t\t\tnotification={notification}\n\t\t\t\t\tinformationalNotificationTimeout={informationalTimeout}\n\t\t\t\t\tactionableTimeoutEnabled={actionableTimeoutEnabled}\n\t\t\t\t\tremoveFunction={removeNotification}\n\t\t\t\t\tisActiveFunction={isNotificationActive}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n"]}
1
+ {"version":3,"file":"NotificationsToasts.js","sourceRoot":"","sources":["../../../../../src/components/notifications/components/notificationsToasts/NotificationsToasts.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport useNotifications, {\n\tuseNotificationUI,\n\tmoveToToolbarMonitor,\n\tgetNotificationConfig,\n\tgetOS,\n} from \"../../../../hooks/useNotifications\";\nimport { NotificationCardShell } from \"../shared/NotificationCardShell\";\nimport { CSSTransition } from \"react-transition-group\";\nimport { INotificationToastsProps } from \"../../types\";\nimport \"../../../../assets/css/notificationsCenter.css\";\nimport { services } from \"@finsemble/finsemble-api\";\n\ntype INotification = services.notification.types.INotification;\n\ntype ToastCardProps = {\n\tnotification: INotification;\n\tremoveFunction: Function;\n\tisActiveFunction: Function;\n\tinformationalNotificationTimeout: number | false;\n\tactionableTimeoutEnabled: boolean;\n\tnotificationCard?: React.ComponentType<any>;\n};\n\nconst ToastCard = (props: ToastCardProps) => {\n\tconst { notification, informationalNotificationTimeout, removeFunction, isActiveFunction, actionableTimeoutEnabled } =\n\t\tprops;\n\tconst notificationRef = useRef<INotification>(notification);\n\tconst [slideIn, setSlideIn] = useState(isActiveFunction(notification));\n\tconst [showNotification] = useState(isActiveFunction(notification));\n\tconst [timeoutId, setTimeoutId] = useState<number>();\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (timeoutId) {\n\t\t\t\tclearInterval(timeoutId);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (timeoutId) {\n\t\t\tclearInterval(timeoutId);\n\t\t}\n\n\t\tif (!notification.actions || notification.actions.length == 0 || actionableTimeoutEnabled) {\n\t\t\t// Is an informational notification or timeout enabled actionable notifications\n\t\t\tlet timeoutLength;\n\n\t\t\tif (informationalNotificationTimeout !== false) {\n\t\t\t\t// Convert to milliseconds\n\t\t\t\ttimeoutLength = informationalNotificationTimeout * 1000;\n\t\t\t\tif (notification.timeout && Number.isInteger(notification.timeout)) {\n\t\t\t\t\ttimeoutLength = notification.timeout;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (timeoutLength) {\n\t\t\t\tsetTimeoutId(\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tsetSlideIn(false);\n\t\t\t\t\t}, timeoutLength) as any\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!isActiveFunction(notificationRef.current)) {\n\t\t\tremoveFunction(notification);\n\t\t}\n\t\tsetSlideIn(isActiveFunction(notification));\n\t}, [notification]);\n\n\tconst onExited = () => {\n\t\tremoveFunction(notification);\n\t};\n\n\tconst Card = props.notificationCard ? props.notificationCard : NotificationCardShell;\n\n\treturn (\n\t\tshowNotification && (\n\t\t\t<CSSTransition in={slideIn} timeout={500} onExited={onExited} classNames=\"notifications-toast\">\n\t\t\t\t<div className=\"notifications-toast__offscreen\">\n\t\t\t\t\t<Card\n\t\t\t\t\t\tnotification={notification}\n\t\t\t\t\t\tuiContext=\"toasts\"\n\t\t\t\t\t\tremoveNotification={() => {\n\t\t\t\t\t\t\tsetSlideIn(false);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<div className=\"divider\">&nbsp;</div>\n\t\t\t\t</div>\n\t\t\t</CSSTransition>\n\t\t)\n\t);\n};\n\nexport const NotificationsToasts: React.FunctionComponent<INotificationToastsProps> = (props) => {\n\tconst { notifications, notificationIsActive, setOpaqueClassName, removeNotification, activeNotifications } =\n\t\tuseNotifications({ config: { notificationsHistory: { options: { sentAfter: \"startup\" } } } });\n\tconst notificationsRef = useRef<INotification[]>(notifications);\n\tconst [uiState] = useNotificationUI();\n\n\tconst isNotificationActive = (notification: INotification): boolean => {\n\t\tconst notificationCenterNotActive = !uiState.showCenter || uiState.poppedOut;\n\t\treturn notificationIsActive(notification) && notificationCenterNotActive;\n\t};\n\n\tconst config = getNotificationConfig();\n\tconst [isMac] = useState(getOS() === \"Mac\");\n\n\tconst [informationalTimeout, setInformationalTimeout] = useState<number | false>(false);\n\tconst [actionableTimeoutEnabled, setActionableTimeoutEnabled] = useState<boolean>(true);\n\n\tuseEffect(() => {\n\t\tasync function listenForPreferenceChange(error: any, response: any) {\n\t\t\tif (error) {\n\t\t\t\tconsole.error(\"FinsembleUserPreferencesChannel: \", error);\n\t\t\t} else {\n\t\t\t\tconst { data } = response;\n\t\t\t\tif (data.notificationPreferences) {\n\t\t\t\t\tconst { informationalNotificationToastPeriodSeconds, toastTimeoutOnActionableNotifications } =\n\t\t\t\t\t\tdata.notificationPreferences;\n\n\t\t\t\t\tif (informationalNotificationToastPeriodSeconds) {\n\t\t\t\t\t\tsetInformationalTimeout(informationalNotificationToastPeriodSeconds);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (typeof toastTimeoutOnActionableNotifications !== \"undefined\") {\n\t\t\t\t\t\tsetActionableTimeoutEnabled(toastTimeoutOnActionableNotifications);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tFSBL.Clients.RouterClient.addListener(\"FinsembleUserPreferencesChannel\", listenForPreferenceChange);\n\t\treturn () => {\n\t\t\tFSBL.Clients.RouterClient.removeListener(\"FinsembleUserPreferencesChannel\", listenForPreferenceChange);\n\t\t};\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst transparencySupported = config.isTransparent;\n\n\t\tsetOpaqueClassName(!transparencySupported);\n\n\t\tif (transparencySupported) {\n\t\t\tfinsembleWindow.show();\n\t\t}\n\n\t\tasync function getNotificationsPreferences() {\n\t\t\treturn await FSBL.Clients.NotificationClient.getPreferences();\n\t\t}\n\n\t\tgetNotificationsPreferences().then((preferences: any) => {\n\t\t\tsetInformationalTimeout(preferences.informationalNotificationToastPeriodSeconds);\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tmoveToToolbarMonitor().then(async () => {\n\t\t\tlet forceHide = false;\n\t\t\tif (\n\t\t\t\tactiveNotifications(notifications).length === 0 &&\n\t\t\t\tactiveNotifications(notificationsRef.current).length === 0\n\t\t\t) {\n\t\t\t\t// Bug fix: Toasts flash when inActive components (partially caused by allowing notifications to animate out)\n\t\t\t\tforceHide = true;\n\t\t\t}\n\n\t\t\tnotificationsRef.current = notifications;\n\t\t\tconst rect = document.getElementById(\"notifications-toasts\")?.getBoundingClientRect();\n\t\t\tif (notifications.length === 0 || forceHide) {\n\t\t\t\tif (config.isTransparent && !isMac) {\n\t\t\t\t\tconst roundedRect = {\n\t\t\t\t\t\tx: Math.round(rect?.x as number),\n\t\t\t\t\t\ty: Math.round(rect?.y as number),\n\t\t\t\t\t\twidth: 1,\n\t\t\t\t\t\theight: 1,\n\t\t\t\t\t};\n\n\t\t\t\t\tfinsembleWindow.setShape([roundedRect]);\n\t\t\t\t}\n\n\t\t\t\tfinsembleWindow.hide();\n\t\t\t} else {\n\t\t\t\tfinsembleWindow.bringToFront();\n\t\t\t\tif (config.isTransparent && !isMac) {\n\t\t\t\t\tconst roundedRect = {\n\t\t\t\t\t\tx: Math.round(rect?.x as number),\n\t\t\t\t\t\ty: Math.round(rect?.y as number),\n\t\t\t\t\t\twidth: Math.round(rect?.width as number),\n\t\t\t\t\t\theight: Math.round(rect?.height as number),\n\t\t\t\t\t};\n\n\t\t\t\t\tawait finsembleWindow.show();\n\t\t\t\t\tfinsembleWindow.setShape([roundedRect]);\n\t\t\t\t} else {\n\t\t\t\t\tawait finsembleWindow.show();\n\t\t\t\t\tconst { err, data } = await FSBL.Clients.LauncherClient.getMonitorInfo({ monitor: \"mine\" });\n\t\t\t\t\tif (err || !data) {\n\t\t\t\t\t\tconsole.error(err);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { data: bounds } = await finsembleWindow.getBounds();\n\t\t\t\t\tconst width = (bounds?.right ?? 0) - (bounds?.left ?? 0);\n\t\t\t\t\tconst height = Math.round(rect?.height as number) + 6;\n\n\t\t\t\t\tawait finsembleWindow.setBounds({\n\t\t\t\t\t\tbounds: {\n\t\t\t\t\t\t\ttop: data[\"availableRect\"][\"top\"],\n\t\t\t\t\t\t\tleft: data[\"availableRect\"][\"right\"] - width,\n\t\t\t\t\t\t\theight: height + 10,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}, [notifications]);\n\n\treturn (\n\t\t<div>\n\t\t\t{notifications.map((notification: INotification) => (\n\t\t\t\t<ToastCard\n\t\t\t\t\tkey={`toast-card-${notification.id}`}\n\t\t\t\t\tnotification={notification}\n\t\t\t\t\tinformationalNotificationTimeout={informationalTimeout}\n\t\t\t\t\tactionableTimeoutEnabled={actionableTimeoutEnabled}\n\t\t\t\t\tremoveFunction={removeNotification}\n\t\t\t\t\tisActiveFunction={isNotificationActive}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t))}\n\t\t</div>\n\t);\n};\n"]}
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { Highlight } from "./Highlight";
3
3
  import "../../assets/css/search.css";
4
4
  export default {
5
- title: "Toolbar/Highlight",
5
+ title: "Search/Highlight",
6
6
  component: Highlight,
7
7
  };
8
8
  const Template = (args) => React.createElement(Highlight, Object.assign({}, args));
@@ -1 +1 @@
1
- {"version":3,"file":"Highlight.stories.js","sourceRoot":"","sources":["../../../src/components/search/Highlight.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACxD,OAAO,6BAA6B,CAAC;AAGrC,eAAe;IACd,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,SAAS;CACpB,CAAC;AAEF,MAAM,QAAQ,GAA0B,CAAC,IAAoB,EAAE,EAAE,CAAC,oBAAC,SAAS,oBAAK,IAAI,EAAI,CAAC;AAE1F,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,GAAG;IACZ,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,UAAU,CAAC,IAAI,GAAG;IACjB,YAAY,EAAE,OAAO;IACrB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,UAAU,CAAC,IAAI,GAAG;IACjB,YAAY,EAAE,KAAK;IACnB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1C,QAAQ,CAAC,IAAI,GAAG;IACf,YAAY,EAAE,IAAI;IAClB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnD,iBAAiB,CAAC,IAAI,GAAG;IACxB,YAAY,EAAE,GAAG;IACjB,IAAI,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,WAAW,CAAC,IAAI,GAAG;IAClB,YAAY,EAAE,aAAa;IAC3B,IAAI,EAAE,aAAa;CACnB,CAAC","sourcesContent":["import React from \"react\";\nimport { Highlight, HighlightProps } from \"./Highlight\";\nimport \"../../assets/css/search.css\";\nimport { Story } from \"@storybook/react/types-6-0\";\n\nexport default {\n\ttitle: \"Toolbar/Highlight\",\n\tcomponent: Highlight,\n};\n\nconst Template: Story<HighlightProps> = (args: HighlightProps) => <Highlight {...args} />;\n\nexport const Start = Template.bind({});\nStart.args = {\n\tmatchAgainst: \"Example\",\n\ttext: \"Example chart apps\",\n};\n\nexport const MiddleWord = Template.bind({});\nMiddleWord.args = {\n\tmatchAgainst: \"Chart\",\n\ttext: \"Example chart apps\",\n};\n\nexport const MiddleText = Template.bind({});\nMiddleText.args = {\n\tmatchAgainst: \"amp\",\n\ttext: \"Example chart apps\",\n};\n\nexport const LastWord = Template.bind({});\nLastWord.args = {\n\tmatchAgainst: \"ps\",\n\ttext: \"Example chart apps\",\n};\n\nexport const RegularExpression = Template.bind({});\nRegularExpression.args = {\n\tmatchAgainst: \"+\",\n\ttext: \"A+B\",\n};\n\nexport const NoHighlight = Template.bind({});\nNoHighlight.args = {\n\tmatchAgainst: \"Not Present\",\n\ttext: \"Hello World\",\n};\n"]}
1
+ {"version":3,"file":"Highlight.stories.js","sourceRoot":"","sources":["../../../src/components/search/Highlight.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAkB,MAAM,aAAa,CAAC;AACxD,OAAO,6BAA6B,CAAC;AAGrC,eAAe;IACd,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,SAAS;CACpB,CAAC;AAEF,MAAM,QAAQ,GAA0B,CAAC,IAAoB,EAAE,EAAE,CAAC,oBAAC,SAAS,oBAAK,IAAI,EAAI,CAAC;AAE1F,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACvC,KAAK,CAAC,IAAI,GAAG;IACZ,YAAY,EAAE,SAAS;IACvB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,UAAU,CAAC,IAAI,GAAG;IACjB,YAAY,EAAE,OAAO;IACrB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5C,UAAU,CAAC,IAAI,GAAG;IACjB,YAAY,EAAE,KAAK;IACnB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1C,QAAQ,CAAC,IAAI,GAAG;IACf,YAAY,EAAE,IAAI;IAClB,IAAI,EAAE,oBAAoB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnD,iBAAiB,CAAC,IAAI,GAAG;IACxB,YAAY,EAAE,GAAG;IACjB,IAAI,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC7C,WAAW,CAAC,IAAI,GAAG;IAClB,YAAY,EAAE,aAAa;IAC3B,IAAI,EAAE,aAAa;CACnB,CAAC","sourcesContent":["import React from \"react\";\nimport { Highlight, HighlightProps } from \"./Highlight\";\nimport \"../../assets/css/search.css\";\nimport { Story } from \"@storybook/react/types-6-0\";\n\nexport default {\n\ttitle: \"Search/Highlight\",\n\tcomponent: Highlight,\n};\n\nconst Template: Story<HighlightProps> = (args: HighlightProps) => <Highlight {...args} />;\n\nexport const Start = Template.bind({});\nStart.args = {\n\tmatchAgainst: \"Example\",\n\ttext: \"Example chart apps\",\n};\n\nexport const MiddleWord = Template.bind({});\nMiddleWord.args = {\n\tmatchAgainst: \"Chart\",\n\ttext: \"Example chart apps\",\n};\n\nexport const MiddleText = Template.bind({});\nMiddleText.args = {\n\tmatchAgainst: \"amp\",\n\ttext: \"Example chart apps\",\n};\n\nexport const LastWord = Template.bind({});\nLastWord.args = {\n\tmatchAgainst: \"ps\",\n\ttext: \"Example chart apps\",\n};\n\nexport const RegularExpression = Template.bind({});\nRegularExpression.args = {\n\tmatchAgainst: \"+\",\n\ttext: \"A+B\",\n};\n\nexport const NoHighlight = Template.bind({});\nNoHighlight.args = {\n\tmatchAgainst: \"Not Present\",\n\ttext: \"Hello World\",\n};\n"]}
@@ -1,6 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { services } from "@finsemble/finsemble-api";
3
3
  declare type SearchQuery = services.search.types.SearchQuery;
4
+ export declare type SearchResultType = {
5
+ data: any;
6
+ searchQuery: SearchQuery;
7
+ resetSearch: () => void;
8
+ };
4
9
  export declare const SearchResult: (props: {
5
10
  data: any;
6
11
  searchQuery: SearchQuery;
@@ -1 +1 @@
1
- {"version":3,"file":"SearchResult.js","sourceRoot":"","sources":["../../../src/components/search/SearchResult.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAMxC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAuE,EAAE,EAAE;;IACvG,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,WAAW,mCAAI,IAAI,CAAC,IAAI,CAAC;IAIlD,MAAM,qBAAqB,GAAG,GAAG,EAAE;;QAClC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAA,IAAI,CAAC,OAAO,0CAAG,CAAC,CAAC,CAAC,CAAC;QACpE,WAAW,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,MAAW,EAAE,EAAE;QACvC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzD,WAAW,EAAE,CAAC;IACf,CAAC,CAAC;IAGF,MAAM,WAAW,GAAmB;QACnC,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,IAAI,CAAC,IAAI;KACnB,CAAC;IAGF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAGjC,uBACC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EACzB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,IAChB,IAAI,CAAC,IAAI,EACX;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAA,iBAAiB,EAAE,mCAAI,WAAW,CAAC;IAEhD,OAAO,CACN,oBAAC,QAAQ,IAAC,OAAO,EAAE,qBAAqB;QACvC,6BAAK,SAAS,EAAC,eAAe;YAC7B,oBAAC,IAAI,oBAAK,IAAI,EAAI;YAClB,oBAAC,SAAS,IAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,EAAE,GAAI;YAChE,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,MAAM,IAAG,CAAC,IAAI,CAC5B,6BAAK,SAAS,EAAC,gBAAgB,IAC7B,MAAA,IAAI,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,MAAW,EAAE,CAAS,EAAE,EAAE,CAAC,CAC9C,6BACC,GAAG,EAAE,YAAY,CAAC,EAAE,EACpB,SAAS,EAAC,6BAA6B,EACvC,OAAO,EAAE,CAAC,CAAmB,EAAE,EAAE;oBAChC,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,eAAe,CAAC,MAAM,CAAC,CAAC;oBACxB,WAAW,EAAE,CAAC;oBACd,eAAe,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC,IAEA,MAAM,CAAC,IAAI,CACP,CACN,CAAC,CACG,CACN,CACI,CACI,CACX,CAAC;AACH,CAAC,CAAC","sourcesContent":["import * as React from \"react\";\nimport { MenuItem } from \"../menu/MenuItem\";\nimport { Icon } from \"../icon/Icon\";\nimport { Highlight } from \"./Highlight\";\nimport { services } from \"@finsemble/finsemble-api\";\nimport { IconDescriptor } from \"@finsemble/finsemble-api/types/services/window/types\";\n\ntype SearchQuery = services.search.types.SearchQuery;\n\nexport const SearchResult = (props: { data: any; searchQuery: SearchQuery; resetSearch: () => void }) => {\n\tconst { data, searchQuery, resetSearch } = props;\n\n\tconst displayName = data.displayName ?? data.name;\n\n\t// Will trigger the action associated with the item\n\t// (e.g., loading a workspace, spawning a component)\n\tconst onSearchResultClicked = () => {\n\t\tFSBL.Clients.SearchClient.invokeItemAction(data, data.actions?.[0]);\n\t\tresetSearch();\n\t};\n\n\tconst onActionClicked = (action: any) => {\n\t\tFSBL.Clients.SearchClient.invokeItemAction(data, action);\n\t\tresetSearch();\n\t};\n\n\t// Default icon to be based on initials\n\tconst defaultIcon: IconDescriptor = {\n\t\timageType: \"initials\",\n\t\tname: displayName,\n\t\tcategory: data.type,\n\t};\n\n\t// Use iconography if provided in the search results\n\tconst maybeProviderIcon = () => {\n\t\tif (!data.icon) return undefined;\n\t\t// Default conversion which can be overridden if the provider explicitly\n\t\t// provides `imageType`, `name` or `category` fields.\n\t\treturn {\n\t\t\timageType: data.icon.type,\n\t\t\tname: displayName,\n\t\t\tcategory: data.type,\n\t\t\t...data.icon,\n\t\t};\n\t};\n\n\tconst icon = maybeProviderIcon() ?? defaultIcon;\n\n\treturn (\n\t\t<MenuItem onClick={onSearchResultClicked}>\n\t\t\t<div className=\"menu-item-row\">\n\t\t\t\t<Icon {...icon} />\n\t\t\t\t<Highlight text={displayName} matchAgainst={searchQuery || \"\"} />\n\t\t\t\t{data.actions?.length > 1 && (\n\t\t\t\t\t<div className=\"search-actions\">\n\t\t\t\t\t\t{data.actions?.map((action: any, i: number) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`actionbtn${i}`}\n\t\t\t\t\t\t\t\tclassName=\"search-actions actionButton\"\n\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tonActionClicked(action);\n\t\t\t\t\t\t\t\t\tresetSearch();\n\t\t\t\t\t\t\t\t\tfinsembleWindow.blur();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{action.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</MenuItem>\n\t);\n};\n"]}
1
+ {"version":3,"file":"SearchResult.js","sourceRoot":"","sources":["../../../src/components/search/SearchResult.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAYxC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAuE,EAAE,EAAE;;IACvG,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAEjD,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,WAAW,mCAAI,IAAI,CAAC,IAAI,CAAC;IAIlD,MAAM,qBAAqB,GAAG,GAAG,EAAE;;QAClC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAA,IAAI,CAAC,OAAO,0CAAG,CAAC,CAAC,CAAC,CAAC;QACpE,WAAW,EAAE,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,CAAC,MAAW,EAAE,EAAE;QACvC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzD,WAAW,EAAE,CAAC;IACf,CAAC,CAAC;IAGF,MAAM,WAAW,GAAmB;QACnC,SAAS,EAAE,UAAU;QACrB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,IAAI,CAAC,IAAI;KACnB,CAAC;IAGF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC9B,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAGjC,uBACC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EACzB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,IAAI,CAAC,IAAI,IAChB,IAAI,CAAC,IAAI,EACX;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAA,iBAAiB,EAAE,mCAAI,WAAW,CAAC;IAEhD,OAAO,CACN,oBAAC,QAAQ,IAAC,OAAO,EAAE,qBAAqB;QACvC,6BAAK,SAAS,EAAC,eAAe;YAC7B,oBAAC,IAAI,oBAAK,IAAI,EAAI;YAClB,oBAAC,SAAS,IAAC,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,IAAI,EAAE,GAAI;YAChE,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,MAAM,IAAG,CAAC,IAAI,CAC5B,6BAAK,SAAS,EAAC,gBAAgB,IAC7B,MAAA,IAAI,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,MAAW,EAAE,CAAS,EAAE,EAAE,CAAC,CAC9C,6BACC,GAAG,EAAE,YAAY,CAAC,EAAE,EACpB,SAAS,EAAC,6BAA6B,EACvC,OAAO,EAAE,CAAC,CAAmB,EAAE,EAAE;oBAChC,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,CAAC,CAAC,eAAe,EAAE,CAAC;oBACpB,eAAe,CAAC,MAAM,CAAC,CAAC;oBACxB,WAAW,EAAE,CAAC;oBACd,eAAe,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC,IAEA,MAAM,CAAC,IAAI,CACP,CACN,CAAC,CACG,CACN,CACI,CACI,CACX,CAAC;AACH,CAAC,CAAC","sourcesContent":["import * as React from \"react\";\nimport { MenuItem } from \"../menu/MenuItem\";\nimport { Icon } from \"../icon/Icon\";\nimport { Highlight } from \"./Highlight\";\nimport { services } from \"@finsemble/finsemble-api\";\nimport { IconDescriptor } from \"@finsemble/finsemble-api/types/services/window/types\";\n\ntype SearchQuery = services.search.types.SearchQuery;\n\nexport type SearchResultType = {\n\tdata: any;\n\tsearchQuery: SearchQuery;\n\tresetSearch: () => void;\n};\n\nexport const SearchResult = (props: { data: any; searchQuery: SearchQuery; resetSearch: () => void }) => {\n\tconst { data, searchQuery, resetSearch } = props;\n\n\tconst displayName = data.displayName ?? data.name;\n\n\t// Will trigger the action associated with the item\n\t// (e.g., loading a workspace, spawning a component)\n\tconst onSearchResultClicked = () => {\n\t\tFSBL.Clients.SearchClient.invokeItemAction(data, data.actions?.[0]);\n\t\tresetSearch();\n\t};\n\n\tconst onActionClicked = (action: any) => {\n\t\tFSBL.Clients.SearchClient.invokeItemAction(data, action);\n\t\tresetSearch();\n\t};\n\n\t// Default icon to be based on initials\n\tconst defaultIcon: IconDescriptor = {\n\t\timageType: \"initials\",\n\t\tname: displayName,\n\t\tcategory: data.type,\n\t};\n\n\t// Use iconography if provided in the search results\n\tconst maybeProviderIcon = () => {\n\t\tif (!data.icon) return undefined;\n\t\t// Default conversion which can be overridden if the provider explicitly\n\t\t// provides `imageType`, `name` or `category` fields.\n\t\treturn {\n\t\t\timageType: data.icon.type,\n\t\t\tname: displayName,\n\t\t\tcategory: data.type,\n\t\t\t...data.icon,\n\t\t};\n\t};\n\n\tconst icon = maybeProviderIcon() ?? defaultIcon;\n\n\treturn (\n\t\t<MenuItem onClick={onSearchResultClicked}>\n\t\t\t<div className=\"menu-item-row\">\n\t\t\t\t<Icon {...icon} />\n\t\t\t\t<Highlight text={displayName} matchAgainst={searchQuery || \"\"} />\n\t\t\t\t{data.actions?.length > 1 && (\n\t\t\t\t\t<div className=\"search-actions\">\n\t\t\t\t\t\t{data.actions?.map((action: any, i: number) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={`actionbtn${i}`}\n\t\t\t\t\t\t\t\tclassName=\"search-actions actionButton\"\n\t\t\t\t\t\t\t\tonClick={(e: React.MouseEvent) => {\n\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\t\t\t\tonActionClicked(action);\n\t\t\t\t\t\t\t\t\tresetSearch();\n\t\t\t\t\t\t\t\t\tfinsembleWindow.blur();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{action.name}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</MenuItem>\n\t);\n};\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,39 @@
1
+ import * as React from "react";
2
+ import { mount } from "enzyme";
3
+ import { describe, it } from "mocha";
4
+ import { expect } from "chai";
5
+ import { ComponentResult, WorkspaceResult } from "./SearchResult.stories";
6
+ import { accessibilityAssessor } from "../sdd/tests/a11y_helper";
7
+ import sinon from "sinon";
8
+ import addons, { mockChannel } from "@storybook/addons";
9
+ addons.setChannel(mockChannel());
10
+ describe("<SearchResult/>", () => {
11
+ afterEach(() => {
12
+ sinon.restore();
13
+ });
14
+ it.skip("passess accessibility scans", async () => {
15
+ const wrapper = mount(React.createElement(ComponentResult, Object.assign({}, ComponentResult.args)));
16
+ expect(await accessibilityAssessor(wrapper)).to.be.true;
17
+ });
18
+ it("should display an icon if an icon URL is provided", () => {
19
+ const wrapper = mount(React.createElement(ComponentResult, Object.assign({}, ComponentResult.args)));
20
+ expect(wrapper.find("img").exists()).to.be.true;
21
+ });
22
+ it("should display a default icon if no icon URL is provided", () => {
23
+ const wrapper = mount(React.createElement(WorkspaceResult, Object.assign({}, WorkspaceResult.args)));
24
+ expect(wrapper.find(".icon-avatar-wrapper span").exists()).to.be.true;
25
+ });
26
+ it("clicking a search result should call invokeItemAction and resetSearch", () => {
27
+ var _a, _b;
28
+ const stub = sinon.stub(console, "log");
29
+ const resetSpy = sinon.spy(ComponentResult.args, "resetSearch");
30
+ const wrapper = mount(React.createElement(ComponentResult, Object.assign({}, ComponentResult.args)));
31
+ wrapper.find("[role='menuitem']").simulate("click");
32
+ expect(resetSpy.calledOnce, "resetSearch was called").to.be.true;
33
+ expect(stub.calledOnce, "invokeAction was invoked").to.be.true;
34
+ const parameters = stub.args[0][1];
35
+ expect(parameters[0], "First parameter is the component data").to.deep.equal((_a = ComponentResult.args) === null || _a === void 0 ? void 0 : _a.data);
36
+ expect(parameters[1], "Second parameter is the action data").to.deep.equal((_b = ComponentResult.args) === null || _b === void 0 ? void 0 : _b.data.actions[0]);
37
+ });
38
+ });
39
+ //# sourceMappingURL=SearchResult.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchResult.spec.js","sourceRoot":"","sources":["../../../src/components/search/SearchResult.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport { mount } from \"enzyme\";\nimport { describe, it } from \"mocha\";\nimport { expect } from \"chai\";\nimport { ComponentResult, WorkspaceResult } from \"./SearchResult.stories\";\nimport { SearchResultType } from \"./SearchResult\";\nimport { accessibilityAssessor } from \"../sdd/tests/a11y_helper\";\nimport sinon from \"sinon\";\n\n// Necessary to allow sinon to work with mocked actions (which are shown in the Actions panel in Storybook)\nimport addons, { mockChannel } from \"@storybook/addons\";\naddons.setChannel(mockChannel());\n\ndescribe(\"<SearchResult/>\", () => {\n\tafterEach(() => {\n\t\tsinon.restore();\n\t});\n\tit.skip(\"passess accessibility scans\", async () => {\n\t\t// Skipping because the icons don't have alt text, and that will need to be addressed\n\t\tconst wrapper = mount(<ComponentResult {...(ComponentResult.args as SearchResultType)} />);\n\n\t\texpect(await accessibilityAssessor(wrapper)).to.be.true;\n\t});\n\n\tit(\"should display an icon if an icon URL is provided\", () => {\n\t\tconst wrapper = mount(<ComponentResult {...(ComponentResult.args as SearchResultType)} />);\n\n\t\texpect(wrapper.find(\"img\").exists()).to.be.true;\n\t});\n\n\tit(\"should display a default icon if no icon URL is provided\", () => {\n\t\tconst wrapper = mount(<WorkspaceResult {...(WorkspaceResult.args as SearchResultType)} />);\n\n\t\texpect(wrapper.find(\".icon-avatar-wrapper span\").exists()).to.be.true;\n\t});\n\n\tit(\"clicking a search result should call invokeItemAction and resetSearch\", () => {\n\t\tconst stub = sinon.stub(console, \"log\");\n\t\tconst resetSpy = sinon.spy(ComponentResult.args as SearchResultType, \"resetSearch\");\n\t\tconst wrapper = mount(<ComponentResult {...(ComponentResult.args as SearchResultType)} />);\n\n\t\twrapper.find(\"[role='menuitem']\").simulate(\"click\");\n\n\t\texpect(resetSpy.calledOnce, \"resetSearch was called\").to.be.true;\n\t\texpect(stub.calledOnce, \"invokeAction was invoked\").to.be.true;\n\n\t\tconst parameters = stub.args[0][1];\n\t\texpect(parameters[0], \"First parameter is the component data\").to.deep.equal(ComponentResult.args?.data);\n\t\texpect(parameters[1], \"Second parameter is the action data\").to.deep.equal(ComponentResult.args?.data.actions[0]);\n\t});\n});\n\n/*\nOutstanding test cases:\n\tdisplay extra item actions (WithProviderActions)\n\tclick extra item action\n */\n"]}
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ import { SearchResultType } from "./SearchResult";
3
+ import { Story } from "@storybook/react/types-6-0";
4
+ import "../../assets/css/search.css";
5
+ declare const _default: {
6
+ title: string;
7
+ component: (props: {
8
+ data: any;
9
+ searchQuery: import("@finsemble/finsemble-api/types/services/search/types").SearchQuery;
10
+ resetSearch: () => void;
11
+ }) => JSX.Element;
12
+ };
13
+ export default _default;
14
+ export declare const ComponentResult: Story<SearchResultType>;
15
+ export declare const WorkspaceResult: Story<SearchResultType>;
16
+ export declare const WithProviderActions: Story<SearchResultType>;
@@ -0,0 +1,109 @@
1
+ import React from "react";
2
+ import { SearchResult } from "./SearchResult";
3
+ import "../../assets/css/search.css";
4
+ import { action } from "@storybook/addon-actions";
5
+ import { initFSBL } from "../common/helpers";
6
+ import { FinsembleProvider } from "../FinsembleProvider";
7
+ import { createStore } from "../../store";
8
+ export default {
9
+ title: "Search/SearchResult",
10
+ component: SearchResult,
11
+ };
12
+ const Template = (args) => {
13
+ initFSBL(window);
14
+ FSBL.Clients.SearchClient.invokeItemAction = (...actionArgs) => {
15
+ console.log("invokeItemAction", actionArgs);
16
+ };
17
+ return (React.createElement(FinsembleProvider, { store: createStore() },
18
+ React.createElement("div", { role: "menu" },
19
+ React.createElement(SearchResult, Object.assign({}, args)))));
20
+ };
21
+ export const ComponentResult = Template.bind({});
22
+ ComponentResult.args = {
23
+ data: {
24
+ actions: [{ name: "Spawn" }],
25
+ description: "",
26
+ displayName: "Take a Tour",
27
+ icon: {
28
+ imageType: "url",
29
+ path: "http://localhost:3375/build/components/tour/take-a-tour.svg",
30
+ },
31
+ matches: [
32
+ {
33
+ indices: [
34
+ [0, 0],
35
+ [7, 7],
36
+ ],
37
+ key: "component.displayName",
38
+ value: "Take a Tour",
39
+ },
40
+ {
41
+ indices: [[0, 0]],
42
+ key: "component.type",
43
+ value: "Tour",
44
+ },
45
+ ],
46
+ name: "Tour",
47
+ provider: "System Manager.Installed Components",
48
+ score: 0.000018578044550916993,
49
+ tags: [],
50
+ type: "Application",
51
+ },
52
+ searchQuery: "T",
53
+ resetSearch: action("resetSearch"),
54
+ };
55
+ export const WorkspaceResult = Template.bind({});
56
+ WorkspaceResult.args = {
57
+ data: {
58
+ actions: [{ name: "Switch" }],
59
+ description: "",
60
+ matches: [
61
+ {
62
+ indices: [
63
+ [2, 2],
64
+ [7, 8],
65
+ ],
66
+ value: "auto_afterFeature",
67
+ },
68
+ ],
69
+ name: "auto_afterFeature",
70
+ provider: "workspaceService.Installed Workspaces",
71
+ score: 0.07,
72
+ tags: [],
73
+ type: "Workspace",
74
+ },
75
+ searchQuery: "Te",
76
+ resetSearch: action("resetSearch"),
77
+ };
78
+ export const WithProviderActions = Template.bind({});
79
+ WithProviderActions.args = {
80
+ data: {
81
+ actions: [
82
+ {
83
+ name: "Launch",
84
+ colorName: "Red",
85
+ colorHex: "#FF0000",
86
+ },
87
+ {
88
+ name: "Set",
89
+ colorName: "Red",
90
+ colorHex: "#FF0000",
91
+ },
92
+ ],
93
+ description: "The color Red",
94
+ matches: [
95
+ {
96
+ indices: [[0, 3]],
97
+ value: "Red",
98
+ },
99
+ ],
100
+ name: "Red",
101
+ provider: "colorSearchProviderService.Colors",
102
+ score: 100,
103
+ tags: [],
104
+ type: "color",
105
+ },
106
+ searchQuery: "Red",
107
+ resetSearch: action("resetSearch"),
108
+ };
109
+ //# sourceMappingURL=SearchResult.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchResult.stories.js","sourceRoot":"","sources":["../../../src/components/search/SearchResult.stories.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { SearchResult, SearchResultType } from \"./SearchResult\";\nimport { Story } from \"@storybook/react/types-6-0\";\nimport \"../../assets/css/search.css\";\nimport { action } from \"@storybook/addon-actions\";\nimport { initFSBL } from \"../common/helpers\";\nimport { FinsembleProvider } from \"../FinsembleProvider\";\nimport { createStore } from \"../../store\";\n\nexport default {\n\ttitle: \"Search/SearchResult\",\n\tcomponent: SearchResult,\n};\n\nconst Template: Story<SearchResultType> = (args: SearchResultType) => {\n\tinitFSBL(window);\n\n\tFSBL.Clients.SearchClient.invokeItemAction = (...actionArgs) => {\n\t\tconsole.log(\"invokeItemAction\", actionArgs);\n\t};\n\n\treturn (\n\t\t<FinsembleProvider store={createStore()}>\n\t\t\t<div role=\"menu\">\n\t\t\t\t<SearchResult {...args} />\n\t\t\t</div>\n\t\t</FinsembleProvider>\n\t);\n};\n\nexport const ComponentResult = Template.bind({});\nComponentResult.args = {\n\tdata: {\n\t\tactions: [{ name: \"Spawn\" }],\n\t\tdescription: \"\",\n\t\tdisplayName: \"Take a Tour\",\n\t\ticon: {\n\t\t\timageType: \"url\",\n\t\t\tpath: \"http://localhost:3375/build/components/tour/take-a-tour.svg\",\n\t\t},\n\t\tmatches: [\n\t\t\t{\n\t\t\t\tindices: [\n\t\t\t\t\t[0, 0],\n\t\t\t\t\t[7, 7],\n\t\t\t\t],\n\t\t\t\tkey: \"component.displayName\",\n\t\t\t\tvalue: \"Take a Tour\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tindices: [[0, 0]],\n\t\t\t\tkey: \"component.type\",\n\t\t\t\tvalue: \"Tour\",\n\t\t\t},\n\t\t],\n\t\tname: \"Tour\",\n\t\tprovider: \"System Manager.Installed Components\",\n\t\tscore: 0.000018578044550916993,\n\t\ttags: [],\n\t\ttype: \"Application\",\n\t},\n\tsearchQuery: \"T\",\n\tresetSearch: action(\"resetSearch\"),\n};\n\nexport const WorkspaceResult = Template.bind({});\nWorkspaceResult.args = {\n\tdata: {\n\t\tactions: [{ name: \"Switch\" }],\n\t\tdescription: \"\",\n\t\tmatches: [\n\t\t\t{\n\t\t\t\tindices: [\n\t\t\t\t\t[2, 2],\n\t\t\t\t\t[7, 8],\n\t\t\t\t],\n\t\t\t\tvalue: \"auto_afterFeature\",\n\t\t\t},\n\t\t],\n\t\tname: \"auto_afterFeature\",\n\t\tprovider: \"workspaceService.Installed Workspaces\",\n\t\tscore: 0.07,\n\t\ttags: [],\n\t\ttype: \"Workspace\",\n\t},\n\tsearchQuery: \"Te\",\n\tresetSearch: action(\"resetSearch\"),\n};\n\nexport const WithProviderActions = Template.bind({});\nWithProviderActions.args = {\n\tdata: {\n\t\tactions: [\n\t\t\t{\n\t\t\t\tname: \"Launch\",\n\t\t\t\tcolorName: \"Red\",\n\t\t\t\tcolorHex: \"#FF0000\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"Set\",\n\t\t\t\tcolorName: \"Red\",\n\t\t\t\tcolorHex: \"#FF0000\",\n\t\t\t},\n\t\t],\n\t\tdescription: \"The color Red\",\n\t\tmatches: [\n\t\t\t{\n\t\t\t\tindices: [[0, 3]],\n\t\t\t\tvalue: \"Red\",\n\t\t\t},\n\t\t],\n\t\tname: \"Red\",\n\t\tprovider: \"colorSearchProviderService.Colors\",\n\t\tscore: 100,\n\t\ttags: [],\n\t\ttype: \"color\",\n\t},\n\tsearchQuery: \"Red\",\n\tresetSearch: action(\"resetSearch\"),\n};\n\n// with icon\n// without icon\n// with tags\n// with 0 actions\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ import { mount } from "enzyme";
3
+ import { describe, it } from "mocha";
4
+ import { expect } from "chai";
5
+ import { SomeResults, NoResults } from "./SearchResults.stories";
6
+ import { accessibilityAssessor } from "../sdd/tests/a11y_helper";
7
+ describe("<SearchResults/>", () => {
8
+ it.skip("should pass accessibility scans (with results)", async () => {
9
+ const wrapper = mount(React.createElement(SomeResults, Object.assign({}, SomeResults.args)));
10
+ expect(await accessibilityAssessor(wrapper)).to.be.true;
11
+ });
12
+ it.skip("should pass accessibility scans (without results)", async () => {
13
+ const wrapper = mount(React.createElement(NoResults, Object.assign({}, NoResults.args)));
14
+ expect(await accessibilityAssessor(wrapper)).to.be.true;
15
+ });
16
+ it("displays titles and items correctly", () => {
17
+ const wrapper = mount(React.createElement(SomeResults, Object.assign({}, SomeResults.args)));
18
+ const container = wrapper.find(".search-provider-results");
19
+ expect(container.find("div .search-title").at(0).text(), "First field is Best Match").to.equal("Best Match");
20
+ expect(container.find("div[role='menuitem']").at(0).find("span").text()).to.equal("Take a Tour");
21
+ });
22
+ it("Confirm nothing appears for No Results", () => {
23
+ const wrapper = mount(React.createElement(NoResults, Object.assign({}, NoResults.args)));
24
+ expect(wrapper.find("[role='menu'] div").length).to.equal(1);
25
+ expect(wrapper.find(".menu-item").text()).to.equal("No results");
26
+ });
27
+ });
28
+ //# sourceMappingURL=SearchResults.spec.js.map