@deephaven/iris-grid 0.57.2-beta.1 → 0.58.1-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/AdvancedFilterCreator.css.map +1 -1
  2. package/dist/AdvancedFilterCreatorFilterItem.css.map +1 -1
  3. package/dist/AdvancedFilterCreatorSelectValue.css.map +1 -1
  4. package/dist/ColumnStatistics.css.map +1 -1
  5. package/dist/FilterInputField.css +11 -8
  6. package/dist/FilterInputField.css.map +1 -1
  7. package/dist/GotoRow.css.map +1 -1
  8. package/dist/IrisGrid.css +9 -6
  9. package/dist/IrisGrid.css.map +1 -1
  10. package/dist/IrisGrid.d.ts +4 -0
  11. package/dist/IrisGrid.d.ts.map +1 -1
  12. package/dist/IrisGrid.js +33 -5
  13. package/dist/IrisGrid.js.map +1 -1
  14. package/dist/IrisGridBottomBar.css +2 -3
  15. package/dist/IrisGridBottomBar.css.map +1 -1
  16. package/dist/IrisGridCellOverflowModal.js +1 -1
  17. package/dist/IrisGridCellOverflowModal.js.map +1 -1
  18. package/dist/IrisGridCopyHandler.css +1 -2
  19. package/dist/IrisGridCopyHandler.css.map +1 -1
  20. package/dist/IrisGridCopyHandler.d.ts +12 -4
  21. package/dist/IrisGridCopyHandler.d.ts.map +1 -1
  22. package/dist/IrisGridCopyHandler.js +72 -32
  23. package/dist/IrisGridCopyHandler.js.map +1 -1
  24. package/dist/IrisGridPartitionSelector.css.map +1 -1
  25. package/dist/IrisGridRenderer.js +1 -1
  26. package/dist/IrisGridRenderer.js.map +1 -1
  27. package/dist/IrisGridTheme.d.ts.map +1 -1
  28. package/dist/IrisGridTheme.js +1 -0
  29. package/dist/IrisGridTheme.js.map +1 -1
  30. package/dist/IrisGridTheme.module.css +1 -0
  31. package/dist/IrisGridTheme.module.css.map +1 -1
  32. package/dist/PartitionSelectorSearch.css +2 -2
  33. package/dist/PartitionSelectorSearch.css.map +1 -1
  34. package/dist/PendingDataBottomBar.css +1 -8
  35. package/dist/PendingDataBottomBar.css.map +1 -1
  36. package/dist/format-context-menus/CustomFormatAction.css +1 -1
  37. package/dist/mousehandlers/IrisGridContextMenuHandler.css +2 -2
  38. package/dist/mousehandlers/IrisGridContextMenuHandler.css.map +1 -1
  39. package/dist/mousehandlers/IrisGridContextMenuHandler.d.ts.map +1 -1
  40. package/dist/mousehandlers/IrisGridContextMenuHandler.js +2 -0
  41. package/dist/mousehandlers/IrisGridContextMenuHandler.js.map +1 -1
  42. package/dist/mousehandlers/IrisGridCopyCellMouseHandler.d.ts +10 -0
  43. package/dist/mousehandlers/IrisGridCopyCellMouseHandler.d.ts.map +1 -0
  44. package/dist/mousehandlers/IrisGridCopyCellMouseHandler.js +34 -0
  45. package/dist/mousehandlers/IrisGridCopyCellMouseHandler.js.map +1 -0
  46. package/dist/mousehandlers/index.d.ts +1 -0
  47. package/dist/mousehandlers/index.d.ts.map +1 -1
  48. package/dist/mousehandlers/index.js +1 -0
  49. package/dist/mousehandlers/index.js.map +1 -1
  50. package/dist/sidebar/ChartBuilder.css.map +1 -1
  51. package/dist/sidebar/CustomColumnBuilder.css +3 -3
  52. package/dist/sidebar/CustomColumnBuilder.css.map +1 -1
  53. package/dist/sidebar/CustomColumnBuilder.d.ts.map +1 -1
  54. package/dist/sidebar/CustomColumnBuilder.js +2 -5
  55. package/dist/sidebar/CustomColumnBuilder.js.map +1 -1
  56. package/dist/sidebar/InputEditor.css.map +1 -1
  57. package/dist/sidebar/RollupRows.css +3 -2
  58. package/dist/sidebar/RollupRows.css.map +1 -1
  59. package/dist/sidebar/SelectDistinctBuilder.css.map +1 -1
  60. package/dist/sidebar/TableCsvExporter.css.map +1 -1
  61. package/dist/sidebar/aggregations/AggregationEdit.css.map +1 -1
  62. package/dist/sidebar/aggregations/Aggregations.css.map +1 -1
  63. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css +1 -1
  64. package/dist/sidebar/conditional-formatting/ConditionalFormattingMenu.css.map +1 -1
  65. package/dist/sidebar/conditional-formatting/StyleEditor.css +1 -1
  66. package/dist/sidebar/conditional-formatting/StyleEditor.css.map +1 -1
  67. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css +4 -2
  68. package/dist/sidebar/visibility-ordering-builder/VisibilityOrderingBuilder.css.map +1 -1
  69. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css +4 -4
  70. package/dist/sidebar/visibility-ordering-builder/sortable-tree/TreeItem.css.map +1 -1
  71. package/package.json +15 -15
@@ -5,8 +5,7 @@
5
5
  left: 0;
6
6
  right: 0;
7
7
  height: calc(50px * 2);
8
- background-color: var(--dh-color-accent-100);
9
- color: var(--dh-color-text);
8
+ background-color: var(--dh-color-surface-bg);
10
9
  display: flex;
11
10
  flex-direction: row;
12
11
  align-content: center;
@@ -51,7 +50,7 @@
51
50
  }
52
51
  .iris-grid-bottom-bar .buttons-container .btn .svg-inline--fa,
53
52
  .iris-grid-bottom-bar .buttons-container .btn .loading-spinner {
54
- margin-right: 0.5rem;
53
+ margin: 0 0.25rem 0 0;
55
54
  }
56
55
  .iris-grid-bottom-bar .buttons-container .btn:not(:last-child) {
57
56
  margin-right: 0.5em;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/IrisGridBottomBar.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACKA;EACE;EACA;EACA;EACA;EACA;EACA,kBCyMS;EDxMT,OCyMY;EDxMZ;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;AAAA;EACE;EACA;EACA;;AAEF;AAAA;EACE;;AAIJ;EACE,OC0DK;;ADvDP;EACE;EACA;EACA;EACA;;AAEA;EACE;;AACA;AAAA;EAEE;;AAIJ;EACE;;;AAKN;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,QA7EkB;EA8ElB;;;AAGF;EACE;;;AAGF;EACE;EACA","file":"IrisGridBottomBar.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$bottom-bar-height: 50px;\n$ease-out-bounce-back: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n\n.iris-grid-bottom-bar {\n position: absolute;\n bottom: -$bottom-bar-height;\n left: 0;\n right: 0;\n height: calc(#{$bottom-bar-height} * 2);\n background-color: $toast-bg;\n color: $toast-color;\n display: flex;\n flex-direction: row;\n align-content: center;\n padding-left: 1em;\n padding-right: 1em;\n padding-bottom: 50px;\n\n .status-message,\n .error-message {\n flex-grow: 1;\n flex-shrink: 1;\n font-weight: 600;\n margin-right: 1em;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: -4px;\n user-select: none;\n span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n .svg-inline--fa {\n margin-right: 0.5rem;\n }\n }\n\n .error-message {\n color: $danger;\n }\n\n .buttons-container {\n flex-grow: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .btn {\n min-width: 10rem;\n .svg-inline--fa,\n .loading-spinner {\n margin-right: 0.5rem;\n }\n }\n\n .btn:not(:last-child) {\n margin-right: 0.5em;\n }\n }\n}\n\n.iris-grid-bottom-bar-slide-up-enter {\n transform: translate3d(0, 100%, 0);\n}\n\n.iris-grid-bottom-bar-slide-up-enter-active {\n transform: initial;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.iris-grid-bottom-bar-slide-up-enter-done {\n position: relative;\n bottom: 0;\n padding-bottom: 0;\n height: $bottom-bar-height;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.iris-grid-bottom-bar-slide-up-exit {\n transform: initial;\n}\n\n.iris-grid-bottom-bar-slide-up-exit-active {\n transform: translate3d(0, 100%, 0);\n transition: transform $transition-long $ease-out-bounce-back;\n}\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg);\n$foreground: var(--dh-color-fg);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$primary-light: var(--dh-color-accent-1100);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\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:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n 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$text-select-color: var(--dh-color-text-highlight);\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 hsla(var(--dh-color-black-hsl), 0.45); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem hsla(var(--dh-color-true-black-hsl), 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:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: hsla(var(--dh-color-accent-hsl), 0.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-active-bg: var(--dh-color-accent-1100);\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// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\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: $gray-500;\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: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\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: hsla(var(--dh-color-accent-hsl), 0.5);\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: $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\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/IrisGridBottomBar.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACKA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;AAAA;EACE;EACA;EACA;;AAEF;AAAA;EACE;;AAIJ;EACE,OC2DK;;ADxDP;EACE;EACA;EACA;EACA;;AAEA;EACE;;AACA;AAAA;EAEE;;AAIJ;EACE;;;AAKN;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,QA5EkB;EA6ElB;;;AAGF;EACE;;;AAGF;EACE;EACA","file":"IrisGridBottomBar.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$bottom-bar-height: 50px;\n$ease-out-bounce-back: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n\n.iris-grid-bottom-bar {\n position: absolute;\n bottom: -$bottom-bar-height;\n left: 0;\n right: 0;\n height: calc(#{$bottom-bar-height} * 2);\n background-color: var(--dh-color-surface-bg);\n display: flex;\n flex-direction: row;\n align-content: center;\n padding-left: 1em;\n padding-right: 1em;\n padding-bottom: 50px;\n\n .status-message,\n .error-message {\n flex-grow: 1;\n flex-shrink: 1;\n font-weight: 600;\n margin-right: 1em;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: -4px;\n user-select: none;\n span {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n .svg-inline--fa {\n margin-right: 0.5rem;\n }\n }\n\n .error-message {\n color: $danger;\n }\n\n .buttons-container {\n flex-grow: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .btn {\n min-width: 10rem;\n .svg-inline--fa,\n .loading-spinner {\n margin: 0 $spacer-1 0 0;\n }\n }\n\n .btn:not(:last-child) {\n margin-right: 0.5em;\n }\n }\n}\n\n.iris-grid-bottom-bar-slide-up-enter {\n transform: translate3d(0, 100%, 0);\n}\n\n.iris-grid-bottom-bar-slide-up-enter-active {\n transform: initial;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.iris-grid-bottom-bar-slide-up-enter-done {\n position: relative;\n bottom: 0;\n padding-bottom: 0;\n height: $bottom-bar-height;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.iris-grid-bottom-bar-slide-up-exit {\n transform: initial;\n}\n\n.iris-grid-bottom-bar-slide-up-exit-active {\n transform: translate3d(0, 100%, 0);\n transition: transform $transition-long $ease-out-bounce-back;\n}\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg);\n$foreground: var(--dh-color-fg);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$primary-light: var(--dh-color-accent-1100);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\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:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n 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$text-select-color: var(--dh-color-text-highlight);\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 var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: hsla(var(--dh-color-accent-hsl), 0.35);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units. Using 0.4214rem with 1.3\n// line height gets us to 31.99px vs Spectrum's 32px.\n$input-btn-padding-y: 0.4214rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\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: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\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: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-input-disabled-fg);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\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: $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\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n"]}
@@ -104,7 +104,7 @@ export default function IrisGridCellOverflowModal(_ref) {
104
104
  setIsOpened(false);
105
105
  setHeight(0);
106
106
  },
107
- className: "theme-bg-dark cell-overflow-modal",
107
+ className: "cell-overflow-modal",
108
108
  size: "xl",
109
109
  children: [/*#__PURE__*/_jsxs(ModalHeader, {
110
110
  toggle: onClose,
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridCellOverflowModal.js","names":["React","useEffect","useRef","useState","Editor","Button","CopyButton","Modal","ModalBody","ModalHeader","vsJson","vsListOrdered","jsx","_jsx","jsxs","_jsxs","IrisGridCellOverflowModal","_ref","_editorRef$current$ge","_editorRef$current2","text","isOpen","onClose","isOpened","setIsOpened","height","setHeight","showLineNumbers","setShowLineNumbers","isFormatted","setIsFormatted","canFormat","setCanFormat","editorRef","enableFormatButtonWhenOpen","JSON","parse","_unused","updateLayoutOnHeightChange","current","layout","toggleShowLineNumber","updateOptions","lineNumbers","toggleLineNumbers","formatAsJSON","_editorRef$current","model","getModel","setValue","stringify","undefined","autoSetLineNumbers","_editor$getModel$getL","_editor$getModel","editor","getLineCount","handleToggle","onEditorInitialized","getContentHeight","onDidContentSizeChange","_ref2","contentHeight","centered","keyboard","toggle","onOpened","onClosed","className","size","children","kind","tooltip","copy","getValue","active","icon","onClick","style","settings","value","readOnly","wordWrap","language","folding","padding","bottom","overviewRulerLanes","renderLineHighlight","find","seedSearchStringFromSelection"],"sources":["../src/IrisGridCellOverflowModal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Editor } from '@deephaven/console';\nimport * as monaco from 'monaco-editor';\nimport {\n Button,\n CopyButton,\n Modal,\n ModalBody,\n ModalHeader,\n} from '@deephaven/components';\nimport { vsJson, vsListOrdered } from '@deephaven/icons';\nimport './IrisGridCellOverflowModal.scss';\n\ninterface IrisGridCellOverflowModalProps {\n text: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function IrisGridCellOverflowModal({\n text,\n isOpen,\n onClose,\n}: IrisGridCellOverflowModalProps): React.ReactElement | null {\n const [isOpened, setIsOpened] = useState(false);\n const [height, setHeight] = useState(0);\n const [showLineNumbers, setShowLineNumbers] = useState(false);\n const [isFormatted, setIsFormatted] = useState(false);\n const [canFormat, setCanFormat] = useState(false);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();\n\n // Update format button on open\n useEffect(\n function enableFormatButtonWhenOpen() {\n if (!isOpen) {\n return;\n }\n\n try {\n JSON.parse(text);\n setCanFormat(true);\n } catch {\n setCanFormat(false);\n }\n setIsFormatted(false);\n },\n [isOpen, text]\n );\n\n // Re-layout editor on height change\n useEffect(\n function updateLayoutOnHeightChange() {\n if (editorRef.current) {\n editorRef.current.layout();\n }\n },\n [height]\n );\n\n // Update editor options on line number toggle\n useEffect(\n function toggleShowLineNumber() {\n if (editorRef.current) {\n editorRef.current.updateOptions({\n lineNumbers: showLineNumbers ? 'on' : 'off',\n });\n }\n },\n [showLineNumbers]\n );\n\n function toggleLineNumbers(): void {\n setShowLineNumbers(!showLineNumbers);\n }\n\n function formatAsJSON(): void {\n const model = editorRef.current?.getModel();\n if (!canFormat || !model) {\n return;\n }\n\n if (!isFormatted) {\n model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));\n setIsFormatted(true);\n } else {\n model.setValue(text);\n setIsFormatted(false);\n }\n autoSetLineNumbers();\n }\n\n function autoSetLineNumbers(): void {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n setShowLineNumbers((editor.getModel()?.getLineCount() ?? 0) > 1);\n }\n\n function handleToggle(): void {\n if (isOpened) {\n editorRef.current = undefined;\n onClose();\n }\n }\n\n function onEditorInitialized(\n editor: monaco.editor.IStandaloneCodeEditor\n ): void {\n editorRef.current = editor;\n setHeight(editor.getContentHeight());\n editor.onDidContentSizeChange(({ contentHeight }) =>\n setHeight(contentHeight)\n );\n autoSetLineNumbers();\n }\n\n if (!isOpen && !isOpened) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n centered\n keyboard\n toggle={handleToggle}\n onOpened={() => setIsOpened(true)}\n onClosed={() => {\n setIsOpened(false);\n setHeight(0);\n }}\n className=\"theme-bg-dark cell-overflow-modal\"\n size=\"xl\"\n >\n <ModalHeader toggle={onClose}>\n <h5 className=\"overflow-modal-title\">Cell Contents</h5>\n <CopyButton\n kind=\"inline\"\n tooltip=\"Copy cell contents\"\n copy={editorRef.current?.getValue() ?? text}\n />\n <Button\n kind=\"inline\"\n active={showLineNumbers}\n icon={vsListOrdered}\n tooltip=\"Toggle line numbers\"\n onClick={toggleLineNumbers}\n />\n {canFormat && (\n <Button\n kind=\"inline\"\n icon={vsJson}\n active={isFormatted}\n tooltip=\"Format as JSON\"\n onClick={formatAsJSON}\n />\n )}\n </ModalHeader>\n <ModalBody style={{ height }}>\n <Editor\n onEditorInitialized={onEditorInitialized}\n settings={{\n value: text,\n readOnly: true,\n wordWrap: 'on',\n // Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same\n language: canFormat ? 'typescript' : 'plaintext',\n folding: canFormat,\n padding: { bottom: 16 },\n lineNumbers: showLineNumbers ? 'on' : 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n /*\n The entire string may be 1 giant line\n Monaco by default seeds find w/ that line\n On very long strings this hangs the browser, so never seed the search\n */\n find: { seedSearchStringFromSelection: 'never' },\n }}\n />\n </ModalBody>\n </Modal>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"IrisGridCellOverflowModal.js","names":["React","useEffect","useRef","useState","Editor","Button","CopyButton","Modal","ModalBody","ModalHeader","vsJson","vsListOrdered","jsx","_jsx","jsxs","_jsxs","IrisGridCellOverflowModal","_ref","_editorRef$current$ge","_editorRef$current2","text","isOpen","onClose","isOpened","setIsOpened","height","setHeight","showLineNumbers","setShowLineNumbers","isFormatted","setIsFormatted","canFormat","setCanFormat","editorRef","enableFormatButtonWhenOpen","JSON","parse","_unused","updateLayoutOnHeightChange","current","layout","toggleShowLineNumber","updateOptions","lineNumbers","toggleLineNumbers","formatAsJSON","_editorRef$current","model","getModel","setValue","stringify","undefined","autoSetLineNumbers","_editor$getModel$getL","_editor$getModel","editor","getLineCount","handleToggle","onEditorInitialized","getContentHeight","onDidContentSizeChange","_ref2","contentHeight","centered","keyboard","toggle","onOpened","onClosed","className","size","children","kind","tooltip","copy","getValue","active","icon","onClick","style","settings","value","readOnly","wordWrap","language","folding","padding","bottom","overviewRulerLanes","renderLineHighlight","find","seedSearchStringFromSelection"],"sources":["../src/IrisGridCellOverflowModal.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { Editor } from '@deephaven/console';\nimport * as monaco from 'monaco-editor';\nimport {\n Button,\n CopyButton,\n Modal,\n ModalBody,\n ModalHeader,\n} from '@deephaven/components';\nimport { vsJson, vsListOrdered } from '@deephaven/icons';\nimport './IrisGridCellOverflowModal.scss';\n\ninterface IrisGridCellOverflowModalProps {\n text: string;\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport default function IrisGridCellOverflowModal({\n text,\n isOpen,\n onClose,\n}: IrisGridCellOverflowModalProps): React.ReactElement | null {\n const [isOpened, setIsOpened] = useState(false);\n const [height, setHeight] = useState(0);\n const [showLineNumbers, setShowLineNumbers] = useState(false);\n const [isFormatted, setIsFormatted] = useState(false);\n const [canFormat, setCanFormat] = useState(false);\n const editorRef = useRef<monaco.editor.IStandaloneCodeEditor>();\n\n // Update format button on open\n useEffect(\n function enableFormatButtonWhenOpen() {\n if (!isOpen) {\n return;\n }\n\n try {\n JSON.parse(text);\n setCanFormat(true);\n } catch {\n setCanFormat(false);\n }\n setIsFormatted(false);\n },\n [isOpen, text]\n );\n\n // Re-layout editor on height change\n useEffect(\n function updateLayoutOnHeightChange() {\n if (editorRef.current) {\n editorRef.current.layout();\n }\n },\n [height]\n );\n\n // Update editor options on line number toggle\n useEffect(\n function toggleShowLineNumber() {\n if (editorRef.current) {\n editorRef.current.updateOptions({\n lineNumbers: showLineNumbers ? 'on' : 'off',\n });\n }\n },\n [showLineNumbers]\n );\n\n function toggleLineNumbers(): void {\n setShowLineNumbers(!showLineNumbers);\n }\n\n function formatAsJSON(): void {\n const model = editorRef.current?.getModel();\n if (!canFormat || !model) {\n return;\n }\n\n if (!isFormatted) {\n model.setValue(JSON.stringify(JSON.parse(text), undefined, 2));\n setIsFormatted(true);\n } else {\n model.setValue(text);\n setIsFormatted(false);\n }\n autoSetLineNumbers();\n }\n\n function autoSetLineNumbers(): void {\n const editor = editorRef.current;\n if (!editor) {\n return;\n }\n\n setShowLineNumbers((editor.getModel()?.getLineCount() ?? 0) > 1);\n }\n\n function handleToggle(): void {\n if (isOpened) {\n editorRef.current = undefined;\n onClose();\n }\n }\n\n function onEditorInitialized(\n editor: monaco.editor.IStandaloneCodeEditor\n ): void {\n editorRef.current = editor;\n setHeight(editor.getContentHeight());\n editor.onDidContentSizeChange(({ contentHeight }) =>\n setHeight(contentHeight)\n );\n autoSetLineNumbers();\n }\n\n if (!isOpen && !isOpened) {\n return null;\n }\n\n return (\n <Modal\n isOpen={isOpen}\n centered\n keyboard\n toggle={handleToggle}\n onOpened={() => setIsOpened(true)}\n onClosed={() => {\n setIsOpened(false);\n setHeight(0);\n }}\n className=\"cell-overflow-modal\"\n size=\"xl\"\n >\n <ModalHeader toggle={onClose}>\n <h5 className=\"overflow-modal-title\">Cell Contents</h5>\n <CopyButton\n kind=\"inline\"\n tooltip=\"Copy cell contents\"\n copy={editorRef.current?.getValue() ?? text}\n />\n <Button\n kind=\"inline\"\n active={showLineNumbers}\n icon={vsListOrdered}\n tooltip=\"Toggle line numbers\"\n onClick={toggleLineNumbers}\n />\n {canFormat && (\n <Button\n kind=\"inline\"\n icon={vsJson}\n active={isFormatted}\n tooltip=\"Format as JSON\"\n onClick={formatAsJSON}\n />\n )}\n </ModalHeader>\n <ModalBody style={{ height }}>\n <Editor\n onEditorInitialized={onEditorInitialized}\n settings={{\n value: text,\n readOnly: true,\n wordWrap: 'on',\n // Loading json language w/o the monaco workers causes UI freezes and monaco errors. TS colorizes the same\n language: canFormat ? 'typescript' : 'plaintext',\n folding: canFormat,\n padding: { bottom: 16 },\n lineNumbers: showLineNumbers ? 'on' : 'off',\n overviewRulerLanes: 0,\n renderLineHighlight: 'none',\n /*\n The entire string may be 1 giant line\n Monaco by default seeds find w/ that line\n On very long strings this hangs the browser, so never seed the search\n */\n find: { seedSearchStringFromSelection: 'never' },\n }}\n />\n </ModalBody>\n </Modal>\n );\n}\n"],"mappings":"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"}
@@ -5,8 +5,7 @@
5
5
  left: 0;
6
6
  right: 0;
7
7
  height: 100px;
8
- background-color: var(--dh-color-accent-100);
9
- color: var(--dh-color-text);
8
+ background-color: var(--dh-color-surface-bg);
10
9
  display: flex;
11
10
  flex-direction: row;
12
11
  align-content: center;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/IrisGridCopyHandler.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACIA;EACE;EACA;EACA;EACA;EACA;EACA,kBC0MS;EDzMT,OC0MY;EDzMZ;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE,OC9BK;ED+BL,cC/BK;EDgCL;;AAGF;EACE;;;AAKN;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA","file":"IrisGridCopyHandler.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$ease-out-bounce-back: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n\n.iris-grid-copy-handler {\n position: absolute;\n bottom: -50px;\n left: 0;\n right: 0;\n height: 100px;\n background-color: $toast-bg;\n color: $toast-color;\n display: flex;\n flex-direction: row;\n align-content: center;\n padding-left: 1em;\n padding-right: 1em;\n padding-bottom: 50px;\n\n .status-message {\n flex-grow: 1;\n font-weight: 600;\n margin-right: 1em;\n text-overflow: ellipsis;\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: -4px;\n user-select: none;\n }\n\n .buttons-container {\n flex-grow: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .btn {\n min-width: 10rem;\n }\n\n .btn-cancel {\n color: $gray-100;\n border-color: $gray-100;\n margin-right: 0.5em;\n }\n\n .btn-copy:disabled {\n opacity: 1;\n }\n }\n}\n\n.copy-slide-up-enter {\n transform: translateY(50px);\n}\n\n.copy-slide-up-enter-active {\n transform: initial;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.copy-slide-up-exit {\n transform: initial;\n}\n\n.copy-slide-up-exit-active {\n transform: translateY(50px);\n transition: transform $transition-long $ease-out-bounce-back;\n}\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg);\n$foreground: var(--dh-color-fg);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$primary-light: var(--dh-color-accent-1100);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\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:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n 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$text-select-color: var(--dh-color-text-highlight);\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 hsla(var(--dh-color-black-hsl), 0.45); //because our UI is so dark, we need darker default shadows\n$box-shadow-900: 0 0.1rem 1rem hsla(var(--dh-color-true-black-hsl), 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:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: hsla(var(--dh-color-accent-hsl), 0.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-active-bg: var(--dh-color-accent-1100);\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// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\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: $gray-500;\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: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\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: hsla(var(--dh-color-accent-hsl), 0.5);\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: $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\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n"]}
1
+ {"version":3,"sourceRoot":"","sources":["../../../node_modules/@deephaven/components/scss/custom.scss","../src/IrisGridCopyHandler.scss","../../../node_modules/@deephaven/components/scss/bootstrap_overrides.scss"],"names":[],"mappings":"AAAA;ACIA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;;AAGF;EACE,OC7BK;ED8BL,cC9BK;ED+BL;;AAGF;EACE;;;AAKN;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA","file":"IrisGridCopyHandler.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$ease-out-bounce-back: cubic-bezier(0.175, 0.885, 0.32, 1.275);\n\n.iris-grid-copy-handler {\n position: absolute;\n bottom: -50px;\n left: 0;\n right: 0;\n height: 100px;\n background-color: var(--dh-color-surface-bg);\n display: flex;\n flex-direction: row;\n align-content: center;\n padding-left: 1em;\n padding-right: 1em;\n padding-bottom: 50px;\n\n .status-message {\n flex-grow: 1;\n font-weight: 600;\n margin-right: 1em;\n text-overflow: ellipsis;\n display: flex;\n flex-direction: row;\n align-items: center;\n margin-top: -4px;\n user-select: none;\n }\n\n .buttons-container {\n flex-grow: 0;\n display: flex;\n flex-direction: row;\n align-items: center;\n\n .btn {\n min-width: 10rem;\n }\n\n .btn-cancel {\n color: $gray-100;\n border-color: $gray-100;\n margin-right: 0.5em;\n }\n\n .btn-copy:disabled {\n opacity: 1;\n }\n }\n}\n\n.copy-slide-up-enter {\n transform: translateY(50px);\n}\n\n.copy-slide-up-enter-active {\n transform: initial;\n transition: transform $transition-long $ease-out-bounce-back;\n}\n\n.copy-slide-up-exit {\n transform: initial;\n}\n\n.copy-slide-up-exit-active {\n transform: translateY(50px);\n transition: transform $transition-long $ease-out-bounce-back;\n}\n","// Styling overrides for bootstrap\n@use 'sass:map';\n\n// Override / set color variables\n$red: var(--dh-color-visual-red);\n$orange: var(--dh-color-visual-orange);\n$yellow: var(--dh-color-visual-yellow);\n$green: var(--dh-color-visual-green);\n$blue: var(--dh-color-visual-blue);\n$purple: var(--dh-color-visual-purple);\n\n//Define our Gray scale\n$gray-100: var(--dh-color-gray-900, #fcfcfa);\n$gray-200: var(--dh-color-gray-800);\n$gray-300: var(--dh-color-gray-700);\n$gray-400: var(--dh-color-gray-600);\n$gray-500: var(--dh-color-gray-500);\n// intentional duplicate, scale doesn't line up otherwise\n// as we have gray-850 and spectrum doesn't and it is needed\n$gray-600: var(--dh-color-gray-500);\n$gray-700: var(--dh-color-gray-400);\n$gray-800: var(--dh-color-gray-300);\n$gray-850: var(--dh-color-gray-200);\n$gray-900: var(--dh-color-gray-75);\n$black: var(--dh-color-black, #1a171a);\n$white: var(--dh-color-white, #f0f0ee);\n\n//Define some UI colors\n$interfacegray: var(--dh-color-content-bg, #2d2a2e);\n$interfaceblue: var(--dh-color-accent-bg);\n$interfacewhite: $white;\n$interfaceblack: $black;\n$content-bg: var(--dh-color-content-bg, #2d2a2e);\n$background: var(--dh-color-bg);\n$foreground: var(--dh-color-fg);\n\n// Extend default Bootstrap $grays map\n$grays-custom: (\n '850': $gray-850,\n);\n$grays: () !default;\n$grays: map-merge($grays, $grays-custom);\n\n// Extend default Bootstrap $colors map\n$colors-custom: (\n 'black': $black,\n);\n$colors: () !default;\n$colors: map-merge($colors, $colors-custom);\n\n// Override default Bootstrap $theme-colors map by mapping each key to itself.\n// These will then be re-mapped inside of `button-outline-variant` and\n// `button-outline-variant` mixins in `bootstrap_override_mixins_buttons.scss`\n$theme-colors-self-map: ();\n@each $key\n in (\n 'primary',\n 'secondary',\n 'success',\n 'info',\n 'warning',\n 'danger',\n 'light',\n 'dark'\n )\n{\n $theme-colors-self-map: map.set($theme-colors-self-map, $key, $key);\n}\n$theme-colors: () !default;\n$theme-colors: map-merge($theme-colors, $theme-colors-self-map);\n\n// Used by bootstrap_override_mixins_buttons.scss to map Bootstrap colors to\n// DH semantic colors\n$bootstrap-dh-semantic-map: (\n 'primary': 'accent',\n 'secondary': 'neutral',\n 'success': 'positive',\n 'info': 'info',\n 'warning': 'notice',\n 'danger': 'negative',\n // We shouldn't be using these, but mapping so they work with our custom\n // `color-yiq` mixin. If we find a way to remove $light + $dark that are\n // defined in Bootstrap _variables.scss, we should remove these\n 'light': 'neutral',\n 'dark': 'neutral',\n);\n\n//Set default colors\n$body-bg: $black;\n$body-color: $interfacewhite;\n\n// Set brand colors\n$primary: var(--dh-color-accent-bg);\n$primary-hover: var(--dh-color-accent-hover-bg);\n$primary-dark: var(--dh-color-accent-down-bg);\n$primary-light: var(--dh-color-accent-1100);\n$secondary: var(--dh-color-neutral-bg);\n$secondary-hover: var(--dh-color-neutral-hover-bg);\n$success: $green;\n$info: $yellow;\n$warning: $orange;\n$danger: var(--dh-color-negative-bg);\n$danger-hover: var(--dh-color-negative-hover-bg);\n// We really don't want to use $light or $dark variables, but Bootstrap defines\n// them in _variables.scss. Explicitly setting them to ensure we are in control\n// of their values. If we can find a way to remove them, we should\n$light: var(--dh-color-gray-light);\n$dark: var(--dh-color-gray-dark);\n// Bootstrap doesn't define $mid, and we want to move away from this particular\n// semantic. Should be deleted by #1635\n$mid: var(--dh-color-gray-mid);\n\n$semantic-colors: (\n 'primary-hover': $primary-hover,\n 'primary-light': $primary-light,\n 'primary-dark': $primary-dark,\n 'mid': $mid,\n 'content-bg': $interfacegray,\n 'background': $interfaceblack,\n 'foreground': $interfacewhite,\n 'secondary-hover': $secondary-hover,\n 'danger-hover': $danger-hover,\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:\n 'Fira Sans',\n -apple-system,\n blinkmacsystemfont,\n 'Segoe UI',\n 'Roboto',\n 'Helvetica Neue',\n arial,\n 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$text-select-color: var(--dh-color-text-highlight);\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 var(--dh-color-dropshadow);\n\n//Override Btn\n$btn-border-radius: 4rem;\n$btn-padding-x: 1.5rem;\n$btn-transition:\n color 0.12s ease-in-out,\n background-color 0.12s ease-in-out,\n border-color 0.12s ease-in-out,\n box-shadow 0.12s ease-in-out; //default 0.15 is too long\n$btn-border-width: 2px;\n$btn-font-weight: var(--spectrum-global-font-weight-bold);\n$btn-line-height: 1.3;\n\n//Override Inputs\n$input-bg: var(--dh-color-input-bg);\n$input-disabled-bg: var(--dh-color-input-disabled-bg);\n$input-color: var(--dh-color-input-fg);\n$input-border-color: var(--dh-color-input-border);\n$input-placeholder-color: var(--dh-color-input-placeholder);\n$input-focus-border-color: var(--dh-color-input-focus-border);\n\n$input-btn-focus-width: 0.2rem;\n$input-btn-focus-color: hsla(var(--dh-color-accent-hsl), 0.35);\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color;\n$input-btn-line-height: 1.3;\n// Bootstrap uses a calc expression to determine the input height (calc(line-height + 2*padding-y + border)).\n// The padding-y value has to be in rem to match units. Using 0.4214rem with 1.3\n// line height gets us to 31.99px vs Spectrum's 32px.\n$input-btn-padding-y: 0.4214rem;\n\n//checkbox\n$custom-control-indicator-bg: var(--dh-color-input-bg);\n$custom-control-indicator-border-color: var(--dh-color-input-border);\n$custom-checkbox-indicator-border-radius: 2px;\n$custom-control-indicator-border-width: 2px;\n$custom-control-indicator-active-bg: var(--dh-color-input-bg);\n$custom-control-indicator-active-border-color: var(--dh-color-input-fg);\n$custom-control-indicator-checked-bg: var(--dh-color-input-fg);\n$custom-control-indicator-checked-color: black; // used as mask fill color\n$custom-checkbox-indicator-indeterminate-bg: var(--dh-color-input-fg);\n$custom-control-indicator-bg-size: 75% 75%;\n$custom-control-indicator-disabled-bg: var(--dh-color-input-disabled-bg);\n$custom-control-indicator-checked-disabled-bg: var(\n --dh-color-input-disabled-bg\n);\n$custom-control-label-disabled-color: var(--dh-color-input-disabled-fg);\n\n// The $custom-select-indicator variable is used by Bootstrap to provide the\n// icon for the select dropdown. Inline svgs can't use CSS variables, so we hard\n// code the color to #929192 (the default value of --dh-color-gray-600). PR #1651\n// overrides this icon altogether for known dropdowns, so technically we may not\n// need this, but it's here in case there are any remaining instances.\n$custom-select-indicator-color: #929192;\n$custom-select-bg: var(--dh-color-selector-bg);\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: $gray-500;\n$custom-select-disabled-bg: $gray-800;\n\n//modal\n$modal-content-bg: $content-bg;\n$modal-content-border-width: 0;\n$modal-md: 550px;\n$close-color: var(--dh-color-text);\n$close-text-shadow: none;\n\n// Toast notification\n$toast-bg: var(--dh-color-accent-100);\n$toast-color: var(--dh-color-text);\n$toast-error-bg: var(--dh-color-negative-bg);\n$toast-error-color: var(--dh-color-text);\n\n//tooltips\n$tooltip-bg: var(--dh-color-tooltip-bg);\n$tooltip-color: var(--dh-color-tooltip-fg);\n$tooltip-box-shadow: 0 0.1rem 1.5rem 0.1rem var(--dh-color-tooltip-box-shadow);\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: var(--dh-color-popover-bg);\n$contextmenu-color: var(--dh-color-text);\n$contextmenu-disabled-color: var(--dh-color-input-disabled-fg);\n$contextmenu-keyboard-selected-bg: var(--dh-color-keyboard-selected-bg);\n$contextmenu-selected-bg: var(--dh-color-item-list-hover-bg);\n$contextmenu-selected-color: var(--dh-color-item-list-selected-fg);\n\n//hr\n$hr-border-color: var(--dh-color-hr);\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: $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\n// This section of variables is not consumed directly by DH, but they need to be\n// defined for sass to compile _variables\n$table-dark-bg: $gray-800;\n$table-dark-accent-bg: var(--dh-color-highlight-hover);\n$table-dark-hover-bg: var(--dh-color-highlight-active);\n$table-dark-border-color: $gray-700;\n$popover-bg: var(--dh-color-tooltip-bg);\n$popover-border-color: var(--dh-color-overlay-modal-bg);\n$popover-header-bg: #000;\n$popover-arrow-outer-color: var(--dh-color-dropshadow);\n$custom-range-thumb-active-bg: var(--dh-color-accent-1100);\n"]}
@@ -5,14 +5,21 @@ import './IrisGridCopyHandler.scss';
5
5
  import IrisGridModel from './IrisGridModel';
6
6
  type Values<T> = T[keyof T];
7
7
  type ButtonStateType = Values<typeof IrisGridCopyHandler.BUTTON_STATES>;
8
- export type CopyOperation = {
8
+ type CommonCopyOperation = {
9
+ movedColumns: readonly MoveOperation[];
10
+ error?: string;
11
+ };
12
+ export type CopyRangesOperation = CommonCopyOperation & {
9
13
  ranges: readonly GridRange[];
10
14
  includeHeaders: boolean;
11
15
  formatValues?: boolean;
12
- movedColumns: readonly MoveOperation[];
13
16
  userColumnWidths: ModelSizeMap;
14
- error?: string;
15
17
  };
18
+ export type CopyHeaderOperation = CommonCopyOperation & {
19
+ columnIndex: number;
20
+ columnDepth: number;
21
+ };
22
+ export type CopyOperation = CopyRangesOperation | CopyHeaderOperation;
16
23
  interface IrisGridCopyHandlerProps {
17
24
  model: IrisGridModel;
18
25
  copyOperation: CopyOperation;
@@ -42,7 +49,8 @@ declare class IrisGridCopyHandler extends Component<IrisGridCopyHandlerProps, Ir
42
49
  static COPY_STATES: {
43
50
  IDLE: string;
44
51
  CONFIRMATION_REQUIRED: string;
45
- FETCH_IN_PROGRESS: string;
52
+ FETCH_RANGES_IN_PROGRESS: string;
53
+ FETCH_HEADER_IN_PROGRESS: string;
46
54
  FETCH_ERROR: string;
47
55
  CLICK_REQUIRED: string;
48
56
  DONE: string;
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridCopyHandler.d.ts","sourceRoot":"","sources":["../src/IrisGridCopyHandler.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIzC,OAAO,EACL,SAAS,EAET,YAAY,EACZ,aAAa,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iBAAiB,EAIlB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,4BAA4B,CAAC;AACpC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAI5C,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAE5B,KAAK,eAAe,GAAG,MAAM,CAAC,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAExE,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,EAAE,SAAS,aAAa,EAAE,CAAC;IACvC,gBAAgB,EAAE,YAAY,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,UAAU,wBAAwB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,aAAa,EAAE,aAAa,CAAC;IAC7B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,wBAAwB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD;;;;GAIG;AACH,cAAM,mBAAoB,SAAQ,SAAS,CACzC,wBAAwB,EACxB,wBAAwB,CACzB;IACC,MAAM,CAAC,mBAAmB,SAAS;IAEnC,MAAM,CAAC,YAAY,SAAQ;IAE3B;;OAEG;IACH,MAAM,CAAC,WAAW;;;;;;;MAkBhB;IAEF,MAAM,CAAC,aAAa;;;;;MAKlB;IAEF,MAAM,CAAC,YAAY;;0BAED,IAAI;yBACL,IAAI;yBACJ,IAAI;wBACL,IAAI;MAClB;IAEF,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAiBxE,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE,eAAe,GAAG,MAAM;gBAalD,KAAK,EAAE,wBAAwB;IAiB3C,iBAAiB,IAAI,IAAI;IAOzB,kBAAkB,CAAC,SAAS,EAAE,wBAAwB,GAAG,IAAI;IAO7D,oBAAoB,IAAI,IAAI;IAI5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IAE1C,YAAY,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAEzC,SAAS,IAAI,IAAI;IAsCjB,QAAQ,IAAI,IAAI;IAMhB,qBAAqB,IAAI,IAAI;IAS7B,iBAAiB,IAAI,IAAI;IAOnB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBtC,iBAAiB,IAAI,IAAI;IAQnB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,YAAY,IAAI,IAAI;IAKd,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiEjC,SAAS,IAAI,IAAI;IAQjB,cAAc,IAAI,IAAI;IAStB,aAAa,IAAI,IAAI;IAOrB,MAAM,IAAI,GAAG,CAAC,OAAO;CAkEtB;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"IrisGridCopyHandler.d.ts","sourceRoot":"","sources":["../src/IrisGridCopyHandler.tsx"],"names":[],"mappings":"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"}
@@ -16,6 +16,12 @@ import "./IrisGridCopyHandler.css";
16
16
  import { jsx as _jsx } from "react/jsx-runtime";
17
17
  import { jsxs as _jsxs } from "react/jsx-runtime";
18
18
  var log = Log.module('IrisGridCopyHandler');
19
+ function isCopyRangesOperation(copyOperation) {
20
+ return copyOperation.ranges != null;
21
+ }
22
+ function isCopyHeaderOperation(copyOperation) {
23
+ return copyOperation.columnIndex != null;
24
+ }
19
25
  /**
20
26
  * Component for handling copying of data from the Iris Grid.
21
27
  * - Prompts if necessary (large amount of rows copied)
@@ -34,8 +40,10 @@ class IrisGridCopyHandler extends Component {
34
40
  return "Fetched ".concat(rowCount.toLocaleString(), " rows!");
35
41
  case IrisGridCopyHandler.COPY_STATES.FETCH_ERROR:
36
42
  return 'Unable to copy data.';
37
- case IrisGridCopyHandler.COPY_STATES.FETCH_IN_PROGRESS:
43
+ case IrisGridCopyHandler.COPY_STATES.FETCH_RANGES_IN_PROGRESS:
38
44
  return "Fetching ".concat(rowCount.toLocaleString(), " rows for clipboard...");
45
+ case IrisGridCopyHandler.COPY_STATES.FETCH_HEADER_IN_PROGRESS:
46
+ return 'Fetching header for clipboard...';
39
47
  case IrisGridCopyHandler.COPY_STATES.DONE:
40
48
  return 'Copied to Clipboard!';
41
49
  default:
@@ -104,7 +112,6 @@ class IrisGridCopyHandler extends Component {
104
112
  return;
105
113
  }
106
114
  var {
107
- ranges,
108
115
  error
109
116
  } = copyOperation;
110
117
  if (error != null) {
@@ -117,20 +124,27 @@ class IrisGridCopyHandler extends Component {
117
124
  this.startHideTimer();
118
125
  return;
119
126
  }
120
- var rowCount = GridRange.rowCount(ranges);
121
127
  this.setState({
122
- rowCount,
123
128
  isShown: true,
124
129
  error: undefined
125
130
  });
126
- if (rowCount > IrisGridCopyHandler.NO_PROMPT_THRESHOLD) {
131
+ if (isCopyRangesOperation(copyOperation)) {
132
+ var {
133
+ ranges
134
+ } = copyOperation;
135
+ var rowCount = GridRange.rowCount(ranges);
127
136
  this.setState({
128
- buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,
129
- copyState: IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED
137
+ rowCount
130
138
  });
131
- } else {
132
- this.startFetch();
139
+ if (rowCount > IrisGridCopyHandler.NO_PROMPT_THRESHOLD) {
140
+ this.setState({
141
+ buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,
142
+ copyState: IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED
143
+ });
144
+ return;
145
+ }
133
146
  }
147
+ this.startFetch();
134
148
  }
135
149
  stopCopy() {
136
150
  this.textData = undefined;
@@ -199,32 +213,56 @@ class IrisGridCopyHandler extends Component {
199
213
  var _this3 = this;
200
214
  return _asyncToGenerator(function* () {
201
215
  _this3.stopFetch();
202
- _this3.setState({
203
- buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,
204
- copyState: IrisGridCopyHandler.COPY_STATES.FETCH_IN_PROGRESS
205
- });
206
216
  var {
207
217
  model,
208
218
  copyOperation
209
219
  } = _this3.props;
210
- var {
211
- ranges,
212
- includeHeaders,
213
- userColumnWidths,
214
- movedColumns,
215
- formatValues
216
- } = copyOperation;
217
- log.debug('startFetch', ranges);
218
- var hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);
219
- var modelRanges = GridUtils.getModelRanges(ranges, movedColumns);
220
- if (hiddenColumns.length > 0) {
221
- var subtractRanges = hiddenColumns.map(GridRange.makeColumn);
222
- modelRanges = GridRange.subtractRangesFromRanges(modelRanges, subtractRanges);
223
- }
220
+ if (isCopyHeaderOperation(copyOperation)) {
221
+ var {
222
+ columnIndex,
223
+ columnDepth,
224
+ movedColumns
225
+ } = copyOperation;
226
+ log.debug('startFetch copyHeader', columnIndex, columnDepth);
227
+ _this3.setState({
228
+ buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,
229
+ copyState: IrisGridCopyHandler.COPY_STATES.FETCH_HEADER_IN_PROGRESS
230
+ });
231
+ var modelIndex = GridUtils.getModelIndex(columnIndex, movedColumns);
232
+ var copyText = model.textForColumnHeader(modelIndex, columnDepth);
233
+ if (copyText === undefined) {
234
+ _this3.fetchPromise = undefined;
235
+ _this3.setState({
236
+ error: 'Invalid column header selected.',
237
+ copyState: IrisGridCopyHandler.COPY_STATES.DONE
238
+ });
239
+ return;
240
+ }
241
+ _this3.fetchPromise = PromiseUtils.makeCancelable(copyText);
242
+ } else {
243
+ var {
244
+ ranges,
245
+ includeHeaders,
246
+ userColumnWidths,
247
+ movedColumns: _movedColumns,
248
+ formatValues
249
+ } = copyOperation;
250
+ log.debug('startFetch copyRanges', ranges);
251
+ _this3.setState({
252
+ buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,
253
+ copyState: IrisGridCopyHandler.COPY_STATES.FETCH_RANGES_IN_PROGRESS
254
+ });
255
+ var hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);
256
+ var modelRanges = GridUtils.getModelRanges(ranges, _movedColumns);
257
+ if (hiddenColumns.length > 0) {
258
+ var subtractRanges = hiddenColumns.map(GridRange.makeColumn);
259
+ modelRanges = GridRange.subtractRangesFromRanges(modelRanges, subtractRanges);
260
+ }
224
261
 
225
- // Remove the hidden columns from the snapshot
226
- var formatValue = formatValues != null && formatValues ? (value, column) => model.displayString(value, column.type, column.name) : value => "".concat(value);
227
- _this3.fetchPromise = PromiseUtils.makeCancelable(model.textSnapshot(modelRanges, includeHeaders, formatValue));
262
+ // Remove the hidden columns from the snapshot
263
+ var formatValue = formatValues != null && formatValues ? (value, column) => model.displayString(value, column.type, column.name) : value => "".concat(value);
264
+ _this3.fetchPromise = PromiseUtils.makeCancelable(model.textSnapshot(modelRanges, includeHeaders, formatValue));
265
+ }
228
266
  try {
229
267
  var text = yield _this3.fetchPromise;
230
268
  _this3.fetchPromise = undefined;
@@ -341,8 +379,10 @@ _defineProperty(IrisGridCopyHandler, "COPY_STATES", {
341
379
  IDLE: 'IDLE',
342
380
  // Large copy operation, confirmation required
343
381
  CONFIRMATION_REQUIRED: 'CONFIRMATION_REQUIRED',
344
- // Fetch is currently in progress
345
- FETCH_IN_PROGRESS: 'FETCH_IN_PROGRESS',
382
+ // Fetch is currently in progress for copy ranges operation
383
+ FETCH_RANGES_IN_PROGRESS: 'FETCH_RANGES_IN_PROGRESS',
384
+ // Fetch is currently in progress for copy header operation
385
+ FETCH_HEADER_IN_PROGRESS: 'FETCH_HEADER_IN_PROGRESS',
346
386
  // There was an error fetching the data
347
387
  FETCH_ERROR: 'FETCH_ERROR',
348
388
  // Click is required to copy
@@ -1 +1 @@
1
- {"version":3,"file":"IrisGridCopyHandler.js","names":["React","Component","classNames","CSSTransition","Button","LoadingSpinner","ThemeExport","GridRange","GridUtils","CanceledPromiseError","copyToClipboard","PromiseUtils","Log","IrisGridUtils","IrisGridBottomBar","jsx","_jsx","jsxs","_jsxs","log","module","IrisGridCopyHandler","getStatusMessageText","copyState","rowCount","COPY_STATES","CONFIRMATION_REQUIRED","concat","toLocaleString","CLICK_REQUIRED","FETCH_ERROR","FETCH_IN_PROGRESS","DONE","getCopyButtonText","buttonState","BUTTON_STATES","CLICK_TO_COPY","RETRY","constructor","props","_defineProperty","handleBackgroundClick","bind","handleCancelClick","handleCopyClick","handleHideTimeout","state","error","undefined","IDLE","COPY","isShown","componentDidMount","copyOperation","startCopy","componentDidUpdate","prevProps","componentWillUnmount","stopCopy","debug2","setState","ranges","debug","startHideTimer","NO_PROMPT_THRESHOLD","startFetch","textData","stopFetch","stopHideTimer","_this","_asyncToGenerator","copyText","showCopyDone","e","text","_this2","_this3","model","includeHeaders","userColumnWidths","movedColumns","formatValues","hiddenColumns","getHiddenColumns","modelRanges","getModelRanges","length","subtractRanges","map","makeColumn","subtractRangesFromRanges","formatValue","value","column","displayString","type","name","fetchPromise","makeCancelable","textSnapshot","cancel","hideTimer","setTimeout","HIDE_TIMEOUT","clearTimeout","render","onEntering","onEntered","onExiting","onExited","animation","copyButtonText","statusMessageText","isButtonContainerVisible","isFetching","isDone","className","onClick","children","in","timeout","transitionMs","mountOnEnter","unmountOnExit","kind","disabled"],"sources":["../src/IrisGridCopyHandler.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { Button, LoadingSpinner, ThemeExport } from '@deephaven/components';\nimport {\n GridRange,\n GridUtils,\n ModelSizeMap,\n MoveOperation,\n} from '@deephaven/grid';\nimport {\n CancelablePromise,\n CanceledPromiseError,\n copyToClipboard,\n PromiseUtils,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport type { Column } from '@deephaven/jsapi-types';\nimport IrisGridUtils from './IrisGridUtils';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './IrisGridCopyHandler.scss';\nimport IrisGridModel from './IrisGridModel';\n\nconst log = Log.module('IrisGridCopyHandler');\n\ntype Values<T> = T[keyof T];\n\ntype ButtonStateType = Values<typeof IrisGridCopyHandler.BUTTON_STATES>;\n\nexport type CopyOperation = {\n ranges: readonly GridRange[];\n includeHeaders: boolean;\n formatValues?: boolean;\n movedColumns: readonly MoveOperation[];\n userColumnWidths: ModelSizeMap;\n error?: string;\n};\n\ninterface IrisGridCopyHandlerProps {\n model: IrisGridModel;\n copyOperation: CopyOperation;\n onEntering: () => void;\n onEntered: () => void;\n onExiting: () => void;\n onExited: () => void;\n}\n\ninterface IrisGridCopyHandlerState {\n error?: string;\n copyState: string;\n buttonState: string;\n isShown: boolean;\n rowCount: number;\n}\n/**\n * Component for handling copying of data from the Iris Grid.\n * - Prompts if necessary (large amount of rows copied)\n * - Tries to async copy, falls back to showing a \"Click to Copy\" button if that fails\n */\nclass IrisGridCopyHandler extends Component<\n IrisGridCopyHandlerProps,\n IrisGridCopyHandlerState\n> {\n static NO_PROMPT_THRESHOLD = 10000;\n\n static HIDE_TIMEOUT = 3000;\n\n /**\n * Different states for the current copy operation\n */\n static COPY_STATES = {\n // No copy operation in progress\n IDLE: 'IDLE',\n\n // Large copy operation, confirmation required\n CONFIRMATION_REQUIRED: 'CONFIRMATION_REQUIRED',\n\n // Fetch is currently in progress\n FETCH_IN_PROGRESS: 'FETCH_IN_PROGRESS',\n\n // There was an error fetching the data\n FETCH_ERROR: 'FETCH_ERROR',\n\n // Click is required to copy\n CLICK_REQUIRED: 'CLICK_REQUIRED',\n\n // The copy operation is completed and successfully copied to the clipboard\n DONE: 'DONE',\n };\n\n static BUTTON_STATES = {\n COPY: 'COPY',\n FETCH_IN_PROGRESS: 'FETCH_IN_PROGRESS',\n CLICK_TO_COPY: 'CLICK_TO_COPY',\n RETRY: 'RETRY',\n };\n\n static defaultProps = {\n copyOperation: null,\n onEntering: (): void => undefined,\n onEntered: (): void => undefined,\n onExiting: (): void => undefined,\n onExited: (): void => undefined,\n };\n\n static getStatusMessageText(copyState: string, rowCount: number): string {\n switch (copyState) {\n case IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED:\n return `Are you sure you want to copy ${rowCount.toLocaleString()} rows to your clipboard?`;\n case IrisGridCopyHandler.COPY_STATES.CLICK_REQUIRED:\n return `Fetched ${rowCount.toLocaleString()} rows!`;\n case IrisGridCopyHandler.COPY_STATES.FETCH_ERROR:\n return 'Unable to copy data.';\n case IrisGridCopyHandler.COPY_STATES.FETCH_IN_PROGRESS:\n return `Fetching ${rowCount.toLocaleString()} rows for clipboard...`;\n case IrisGridCopyHandler.COPY_STATES.DONE:\n return 'Copied to Clipboard!';\n default:\n return '';\n }\n }\n\n static getCopyButtonText(buttonState: ButtonStateType): string {\n switch (buttonState) {\n case IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS:\n return 'Fetching';\n case IrisGridCopyHandler.BUTTON_STATES.CLICK_TO_COPY:\n return 'Click to Copy';\n case IrisGridCopyHandler.BUTTON_STATES.RETRY:\n return 'Retry';\n default:\n return 'Copy';\n }\n }\n\n constructor(props: IrisGridCopyHandlerProps) {\n super(props);\n\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleCancelClick = this.handleCancelClick.bind(this);\n this.handleCopyClick = this.handleCopyClick.bind(this);\n this.handleHideTimeout = this.handleHideTimeout.bind(this);\n\n this.state = {\n error: undefined,\n copyState: IrisGridCopyHandler.COPY_STATES.IDLE,\n buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,\n isShown: false,\n rowCount: 0,\n };\n }\n\n componentDidMount(): void {\n const { copyOperation } = this.props;\n if (copyOperation != null) {\n this.startCopy();\n }\n }\n\n componentDidUpdate(prevProps: IrisGridCopyHandlerProps): void {\n const { copyOperation } = this.props;\n if (prevProps.copyOperation !== copyOperation) {\n this.startCopy();\n }\n }\n\n componentWillUnmount(): void {\n this.stopCopy();\n }\n\n textData?: string;\n\n hideTimer?: ReturnType<typeof setTimeout>;\n\n fetchPromise?: CancelablePromise<string>;\n\n startCopy(): void {\n log.debug2('startCopy');\n\n this.stopCopy();\n\n const { copyOperation } = this.props;\n if (copyOperation == null) {\n log.debug2('No copy operation set, cancelling out');\n this.setState({ isShown: false });\n return;\n }\n\n const { ranges, error } = copyOperation;\n if (error != null) {\n log.debug('Showing copy error', error);\n this.setState({\n isShown: true,\n copyState: IrisGridCopyHandler.COPY_STATES.DONE,\n error,\n });\n this.startHideTimer();\n return;\n }\n\n const rowCount = GridRange.rowCount(ranges);\n\n this.setState({ rowCount, isShown: true, error: undefined });\n\n if (rowCount > IrisGridCopyHandler.NO_PROMPT_THRESHOLD) {\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,\n copyState: IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED,\n });\n } else {\n this.startFetch();\n }\n }\n\n stopCopy(): void {\n this.textData = undefined;\n this.stopFetch();\n this.stopHideTimer();\n }\n\n handleBackgroundClick(): void {\n log.debug2('handleBackgroundClick');\n\n const { copyState } = this.state;\n if (copyState === IrisGridCopyHandler.COPY_STATES.DONE) {\n this.setState({ isShown: false });\n }\n }\n\n handleCancelClick(): void {\n log.debug2('handleCancelClick');\n\n this.stopFetch();\n this.setState({ isShown: false });\n }\n\n async handleCopyClick(): Promise<void> {\n log.debug2('handleCopyClick');\n\n if (this.textData != null) {\n try {\n await this.copyText(this.textData);\n this.showCopyDone();\n } catch (e) {\n log.error('Error copying text', e);\n this.setState({\n error: 'Unable to copy. Verify your browser permissions.',\n });\n }\n } else {\n this.startFetch();\n }\n }\n\n handleHideTimeout(): void {\n log.debug2('handleHideTimeout');\n\n this.stopHideTimer();\n\n this.setState({ isShown: false });\n }\n\n async copyText(text: string): Promise<void> {\n log.debug2('copyText', text);\n\n this.textData = text;\n\n await copyToClipboard(text);\n }\n\n showCopyDone(): void {\n this.setState({ copyState: IrisGridCopyHandler.COPY_STATES.DONE });\n this.startHideTimer();\n }\n\n async startFetch(): Promise<void> {\n this.stopFetch();\n\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,\n copyState: IrisGridCopyHandler.COPY_STATES.FETCH_IN_PROGRESS,\n });\n\n const { model, copyOperation } = this.props;\n const {\n ranges,\n includeHeaders,\n userColumnWidths,\n movedColumns,\n formatValues,\n } = copyOperation;\n log.debug('startFetch', ranges);\n\n const hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);\n let modelRanges = GridUtils.getModelRanges(ranges, movedColumns);\n if (hiddenColumns.length > 0) {\n const subtractRanges = hiddenColumns.map(GridRange.makeColumn);\n modelRanges = GridRange.subtractRangesFromRanges(\n modelRanges,\n subtractRanges\n );\n }\n\n // Remove the hidden columns from the snapshot\n const formatValue =\n formatValues != null && formatValues\n ? (value: unknown, column: Column) =>\n model.displayString(value, column.type, column.name)\n : (value: unknown) => `${value}`;\n\n this.fetchPromise = PromiseUtils.makeCancelable(\n model.textSnapshot(modelRanges, includeHeaders, formatValue)\n );\n try {\n const text = await this.fetchPromise;\n this.fetchPromise = undefined;\n try {\n await this.copyText(text);\n this.showCopyDone();\n } catch (e) {\n log.error('Error copying text', e);\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.CLICK_TO_COPY,\n copyState: IrisGridCopyHandler.COPY_STATES.CLICK_REQUIRED,\n });\n }\n } catch (e) {\n if (e instanceof CanceledPromiseError) {\n log.debug('User cancelled copy.');\n } else {\n log.error('Error fetching contents', e);\n this.fetchPromise = undefined;\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.RETRY,\n copyState: IrisGridCopyHandler.COPY_STATES.FETCH_ERROR,\n });\n }\n }\n }\n\n stopFetch(): void {\n if (this.fetchPromise) {\n log.debug2('stopFetch');\n this.fetchPromise.cancel();\n this.fetchPromise = undefined;\n }\n }\n\n startHideTimer(): void {\n this.stopHideTimer();\n\n this.hideTimer = setTimeout(\n this.handleHideTimeout,\n IrisGridCopyHandler.HIDE_TIMEOUT\n );\n }\n\n stopHideTimer(): void {\n if (this.hideTimer != null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = undefined;\n }\n }\n\n render(): JSX.Element {\n const { onEntering, onEntered, onExiting, onExited } = this.props;\n const { buttonState, copyState, isShown, rowCount, error } = this.state;\n\n const animation =\n copyState === IrisGridCopyHandler.COPY_STATES.DONE\n ? 'fade'\n : 'copy-slide-up';\n const copyButtonText = IrisGridCopyHandler.getCopyButtonText(buttonState);\n const statusMessageText =\n error ?? IrisGridCopyHandler.getStatusMessageText(copyState, rowCount);\n const isButtonContainerVisible =\n copyState !== IrisGridCopyHandler.COPY_STATES.DONE;\n const isFetching =\n buttonState === IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS;\n const isDone = copyState === IrisGridCopyHandler.COPY_STATES.DONE;\n\n return (\n <IrisGridBottomBar\n animation={animation}\n isShown={isShown}\n className={classNames('iris-grid-copy-handler', {\n 'copy-done': isDone,\n })}\n onClick={this.handleBackgroundClick}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={onExited}\n >\n <div className=\"status-message\">\n <span>{statusMessageText}</span>\n </div>\n <CSSTransition\n in={isButtonContainerVisible}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">\n <button\n type=\"button\"\n className=\"btn btn-outline-secondary btn-cancel\"\n onClick={this.handleCancelClick}\n >\n Cancel\n </button>\n <Button\n kind={isFetching ? 'tertiary' : 'primary'}\n className={classNames('btn-copy', {\n 'btn-spinner': isFetching,\n })}\n onClick={this.handleCopyClick}\n disabled={isFetching}\n >\n {isFetching && (\n <LoadingSpinner className=\"loading-spinner-vertical-align\" />\n )}\n {copyButtonText}\n </Button>\n </div>\n </CSSTransition>\n </IrisGridBottomBar>\n );\n }\n}\n\nexport default IrisGridCopyHandler;\n"],"mappings":"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"}
1
+ {"version":3,"file":"IrisGridCopyHandler.js","names":["React","Component","classNames","CSSTransition","Button","LoadingSpinner","ThemeExport","GridRange","GridUtils","CanceledPromiseError","copyToClipboard","PromiseUtils","Log","IrisGridUtils","IrisGridBottomBar","jsx","_jsx","jsxs","_jsxs","log","module","isCopyRangesOperation","copyOperation","ranges","isCopyHeaderOperation","columnIndex","IrisGridCopyHandler","getStatusMessageText","copyState","rowCount","COPY_STATES","CONFIRMATION_REQUIRED","concat","toLocaleString","CLICK_REQUIRED","FETCH_ERROR","FETCH_RANGES_IN_PROGRESS","FETCH_HEADER_IN_PROGRESS","DONE","getCopyButtonText","buttonState","BUTTON_STATES","FETCH_IN_PROGRESS","CLICK_TO_COPY","RETRY","constructor","props","_defineProperty","handleBackgroundClick","bind","handleCancelClick","handleCopyClick","handleHideTimeout","state","error","undefined","IDLE","COPY","isShown","componentDidMount","startCopy","componentDidUpdate","prevProps","componentWillUnmount","stopCopy","debug2","setState","debug","startHideTimer","NO_PROMPT_THRESHOLD","startFetch","textData","stopFetch","stopHideTimer","_this","_asyncToGenerator","copyText","showCopyDone","e","text","_this2","_this3","model","columnDepth","movedColumns","modelIndex","getModelIndex","textForColumnHeader","fetchPromise","makeCancelable","includeHeaders","userColumnWidths","formatValues","hiddenColumns","getHiddenColumns","modelRanges","getModelRanges","length","subtractRanges","map","makeColumn","subtractRangesFromRanges","formatValue","value","column","displayString","type","name","textSnapshot","cancel","hideTimer","setTimeout","HIDE_TIMEOUT","clearTimeout","render","onEntering","onEntered","onExiting","onExited","animation","copyButtonText","statusMessageText","isButtonContainerVisible","isFetching","isDone","className","onClick","children","in","timeout","transitionMs","mountOnEnter","unmountOnExit","kind","disabled"],"sources":["../src/IrisGridCopyHandler.tsx"],"sourcesContent":["import React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { CSSTransition } from 'react-transition-group';\nimport { Button, LoadingSpinner, ThemeExport } from '@deephaven/components';\nimport {\n GridRange,\n GridUtils,\n ModelSizeMap,\n MoveOperation,\n} from '@deephaven/grid';\nimport {\n CancelablePromise,\n CanceledPromiseError,\n copyToClipboard,\n PromiseUtils,\n} from '@deephaven/utils';\nimport Log from '@deephaven/log';\nimport type { Column } from '@deephaven/jsapi-types';\nimport IrisGridUtils from './IrisGridUtils';\nimport IrisGridBottomBar from './IrisGridBottomBar';\nimport './IrisGridCopyHandler.scss';\nimport IrisGridModel from './IrisGridModel';\n\nconst log = Log.module('IrisGridCopyHandler');\n\ntype Values<T> = T[keyof T];\n\ntype ButtonStateType = Values<typeof IrisGridCopyHandler.BUTTON_STATES>;\n\ntype CommonCopyOperation = {\n movedColumns: readonly MoveOperation[];\n error?: string;\n};\n\nexport type CopyRangesOperation = CommonCopyOperation & {\n ranges: readonly GridRange[];\n includeHeaders: boolean;\n formatValues?: boolean;\n userColumnWidths: ModelSizeMap;\n};\n\nexport type CopyHeaderOperation = CommonCopyOperation & {\n columnIndex: number;\n columnDepth: number;\n};\n\nexport type CopyOperation = CopyRangesOperation | CopyHeaderOperation;\n\nfunction isCopyRangesOperation(\n copyOperation: CopyOperation\n): copyOperation is CopyRangesOperation {\n return (copyOperation as CopyRangesOperation).ranges != null;\n}\n\nfunction isCopyHeaderOperation(\n copyOperation: CopyOperation\n): copyOperation is CopyHeaderOperation {\n return (copyOperation as CopyHeaderOperation).columnIndex != null;\n}\n\ninterface IrisGridCopyHandlerProps {\n model: IrisGridModel;\n copyOperation: CopyOperation;\n onEntering: () => void;\n onEntered: () => void;\n onExiting: () => void;\n onExited: () => void;\n}\n\ninterface IrisGridCopyHandlerState {\n error?: string;\n copyState: string;\n buttonState: string;\n isShown: boolean;\n rowCount: number;\n}\n/**\n * Component for handling copying of data from the Iris Grid.\n * - Prompts if necessary (large amount of rows copied)\n * - Tries to async copy, falls back to showing a \"Click to Copy\" button if that fails\n */\nclass IrisGridCopyHandler extends Component<\n IrisGridCopyHandlerProps,\n IrisGridCopyHandlerState\n> {\n static NO_PROMPT_THRESHOLD = 10000;\n\n static HIDE_TIMEOUT = 3000;\n\n /**\n * Different states for the current copy operation\n */\n static COPY_STATES = {\n // No copy operation in progress\n IDLE: 'IDLE',\n\n // Large copy operation, confirmation required\n CONFIRMATION_REQUIRED: 'CONFIRMATION_REQUIRED',\n\n // Fetch is currently in progress for copy ranges operation\n FETCH_RANGES_IN_PROGRESS: 'FETCH_RANGES_IN_PROGRESS',\n\n // Fetch is currently in progress for copy header operation\n FETCH_HEADER_IN_PROGRESS: 'FETCH_HEADER_IN_PROGRESS',\n\n // There was an error fetching the data\n FETCH_ERROR: 'FETCH_ERROR',\n\n // Click is required to copy\n CLICK_REQUIRED: 'CLICK_REQUIRED',\n\n // The copy operation is completed and successfully copied to the clipboard\n DONE: 'DONE',\n };\n\n static BUTTON_STATES = {\n COPY: 'COPY',\n FETCH_IN_PROGRESS: 'FETCH_IN_PROGRESS',\n CLICK_TO_COPY: 'CLICK_TO_COPY',\n RETRY: 'RETRY',\n };\n\n static defaultProps = {\n copyOperation: null,\n onEntering: (): void => undefined,\n onEntered: (): void => undefined,\n onExiting: (): void => undefined,\n onExited: (): void => undefined,\n };\n\n static getStatusMessageText(copyState: string, rowCount: number): string {\n switch (copyState) {\n case IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED:\n return `Are you sure you want to copy ${rowCount.toLocaleString()} rows to your clipboard?`;\n case IrisGridCopyHandler.COPY_STATES.CLICK_REQUIRED:\n return `Fetched ${rowCount.toLocaleString()} rows!`;\n case IrisGridCopyHandler.COPY_STATES.FETCH_ERROR:\n return 'Unable to copy data.';\n case IrisGridCopyHandler.COPY_STATES.FETCH_RANGES_IN_PROGRESS:\n return `Fetching ${rowCount.toLocaleString()} rows for clipboard...`;\n case IrisGridCopyHandler.COPY_STATES.FETCH_HEADER_IN_PROGRESS:\n return 'Fetching header for clipboard...';\n case IrisGridCopyHandler.COPY_STATES.DONE:\n return 'Copied to Clipboard!';\n default:\n return '';\n }\n }\n\n static getCopyButtonText(buttonState: ButtonStateType): string {\n switch (buttonState) {\n case IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS:\n return 'Fetching';\n case IrisGridCopyHandler.BUTTON_STATES.CLICK_TO_COPY:\n return 'Click to Copy';\n case IrisGridCopyHandler.BUTTON_STATES.RETRY:\n return 'Retry';\n default:\n return 'Copy';\n }\n }\n\n constructor(props: IrisGridCopyHandlerProps) {\n super(props);\n\n this.handleBackgroundClick = this.handleBackgroundClick.bind(this);\n this.handleCancelClick = this.handleCancelClick.bind(this);\n this.handleCopyClick = this.handleCopyClick.bind(this);\n this.handleHideTimeout = this.handleHideTimeout.bind(this);\n\n this.state = {\n error: undefined,\n copyState: IrisGridCopyHandler.COPY_STATES.IDLE,\n buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,\n isShown: false,\n rowCount: 0,\n };\n }\n\n componentDidMount(): void {\n const { copyOperation } = this.props;\n if (copyOperation != null) {\n this.startCopy();\n }\n }\n\n componentDidUpdate(prevProps: IrisGridCopyHandlerProps): void {\n const { copyOperation } = this.props;\n if (prevProps.copyOperation !== copyOperation) {\n this.startCopy();\n }\n }\n\n componentWillUnmount(): void {\n this.stopCopy();\n }\n\n textData?: string;\n\n hideTimer?: ReturnType<typeof setTimeout>;\n\n fetchPromise?: CancelablePromise<string>;\n\n startCopy(): void {\n log.debug2('startCopy');\n\n this.stopCopy();\n\n const { copyOperation } = this.props;\n if (copyOperation == null) {\n log.debug2('No copy operation set, cancelling out');\n this.setState({ isShown: false });\n return;\n }\n\n const { error } = copyOperation;\n if (error != null) {\n log.debug('Showing copy error', error);\n this.setState({\n isShown: true,\n copyState: IrisGridCopyHandler.COPY_STATES.DONE,\n error,\n });\n this.startHideTimer();\n return;\n }\n\n this.setState({ isShown: true, error: undefined });\n\n if (isCopyRangesOperation(copyOperation)) {\n const { ranges } = copyOperation;\n const rowCount = GridRange.rowCount(ranges);\n this.setState({ rowCount });\n\n if (rowCount > IrisGridCopyHandler.NO_PROMPT_THRESHOLD) {\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.COPY,\n copyState: IrisGridCopyHandler.COPY_STATES.CONFIRMATION_REQUIRED,\n });\n return;\n }\n }\n\n this.startFetch();\n }\n\n stopCopy(): void {\n this.textData = undefined;\n this.stopFetch();\n this.stopHideTimer();\n }\n\n handleBackgroundClick(): void {\n log.debug2('handleBackgroundClick');\n\n const { copyState } = this.state;\n if (copyState === IrisGridCopyHandler.COPY_STATES.DONE) {\n this.setState({ isShown: false });\n }\n }\n\n handleCancelClick(): void {\n log.debug2('handleCancelClick');\n\n this.stopFetch();\n this.setState({ isShown: false });\n }\n\n async handleCopyClick(): Promise<void> {\n log.debug2('handleCopyClick');\n\n if (this.textData != null) {\n try {\n await this.copyText(this.textData);\n this.showCopyDone();\n } catch (e) {\n log.error('Error copying text', e);\n this.setState({\n error: 'Unable to copy. Verify your browser permissions.',\n });\n }\n } else {\n this.startFetch();\n }\n }\n\n handleHideTimeout(): void {\n log.debug2('handleHideTimeout');\n\n this.stopHideTimer();\n\n this.setState({ isShown: false });\n }\n\n async copyText(text: string): Promise<void> {\n log.debug2('copyText', text);\n\n this.textData = text;\n\n await copyToClipboard(text);\n }\n\n showCopyDone(): void {\n this.setState({ copyState: IrisGridCopyHandler.COPY_STATES.DONE });\n this.startHideTimer();\n }\n\n async startFetch(): Promise<void> {\n this.stopFetch();\n\n const { model, copyOperation } = this.props;\n\n if (isCopyHeaderOperation(copyOperation)) {\n const { columnIndex, columnDepth, movedColumns } = copyOperation;\n log.debug('startFetch copyHeader', columnIndex, columnDepth);\n\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,\n copyState: IrisGridCopyHandler.COPY_STATES.FETCH_HEADER_IN_PROGRESS,\n });\n\n const modelIndex = GridUtils.getModelIndex(columnIndex, movedColumns);\n const copyText = model.textForColumnHeader(modelIndex, columnDepth);\n if (copyText === undefined) {\n this.fetchPromise = undefined;\n this.setState({\n error: 'Invalid column header selected.',\n copyState: IrisGridCopyHandler.COPY_STATES.DONE,\n });\n return;\n }\n this.fetchPromise = PromiseUtils.makeCancelable(copyText);\n } else {\n const {\n ranges,\n includeHeaders,\n userColumnWidths,\n movedColumns,\n formatValues,\n } = copyOperation;\n log.debug('startFetch copyRanges', ranges);\n\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS,\n copyState: IrisGridCopyHandler.COPY_STATES.FETCH_RANGES_IN_PROGRESS,\n });\n\n const hiddenColumns = IrisGridUtils.getHiddenColumns(userColumnWidths);\n let modelRanges = GridUtils.getModelRanges(ranges, movedColumns);\n if (hiddenColumns.length > 0) {\n const subtractRanges = hiddenColumns.map(GridRange.makeColumn);\n modelRanges = GridRange.subtractRangesFromRanges(\n modelRanges,\n subtractRanges\n );\n }\n\n // Remove the hidden columns from the snapshot\n const formatValue =\n formatValues != null && formatValues\n ? (value: unknown, column: Column) =>\n model.displayString(value, column.type, column.name)\n : (value: unknown) => `${value}`;\n\n this.fetchPromise = PromiseUtils.makeCancelable(\n model.textSnapshot(modelRanges, includeHeaders, formatValue)\n );\n }\n\n try {\n const text = await this.fetchPromise;\n this.fetchPromise = undefined;\n try {\n await this.copyText(text);\n this.showCopyDone();\n } catch (e) {\n log.error('Error copying text', e);\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.CLICK_TO_COPY,\n copyState: IrisGridCopyHandler.COPY_STATES.CLICK_REQUIRED,\n });\n }\n } catch (e) {\n if (e instanceof CanceledPromiseError) {\n log.debug('User cancelled copy.');\n } else {\n log.error('Error fetching contents', e);\n this.fetchPromise = undefined;\n this.setState({\n buttonState: IrisGridCopyHandler.BUTTON_STATES.RETRY,\n copyState: IrisGridCopyHandler.COPY_STATES.FETCH_ERROR,\n });\n }\n }\n }\n\n stopFetch(): void {\n if (this.fetchPromise) {\n log.debug2('stopFetch');\n this.fetchPromise.cancel();\n this.fetchPromise = undefined;\n }\n }\n\n startHideTimer(): void {\n this.stopHideTimer();\n\n this.hideTimer = setTimeout(\n this.handleHideTimeout,\n IrisGridCopyHandler.HIDE_TIMEOUT\n );\n }\n\n stopHideTimer(): void {\n if (this.hideTimer != null) {\n clearTimeout(this.hideTimer);\n this.hideTimer = undefined;\n }\n }\n\n render(): JSX.Element {\n const { onEntering, onEntered, onExiting, onExited } = this.props;\n const { buttonState, copyState, isShown, rowCount, error } = this.state;\n\n const animation =\n copyState === IrisGridCopyHandler.COPY_STATES.DONE\n ? 'fade'\n : 'copy-slide-up';\n const copyButtonText = IrisGridCopyHandler.getCopyButtonText(buttonState);\n const statusMessageText =\n error ?? IrisGridCopyHandler.getStatusMessageText(copyState, rowCount);\n const isButtonContainerVisible =\n copyState !== IrisGridCopyHandler.COPY_STATES.DONE;\n const isFetching =\n buttonState === IrisGridCopyHandler.BUTTON_STATES.FETCH_IN_PROGRESS;\n const isDone = copyState === IrisGridCopyHandler.COPY_STATES.DONE;\n\n return (\n <IrisGridBottomBar\n animation={animation}\n isShown={isShown}\n className={classNames('iris-grid-copy-handler', {\n 'copy-done': isDone,\n })}\n onClick={this.handleBackgroundClick}\n onEntering={onEntering}\n onEntered={onEntered}\n onExiting={onExiting}\n onExited={onExited}\n >\n <div className=\"status-message\">\n <span>{statusMessageText}</span>\n </div>\n <CSSTransition\n in={isButtonContainerVisible}\n timeout={ThemeExport.transitionMs}\n classNames=\"fade\"\n mountOnEnter\n unmountOnExit\n >\n <div className=\"buttons-container\">\n <button\n type=\"button\"\n className=\"btn btn-outline-secondary btn-cancel\"\n onClick={this.handleCancelClick}\n >\n Cancel\n </button>\n <Button\n kind={isFetching ? 'tertiary' : 'primary'}\n className={classNames('btn-copy', {\n 'btn-spinner': isFetching,\n })}\n onClick={this.handleCopyClick}\n disabled={isFetching}\n >\n {isFetching && (\n <LoadingSpinner className=\"loading-spinner-vertical-align\" />\n )}\n {copyButtonText}\n </Button>\n </div>\n </CSSTransition>\n </IrisGridBottomBar>\n );\n }\n}\n\nexport default IrisGridCopyHandler;\n"],"mappings":"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"}