@deephaven/dashboard-core-plugins 0.42.1-beta.2 → 0.43.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 (183) hide show
  1. package/dist/prop-types/UIPropTypes.d.ts +1 -6
  2. package/dist/prop-types/UIPropTypes.d.ts.map +1 -1
  3. package/package.json +22 -22
  4. package/dist/ChartBuilderPlugin.js +0 -54
  5. package/dist/ChartBuilderPlugin.js.map +0 -1
  6. package/dist/ChartPlugin.js +0 -66
  7. package/dist/ChartPlugin.js.map +0 -1
  8. package/dist/ConsolePlugin.js +0 -396
  9. package/dist/ConsolePlugin.js.map +0 -1
  10. package/dist/FilterPlugin.js +0 -205
  11. package/dist/FilterPlugin.js.map +0 -1
  12. package/dist/GridPlugin.js +0 -74
  13. package/dist/GridPlugin.js.map +0 -1
  14. package/dist/LinkerPlugin.js +0 -18
  15. package/dist/LinkerPlugin.js.map +0 -1
  16. package/dist/MarkdownPlugin.js +0 -87
  17. package/dist/MarkdownPlugin.js.map +0 -1
  18. package/dist/PandasPlugin.js +0 -66
  19. package/dist/PandasPlugin.js.map +0 -1
  20. package/dist/controls/ControlType.js +0 -10
  21. package/dist/controls/ControlType.js.map +0 -1
  22. package/dist/controls/dropdown-filter/DropdownFilter.css +0 -86
  23. package/dist/controls/dropdown-filter/DropdownFilter.css.map +0 -1
  24. package/dist/controls/dropdown-filter/DropdownFilter.js +0 -417
  25. package/dist/controls/dropdown-filter/DropdownFilter.js.map +0 -1
  26. package/dist/controls/input-filter/InputFilter.css +0 -75
  27. package/dist/controls/input-filter/InputFilter.css.map +0 -1
  28. package/dist/controls/input-filter/InputFilter.js +0 -291
  29. package/dist/controls/input-filter/InputFilter.js.map +0 -1
  30. package/dist/controls/markdown/MarkdownContainer.js +0 -30
  31. package/dist/controls/markdown/MarkdownContainer.js.map +0 -1
  32. package/dist/controls/markdown/MarkdownEditor.js +0 -52
  33. package/dist/controls/markdown/MarkdownEditor.js.map +0 -1
  34. package/dist/controls/markdown/MarkdownStartPage.js +0 -109
  35. package/dist/controls/markdown/MarkdownStartPage.js.map +0 -1
  36. package/dist/controls/markdown/MarkdownUtils.js +0 -23
  37. package/dist/controls/markdown/MarkdownUtils.js.map +0 -1
  38. package/dist/events/ChartEvent.js +0 -9
  39. package/dist/events/ChartEvent.js.map +0 -1
  40. package/dist/events/ConsoleEvent.js +0 -11
  41. package/dist/events/ConsoleEvent.js.map +0 -1
  42. package/dist/events/InputFilterEvent.js +0 -14
  43. package/dist/events/InputFilterEvent.js.map +0 -1
  44. package/dist/events/IrisGridEvent.js +0 -12
  45. package/dist/events/IrisGridEvent.js.map +0 -1
  46. package/dist/events/MarkdownEvent.js +0 -4
  47. package/dist/events/MarkdownEvent.js.map +0 -1
  48. package/dist/events/NotebookEvent.js +0 -15
  49. package/dist/events/NotebookEvent.js.map +0 -1
  50. package/dist/events/PQEvent.js +0 -9
  51. package/dist/events/PQEvent.js.map +0 -1
  52. package/dist/events/PandasEvent.js +0 -8
  53. package/dist/events/PandasEvent.js.map +0 -1
  54. package/dist/events/TabEvent.js +0 -12
  55. package/dist/events/TabEvent.js.map +0 -1
  56. package/dist/events/index.js +0 -9
  57. package/dist/events/index.js.map +0 -1
  58. package/dist/index.js +0 -17
  59. package/dist/index.js.map +0 -1
  60. package/dist/linker/ColumnSelectionValidator.js +0 -2
  61. package/dist/linker/ColumnSelectionValidator.js.map +0 -1
  62. package/dist/linker/Linker.js +0 -736
  63. package/dist/linker/Linker.js.map +0 -1
  64. package/dist/linker/LinkerLink.css +0 -142
  65. package/dist/linker/LinkerLink.css.map +0 -1
  66. package/dist/linker/LinkerLink.js +0 -314
  67. package/dist/linker/LinkerLink.js.map +0 -1
  68. package/dist/linker/LinkerOverlayContent.css +0 -63
  69. package/dist/linker/LinkerOverlayContent.css.map +0 -1
  70. package/dist/linker/LinkerOverlayContent.js +0 -343
  71. package/dist/linker/LinkerOverlayContent.js.map +0 -1
  72. package/dist/linker/LinkerUtils.js +0 -139
  73. package/dist/linker/LinkerUtils.js.map +0 -1
  74. package/dist/linker/ToolType.js +0 -5
  75. package/dist/linker/ToolType.js.map +0 -1
  76. package/dist/linker/index.js +0 -2
  77. package/dist/linker/index.js.map +0 -1
  78. package/dist/panels/ChartColumnSelectorOverlay.css +0 -11
  79. package/dist/panels/ChartColumnSelectorOverlay.css.map +0 -1
  80. package/dist/panels/ChartColumnSelectorOverlay.js +0 -38
  81. package/dist/panels/ChartColumnSelectorOverlay.js.map +0 -1
  82. package/dist/panels/ChartFilterOverlay.css +0 -22
  83. package/dist/panels/ChartFilterOverlay.css.map +0 -1
  84. package/dist/panels/ChartFilterOverlay.js +0 -90
  85. package/dist/panels/ChartFilterOverlay.js.map +0 -1
  86. package/dist/panels/ChartPanel.css +0 -38
  87. package/dist/panels/ChartPanel.css.map +0 -1
  88. package/dist/panels/ChartPanel.js +0 -971
  89. package/dist/panels/ChartPanel.js.map +0 -1
  90. package/dist/panels/ChartPanelUtils.js +0 -5
  91. package/dist/panels/ChartPanelUtils.js.map +0 -1
  92. package/dist/panels/CommandHistoryPanel.css +0 -19
  93. package/dist/panels/CommandHistoryPanel.css.map +0 -1
  94. package/dist/panels/CommandHistoryPanel.js +0 -195
  95. package/dist/panels/CommandHistoryPanel.js.map +0 -1
  96. package/dist/panels/ConsolePanel.css +0 -19
  97. package/dist/panels/ConsolePanel.css.map +0 -1
  98. package/dist/panels/ConsolePanel.js +0 -365
  99. package/dist/panels/ConsolePanel.js.map +0 -1
  100. package/dist/panels/DropdownFilterPanel.css +0 -6
  101. package/dist/panels/DropdownFilterPanel.css.map +0 -1
  102. package/dist/panels/DropdownFilterPanel.js +0 -685
  103. package/dist/panels/DropdownFilterPanel.js.map +0 -1
  104. package/dist/panels/FileExplorerPanel.css +0 -6
  105. package/dist/panels/FileExplorerPanel.css.map +0 -1
  106. package/dist/panels/FileExplorerPanel.js +0 -252
  107. package/dist/panels/FileExplorerPanel.js.map +0 -1
  108. package/dist/panels/FilterSetManager.css +0 -112
  109. package/dist/panels/FilterSetManager.css.map +0 -1
  110. package/dist/panels/FilterSetManager.js +0 -689
  111. package/dist/panels/FilterSetManager.js.map +0 -1
  112. package/dist/panels/FilterSetManagerPanel.css +0 -34
  113. package/dist/panels/FilterSetManagerPanel.css.map +0 -1
  114. package/dist/panels/FilterSetManagerPanel.js +0 -345
  115. package/dist/panels/FilterSetManagerPanel.js.map +0 -1
  116. package/dist/panels/InputFilterPanel.js +0 -232
  117. package/dist/panels/InputFilterPanel.js.map +0 -1
  118. package/dist/panels/IrisGridPanel.css +0 -24
  119. package/dist/panels/IrisGridPanel.css.map +0 -1
  120. package/dist/panels/IrisGridPanel.js +0 -1018
  121. package/dist/panels/IrisGridPanel.js.map +0 -1
  122. package/dist/panels/IrisGridPanelTooltip.js +0 -39
  123. package/dist/panels/IrisGridPanelTooltip.js.map +0 -1
  124. package/dist/panels/LogPanel.css +0 -15
  125. package/dist/panels/LogPanel.css.map +0 -1
  126. package/dist/panels/LogPanel.js +0 -110
  127. package/dist/panels/LogPanel.js.map +0 -1
  128. package/dist/panels/MarkdownNotebook.css +0 -107
  129. package/dist/panels/MarkdownNotebook.css.map +0 -1
  130. package/dist/panels/MarkdownNotebook.js +0 -232
  131. package/dist/panels/MarkdownNotebook.js.map +0 -1
  132. package/dist/panels/MarkdownPanel.css +0 -90
  133. package/dist/panels/MarkdownPanel.css.map +0 -1
  134. package/dist/panels/MarkdownPanel.js +0 -202
  135. package/dist/panels/MarkdownPanel.js.map +0 -1
  136. package/dist/panels/MockFileStorage.js +0 -70
  137. package/dist/panels/MockFileStorage.js.map +0 -1
  138. package/dist/panels/MockFileStorageTable.js +0 -80
  139. package/dist/panels/MockFileStorageTable.js.map +0 -1
  140. package/dist/panels/NotebookPanel.css +0 -44
  141. package/dist/panels/NotebookPanel.css.map +0 -1
  142. package/dist/panels/NotebookPanel.js +0 -1224
  143. package/dist/panels/NotebookPanel.js.map +0 -1
  144. package/dist/panels/PandasPanel.css +0 -15
  145. package/dist/panels/PandasPanel.css.map +0 -1
  146. package/dist/panels/PandasPanel.js +0 -86
  147. package/dist/panels/PandasPanel.js.map +0 -1
  148. package/dist/panels/Panel.js +0 -314
  149. package/dist/panels/Panel.js.map +0 -1
  150. package/dist/panels/PanelContextMenu.js +0 -126
  151. package/dist/panels/PanelContextMenu.js.map +0 -1
  152. package/dist/panels/RenameDialog.js +0 -156
  153. package/dist/panels/RenameDialog.js.map +0 -1
  154. package/dist/panels/WidgetPanel.css +0 -17
  155. package/dist/panels/WidgetPanel.css.map +0 -1
  156. package/dist/panels/WidgetPanel.js +0 -189
  157. package/dist/panels/WidgetPanel.js.map +0 -1
  158. package/dist/panels/WidgetPanelTooltip.css +0 -40
  159. package/dist/panels/WidgetPanelTooltip.css.map +0 -1
  160. package/dist/panels/WidgetPanelTooltip.js +0 -49
  161. package/dist/panels/WidgetPanelTooltip.js.map +0 -1
  162. package/dist/panels/index.js +0 -22
  163. package/dist/panels/index.js.map +0 -1
  164. package/dist/prop-types/CommonPropTypes.js +0 -9
  165. package/dist/prop-types/CommonPropTypes.js.map +0 -1
  166. package/dist/prop-types/UIPropTypes.js +0 -47
  167. package/dist/prop-types/UIPropTypes.js.map +0 -1
  168. package/dist/prop-types/index.js +0 -3
  169. package/dist/prop-types/index.js.map +0 -1
  170. package/dist/redux/actionTypes.js +0 -3
  171. package/dist/redux/actionTypes.js.map +0 -1
  172. package/dist/redux/actions.js +0 -88
  173. package/dist/redux/actions.js.map +0 -1
  174. package/dist/redux/index.js +0 -10
  175. package/dist/redux/index.js.map +0 -1
  176. package/dist/redux/reducers/connection.js +0 -7
  177. package/dist/redux/reducers/connection.js.map +0 -1
  178. package/dist/redux/reducers/index.js +0 -5
  179. package/dist/redux/reducers/index.js.map +0 -1
  180. package/dist/redux/reducers/sessionWrapper.js +0 -7
  181. package/dist/redux/reducers/sessionWrapper.js.map +0 -1
  182. package/dist/redux/selectors.js +0 -92
  183. package/dist/redux/selectors.js.map +0 -1
@@ -1,22 +0,0 @@
1
- /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
- .chart-filter-overlay .chart-filter-overlay-content .waiting-filter-list {
3
- margin-top: 0.5rem;
4
- margin-bottom: 1.5rem;
5
- }
6
- .chart-filter-overlay .chart-filter-overlay-content .waiting-filter-list .waiting-filter-item svg {
7
- margin-right: 0.5rem;
8
- color: #9edc6f;
9
- }
10
- .chart-filter-overlay .chart-filter-overlay-content .waiting-filter-list .waiting-filter-item.is-invalid svg {
11
- color: #929192;
12
- }
13
- .chart-filter-overlay .chart-filter-overlay-content .btn {
14
- margin-bottom: 1rem;
15
- margin-right: 1rem;
16
- }
17
- .chart-filter-overlay .chart-filter-overlay-content.chart-filter-waiting-filter .info-message,
18
- .chart-filter-overlay .chart-filter-overlay-content.chart-filter-waiting-filter .waiting-filter-list {
19
- text-align: left;
20
- }
21
-
22
- /*# sourceMappingURL=ChartFilterOverlay.css.map */
@@ -1 +0,0 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/ChartFilterOverlay.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss","../../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACOI;EACE,YCLK;EDML,eCJK;;ADOH;EACE,cCVC;EDWD,OERF;;AFYE;EACE,OEED;;AFGP;EACE,eCrBK;EDsBL,cCtBK;;ADyBL;AAAA;EAEE","file":"ChartFilterOverlay.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n$chart-filter-column-valid-color: $green;\n$chart-filter-column-invalid-color: $gray-400;\n\n.chart-filter-overlay {\n .chart-filter-overlay-content {\n .waiting-filter-list {\n margin-top: $spacer-2;\n margin-bottom: $spacer-4;\n\n .waiting-filter-item {\n svg {\n margin-right: $spacer-2;\n color: $chart-filter-column-valid-color;\n }\n\n &.is-invalid {\n svg {\n color: $chart-filter-column-invalid-color;\n }\n }\n }\n }\n .btn {\n margin-bottom: $spacer-3;\n margin-right: $spacer-3;\n }\n &.chart-filter-waiting-filter {\n .info-message,\n .waiting-filter-list {\n text-align: left;\n }\n }\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n","// Styling overrides for bootstrap\n\n// Override / set color variables\n$red: #f95d84;\n$orange: #f37e3f;\n$yellow: #fcd65b;\n$green: #9edc6f;\n$blue: #76d9e4;\n$purple: #aa9af4;\n\n//Define some UI colors\n$interfacegray: #2d2a2e;\n$interfaceblue: #4878ea;\n$interfacewhite: #f0f0ee; //same as gray-200\n$interfaceblack: #1a171a;\n\n//Define our Gray scale\n$white: $interfacewhite;\n$gray-100: #fcfcfa;\n$gray-200: $interfacewhite;\n$gray-300: #c0bfbf;\n$gray-400: #929192;\n$gray-500: #5b5a5c;\n$gray-600: #555356;\n$gray-700: #403e41;\n$gray-800: #373438;\n$gray-850: #322f33;\n$gray-900: #211f22;\n$black: $interfaceblack;\n$content-bg: $interfacegray;\n$background: $interfaceblack;\n$foreground: $interfacewhite;\n\n//Load colors into map\n$colors: ();\n$colors: map-merge(\n (\n 'red': $red,\n 'orange': $orange,\n 'yellow': $yellow,\n 'green': $green,\n 'blue': $blue,\n 'purple': $purple,\n 'white': $white,\n 'black': $black,\n ),\n $colors\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: $interfaceblue;\n$primary-hover: darken($primary, 8%);\n$primary-dark: mix($primary, $content-bg, 25%);\n$primary-light: scale-color($primary, $lightness: -25%);\n$secondary: $gray-500;\n$secondary-hover: darken($secondary, 8%);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: $red;\n$danger-hover: darken($danger, 8%);\n$light: $gray-100;\n$mid: $gray-400; //Added a mid color, useful for input styling\n$dark: $gray-800;\n$green-dark: scale-color($green, $lightness: -45%, $saturation: -10%);\n\n$theme-colors: () !default;\n$theme-colors: map-merge(\n (\n 'primary': $primary,\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'secondary': $secondary,\n 'success': $success,\n 'info': $info,\n 'warning': $warning,\n 'danger': $danger,\n 'light': $light,\n 'dark': $dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n ),\n $theme-colors\n);\n\n$component-active-bg: $primary;\n$theme-color-interval: 9%;\n$yiq-contrasted-threshold: 180;\n\n// Override fonts\n$font-family-sans-serif: 'Fira Sans', -apple-system, blinkmacsystemfont,\n 'Segoe UI', 'Roboto', 'Helvetica Neue', arial, sans-serif; //fira sans then native system ui fallbacks\n$font-family-monospace: 'Fira Mono', menlo, monaco, consolas, 'Liberation Mono',\n 'Courier New', monospace;\n$font-family-base: $font-family-sans-serif;\n\n$headings-font-weight: 400;\n\n//Text overides\n$text-muted: $gray-400;\n\n//Style Selection highlight color\n//so browsers add alpha to your color by default, ignoring opacity 1\n//by setting rgba with 0.99 it tricks browser into thinking there is alpha applied\n$text-select-color: $primary-hover;\n$text-select-color-editor: lighten(\n $gray-700,\n 15%\n); //we lighten it abit to account for that 0.01 loss, and because it needs some anyways.\n\n//Grid variables, same value as default just making easily accessible\n$grid-gutter-width: 30px;\n\n//Visual Overrides\n$border-radius: 4px;\n$box-shadow: 0 0.1rem 1rem rgba($black, 45%); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem rgba(0, 0, 0, 45%); //darkest shadow for $black popups over $black UI\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition: color 0.12s ease-in-out, background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out, box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n\n//Override Inputs\n$input-bg: $gray-600;\n$input-disabled-bg: $gray-800;\n$input-color: $foreground;\n$input-border-color: $gray-400;\n$input-placeholder-color: $gray-400;\n$input-focus-border-color: rgba($primary, 85%);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: rgba($component-active-bg, 35%);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n\n//checkbox\n$custom-control-indicator-bg: $gray-600;\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: $gray-800;\n$custom-control-indicator-checked-disabled-bg: $gray-800;\n$custom-control-label-disabled-color: $gray-400;\n\n//Custom Select\n$custom-select-indicator-color: $gray-400;\n$custom-select-bg-size: 16px 16px;\n//dhSort icon encoded\n$custom-select-indicator: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M4 7l-.4-.8 4-3.7h.8l4 3.7-.4.8H4zm0 2l-.4.8 4 3.7h.8l4-3.7L12 9H4z'/%3E%3C/svg%3E\"),\n '#',\n '%23'\n);\n$custom-select-focus-box-shadow: $input-btn-focus-box-shadow;\n$custom-select-disabled-color: darken($gray-400, 5%);\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $gray-200;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n\n// Toast notification\n$toast-bg: $primary-dark;\n$toast-color: $foreground;\n$toast-error-bg: mix($danger, $content-bg, 15%);\n$toast-error-color: $foreground;\n\n//tooltips\n$tooltip-bg: $gray-700;\n$tooltip-color: $foreground;\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem rgba($black, 80%);\n\n//drowdowns\n$dropdown-bg: $gray-600;\n$dropdown-link-color: $foreground;\n$dropdown-link-hover-color: $foreground;\n$dropdown-link-hover-bg: $primary;\n$dropdown-divider-bg: $gray-700;\n\n//context menus\n$contextmenu-bg: $gray-600;\n$contextmenu-color: $foreground;\n$contextmenu-disabled-color: $text-muted;\n$contextmenu-keyboard-selected-bg: rgba($primary, 50%);\n$contextmenu-selected-bg: $primary;\n$contextmenu-selected-color: $foreground;\n\n//links\n$link-color: $gray-400;\n$link-hover-color: $foreground;\n\n//progress-bar\n$progress-bg: $gray-600;\n$progress-border-radius: 1rem;\n\n// Set global options\n$enable-shadows: false;\n$enable-gradients: false;\n$enable-print-styles: false; //I don't think anyone should expect to \"print\" this app.\n\n// Transition times\n$transition: 0.15s;\n$transition-mid: 0.2s;\n$transition-long: 0.3s;\n$transition-slow: 0.6s;\n\n//form-validation icon, uses vsWarning icon encoded here as svg\n$form-feedback-icon-invalid-color: theme-color('danger');\n$form-feedback-icon-invalid: str-replace(\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cg fill='none'%3E%3Cg fill='#{$form-feedback-icon-invalid-color}'%3E%3Cpath d='M7.56 1h.88l6.54 12.26-.44.74H1.44L1 13.26 7.56 1zM8 2.28 2.28 13H13.7L8 2.28zM8.625 12v-1h-1.25v1h1.25zm-1.25-2V6h1.25v4h-1.25z'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E \"),\n '#',\n '%23'\n);\n"]}
@@ -1,90 +0,0 @@
1
- import React, { useCallback, useMemo } from 'react';
2
- import PropTypes from 'prop-types';
3
- import classNames from 'classnames';
4
- import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
5
- import { ButtonOld } from '@deephaven/components';
6
- import { vsPass, vsWarning } from '@deephaven/icons';
7
- import { TextUtils } from '@deephaven/utils';
8
- import "./ChartFilterOverlay.css";
9
- function ChartFilterOverlay(_ref) {
10
- var {
11
- columnMap,
12
- inputFilterMap,
13
- linkedColumnMap,
14
- onAdd,
15
- onOpenLinker,
16
- waitingFilterMap,
17
- waitingInputMap
18
- } = _ref;
19
- var inputMessage = useMemo(() => {
20
- var waitingColumns = Array.from(waitingInputMap.keys());
21
- var needsInputFilterValue = waitingColumns.find(columnName => inputFilterMap.get(columnName) != null);
22
- var needsLinkValue = waitingColumns.find(columnName => linkedColumnMap.get(columnName) != null);
23
- var columnsText = TextUtils.join(waitingColumns.map(item => "\"".concat(item, "\"")));
24
- if (needsInputFilterValue != null && needsInputFilterValue && needsLinkValue != null && needsLinkValue) {
25
- return "Use a filter control or linked table to set a value for ".concat(columnsText);
26
- }
27
- if (needsInputFilterValue != null && needsInputFilterValue) {
28
- return "Set a filter control value for ".concat(columnsText);
29
- }
30
- return "Double click a row in a linked table to set a value for ".concat(columnsText);
31
- }, [inputFilterMap, linkedColumnMap, waitingInputMap]);
32
- var columns = useMemo(() => Array.from(columnMap.values()), [columnMap]);
33
- var handleAddClick = useCallback(event => {
34
- event.stopPropagation();
35
- event.preventDefault();
36
- onAdd(Array.from(waitingFilterMap.values()));
37
- }, [onAdd, waitingFilterMap]);
38
- var handleOpenLinker = useCallback(event => {
39
- event.stopPropagation();
40
- event.preventDefault();
41
- onOpenLinker();
42
- }, [onOpenLinker]);
43
- var isWaitingFilters = waitingFilterMap.size > 0;
44
- var isWaitingInput = !isWaitingFilters && waitingInputMap.size > 0;
45
- return /*#__PURE__*/React.createElement("div", {
46
- className: "chart-panel-overlay chart-filter-overlay"
47
- }, /*#__PURE__*/React.createElement("div", {
48
- className: classNames('chart-panel-overlay-content chart-filter-overlay-content', {
49
- 'chart-filter-waiting-filter': isWaitingFilters
50
- }, {
51
- 'chart-filter-waiting-input': isWaitingInput
52
- })
53
- }, isWaitingFilters && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
54
- className: "info-message"
55
- }, "This plot requires a filter control to be added to the layout or a table link to be created on the following columns:"), /*#__PURE__*/React.createElement("div", {
56
- className: "waiting-filter-list"
57
- }, columns.map(column => {
58
- var isColumnWaiting = waitingFilterMap.has(column.name);
59
- var icon = isColumnWaiting ? vsWarning : vsPass;
60
- return /*#__PURE__*/React.createElement("div", {
61
- key: column.name,
62
- className: classNames('waiting-filter-item', {
63
- 'is-invalid': isColumnWaiting
64
- })
65
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
66
- icon: icon
67
- }), column.name);
68
- })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(ButtonOld, {
69
- onClick: handleAddClick,
70
- className: "btn-primary"
71
- }, "Add Input Filters"), /*#__PURE__*/React.createElement(ButtonOld, {
72
- onClick: handleOpenLinker,
73
- className: "btn-primary"
74
- }, "Open Linker Tool"))), isWaitingInput && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
75
- className: "info-message"
76
- }, "Waiting for User Input"), /*#__PURE__*/React.createElement("div", {
77
- className: ""
78
- }, inputMessage))));
79
- }
80
- ChartFilterOverlay.propTypes = {
81
- columnMap: PropTypes.instanceOf(Map).isRequired,
82
- inputFilterMap: PropTypes.instanceOf(Map).isRequired,
83
- linkedColumnMap: PropTypes.instanceOf(Map).isRequired,
84
- onAdd: PropTypes.func.isRequired,
85
- onOpenLinker: PropTypes.func.isRequired,
86
- waitingFilterMap: PropTypes.instanceOf(Map).isRequired,
87
- waitingInputMap: PropTypes.instanceOf(Map).isRequired
88
- };
89
- export default ChartFilterOverlay;
90
- //# sourceMappingURL=ChartFilterOverlay.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChartFilterOverlay.js","names":["React","useCallback","useMemo","PropTypes","classNames","FontAwesomeIcon","ButtonOld","vsPass","vsWarning","TextUtils","ChartFilterOverlay","columnMap","inputFilterMap","linkedColumnMap","onAdd","onOpenLinker","waitingFilterMap","waitingInputMap","inputMessage","waitingColumns","Array","from","keys","needsInputFilterValue","find","columnName","get","needsLinkValue","columnsText","join","map","item","columns","values","handleAddClick","event","stopPropagation","preventDefault","handleOpenLinker","isWaitingFilters","size","isWaitingInput","column","isColumnWaiting","has","name","icon","propTypes","instanceOf","Map","isRequired","func"],"sources":["../../src/panels/ChartFilterOverlay.tsx"],"sourcesContent":["import React, { MouseEvent, ReactElement, useCallback, useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport { ButtonOld } from '@deephaven/components';\nimport { vsPass, vsWarning } from '@deephaven/icons';\nimport { TextUtils } from '@deephaven/utils';\nimport { ColumnName, InputFilter } from '@deephaven/iris-grid';\nimport './ChartFilterOverlay.scss';\n\nexport type ColumnMap = Map<ColumnName, { name: string; type: string }>;\n\ninterface ChartFilterOverlayProps {\n columnMap: ColumnMap;\n inputFilterMap: Map<ColumnName, InputFilter>;\n linkedColumnMap: Map<string, unknown>;\n onAdd: (columns: InputFilter[]) => void;\n onOpenLinker: () => void;\n waitingFilterMap: Map<string, InputFilter>;\n waitingInputMap: Map<ColumnName, unknown>;\n}\n\nfunction ChartFilterOverlay({\n columnMap,\n inputFilterMap,\n linkedColumnMap,\n onAdd,\n onOpenLinker,\n waitingFilterMap,\n waitingInputMap,\n}: ChartFilterOverlayProps): ReactElement {\n const inputMessage = useMemo(() => {\n const waitingColumns = Array.from(waitingInputMap.keys());\n const needsInputFilterValue = waitingColumns.find(\n (columnName: ColumnName) => inputFilterMap.get(columnName) != null\n );\n const needsLinkValue = waitingColumns.find(\n columnName => linkedColumnMap.get(columnName) != null\n );\n const columnsText = TextUtils.join(waitingColumns.map(item => `\"${item}\"`));\n if (\n needsInputFilterValue != null &&\n needsInputFilterValue &&\n needsLinkValue != null &&\n needsLinkValue\n ) {\n return `Use a filter control or linked table to set a value for ${columnsText}`;\n }\n if (needsInputFilterValue != null && needsInputFilterValue) {\n return `Set a filter control value for ${columnsText}`;\n }\n return `Double click a row in a linked table to set a value for ${columnsText}`;\n }, [inputFilterMap, linkedColumnMap, waitingInputMap]);\n\n const columns = useMemo(() => Array.from(columnMap.values()), [columnMap]);\n\n const handleAddClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n event.preventDefault();\n\n onAdd(Array.from(waitingFilterMap.values()));\n },\n [onAdd, waitingFilterMap]\n );\n\n const handleOpenLinker = useCallback(\n event => {\n event.stopPropagation();\n event.preventDefault();\n\n onOpenLinker();\n },\n [onOpenLinker]\n );\n\n const isWaitingFilters = waitingFilterMap.size > 0;\n const isWaitingInput = !isWaitingFilters && waitingInputMap.size > 0;\n\n return (\n <div className=\"chart-panel-overlay chart-filter-overlay\">\n <div\n className={classNames(\n 'chart-panel-overlay-content chart-filter-overlay-content',\n { 'chart-filter-waiting-filter': isWaitingFilters },\n { 'chart-filter-waiting-input': isWaitingInput }\n )}\n >\n {isWaitingFilters && (\n <>\n <div className=\"info-message\">\n This plot requires a filter control to be added to the layout or a\n table link to be created on the following columns:\n </div>\n <div className=\"waiting-filter-list\">\n {columns.map(column => {\n const isColumnWaiting = waitingFilterMap.has(column.name);\n const icon = isColumnWaiting ? vsWarning : vsPass;\n return (\n <div\n key={column.name}\n className={classNames('waiting-filter-item', {\n 'is-invalid': isColumnWaiting,\n })}\n >\n <FontAwesomeIcon icon={icon} />\n {column.name}\n </div>\n );\n })}\n </div>\n <div>\n <ButtonOld onClick={handleAddClick} className=\"btn-primary\">\n Add Input Filters\n </ButtonOld>\n <ButtonOld onClick={handleOpenLinker} className=\"btn-primary\">\n Open Linker Tool\n </ButtonOld>\n </div>\n </>\n )}\n {isWaitingInput && (\n <>\n <div className=\"info-message\">Waiting for User Input</div>\n <div className=\"\">{inputMessage}</div>\n </>\n )}\n </div>\n </div>\n );\n}\n\nChartFilterOverlay.propTypes = {\n columnMap: PropTypes.instanceOf(Map).isRequired,\n inputFilterMap: PropTypes.instanceOf(Map).isRequired,\n linkedColumnMap: PropTypes.instanceOf(Map).isRequired,\n onAdd: PropTypes.func.isRequired,\n onOpenLinker: PropTypes.func.isRequired,\n waitingFilterMap: PropTypes.instanceOf(Map).isRequired,\n waitingInputMap: PropTypes.instanceOf(Map).isRequired,\n};\n\nexport default ChartFilterOverlay;\n"],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- /* stylelint-disable scss/at-import-no-partial-leading-underscore */
2
- .iris-chart-panel {
3
- overflow: hidden;
4
- }
5
- .iris-chart-panel.disconnected .chart-container, .iris-chart-panel.inactive .chart-container, .iris-chart-panel.input-required .chart-container {
6
- filter: grayscale(100%);
7
- }
8
- .iris-chart-panel.disconnected .chart-container {
9
- opacity: 0.18;
10
- }
11
-
12
- .chart-panel-overlay {
13
- background-color: rgba(0, 0, 0, 0.5);
14
- position: absolute;
15
- top: 0;
16
- bottom: 0;
17
- left: 0;
18
- right: 0;
19
- display: flex;
20
- text-align: center;
21
- flex-direction: column;
22
- justify-content: center;
23
- align-items: center;
24
- overflow: auto;
25
- }
26
- .chart-panel-overlay .chart-panel-overlay-content {
27
- display: flex;
28
- flex-direction: column;
29
- justify-content: center;
30
- white-space: pre-line;
31
- max-width: 450px;
32
- margin: 1rem;
33
- }
34
- .chart-panel-overlay .chart-panel-overlay-content .info-message {
35
- font-size: 1.2rem;
36
- }
37
-
38
- /*# sourceMappingURL=ChartPanel.css.map */
@@ -1 +0,0 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../../node_modules/@deephaven/components/scss/custom.scss","../../src/panels/ChartPanel.scss","../../../../node_modules/@deephaven/components/scss/new_variables.scss"],"names":[],"mappings":"AAAA;ACOA;EACE;;AAKE;EACE;;AAIF;EACE,SAjB6B;;;AAsBnC;EACE,kBArBiB;EAsBjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,WAtCwB;EAuCxB,QCxCO;;AD0CP;EACE,WA5CsB","file":"ChartPanel.css","sourcesContent":["/* stylelint-disable scss/at-import-no-partial-leading-underscore */\n// Consumers should be able to resolve bootstrap/ to node_modules/bootstrap\n\n//Make bootstrap functions available for use in overrides\n@import 'bootstrap/scss/_functions.scss';\n@import './bootstrap_overrides.scss';\n\n//_variable imports come after bootstrap default overrides,\n// makes all other variables and mixins from bootstrap available\n/// with just importing customer.scss\n@import 'bootstrap/scss/_variables.scss';\n@import 'bootstrap/scss/_mixins.scss';\n\n//New variables come after imports\n@import './new_variables.scss';\n","@import '@deephaven/components/scss/custom.scss';\n\n$chart-panel-disconnected-opacity: 0.18;\n$overlay-message-font-size: 1.2rem;\n$overlay-scrim-bg: rgba(black, 0.5);\n$overlay-content-max-width: 450px;\n\n.iris-chart-panel {\n overflow: hidden;\n\n &.disconnected,\n &.inactive,\n &.input-required {\n .chart-container {\n filter: grayscale(100%);\n }\n }\n &.disconnected {\n .chart-container {\n opacity: $chart-panel-disconnected-opacity;\n }\n }\n}\n\n.chart-panel-overlay {\n background-color: $overlay-scrim-bg;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n display: flex;\n text-align: center;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n overflow: auto;\n\n .chart-panel-overlay-content {\n display: flex;\n flex-direction: column;\n justify-content: center;\n white-space: pre-line;\n max-width: $overlay-content-max-width;\n margin: $spacer-3;\n\n .info-message {\n font-size: $overlay-message-font-size;\n }\n }\n}\n","//Set of spacer variables from the spacer map\n$spacer-0: map-get($spacers, 0); //0\n$spacer-1: map-get($spacers, 1);\n$spacer-2: map-get($spacers, 2);\n$spacer-3: map-get($spacers, 3);\n$spacer-4: map-get($spacers, 4);\n$spacer-5: map-get($spacers, 5);\n\n//Marching Ants for golden layout dropzone and drag and drop\n//top bottom, left right.\n//create 4 background images that are 50% color 1, 50% color 2 using graidents, two veritical, two horizontal\n//size them to ant-size and thickness\n//position those images along the egdes and make top/bottom repeat-x and left/right repeat-y\n//then offest each of those background positions by ant-size in animation to make them march.\n$ant-size: 8px;\n$ant-thickness: 1px;\n\n@mixin ants-base($color-1: black, $color-2: white) {\n background-image: linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to right, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%),\n linear-gradient(to bottom, $color-2 50%, $color-1 50%);\n background-size: $ant-size $ant-thickness, $ant-size $ant-thickness,\n $ant-thickness $ant-size, $ant-thickness $ant-size;\n background-position: 0 top, 0 bottom, left 0, right 0;\n background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;\n animation: march 0.5s;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n@mixin drag-stack($pseudo-element) {\n &::#{$pseudo-element} {\n content: ' ';\n background: $primary;\n box-shadow: $box-shadow;\n border-radius: $border-radius;\n position: absolute;\n height: 100%;\n width: 100%;\n @content;\n }\n}\n\n$focus-bg-transparency: 0.12;\n$hover-bg-transparency: 0.14;\n$active-bg-transparency: 0.28;\n$exception-transparency: 0.13;\n"]}