@splunk/dynamic-editors 0.36.1 → 0.37.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.
@@ -42,7 +42,7 @@
42
42
  `,P={marginBottom:10},U={width:"100%"},w=m().span`
43
43
  font-size: smaller;
44
44
  font-style: italic;
45
- `,E=(0,g._)("Note: Uploaded image files can be accessed and deleted by others in your organization"),D=(0,k.memoize)(((e,t)=>{const n=e.slice();if(t)-1===n.indexOf("svg")&&n.push("svg");else{const e=n.indexOf("svg");e>-1&&n.splice(e,1)}return n}),((e,t)=>`${t}-${e.join("-")}`));class O extends e.Component{constructor(e){super(e),d()(this,"violationHandler",(e=>{e.blockedURI!==this.state.urlValue&&e.blockedURI!==`${this.state.urlValue}/`||"enforce"!==e.disposition?e.blockedURI!==this.state.urlValue&&e.blockedURI!==`${this.state.urlValue}/`||"report"!==e.disposition||this.setState({violationType:"warning"}):this.setState({violationType:"error"})})),d()(this,"checkImage",(e=>{if(!e)return;const t=new Image;t.onload=()=>{this.props.handleImageUpload({src:e})},t.onerror=()=>{this.setState((e=>e.urlValue?{validUrl:!1}:void 0))},t.src=e})),d()(this,"handleURLChange",((e,{value:t})=>{this.setState({urlValue:t,validUrl:!0,violationType:"none"})})),d()(this,"handleTextKeyDown",(e=>{"Enter"===e.key&&(e.preventDefault(),this.checkImage(this.state.urlValue))})),d()(this,"handleBlur",(e=>{var t;null!==(t=this.inputRef.current)&&void 0!==t&&t.contains(e.relatedTarget)||this.checkImage(this.state.urlValue)})),d()(this,"trackInputRef",(e=>{this.inputRef.current=e,e&&e.addEventListener("focusout",this.handleBlur)})),d()(this,"handleOnImageChange",(({filename:e,imageDataURI:t})=>{e&&t?this.props.handleImageUpload({filename:e,imageDataURI:t}):this.props.handleImageUpload({filename:null,imageDataURI:null})})),this.state={urlValue:"",validUrl:!0,violationType:"none"},this.inputRef=t().createRef()}componentDidMount(){document.addEventListener("securitypolicyviolation",this.violationHandler)}componentWillUnmount(){document.removeEventListener("securitypolicyviolation",this.violationHandler),this.inputRef.current&&this.inputRef.current.removeEventListener("focusout",this.handleBlur)}render(){const{enableImageFileUpload:e,enableSVGImageUpload:n,enableSvgHttpDownloader:a,enableGallerySharingWarning:o}=this.context||{},i=D(this.props.validImageTypes,n),r=i.indexOf("svg")<0||this.props.svgRenderAsDom&&i.indexOf("svg")>-1&&a||!this.props.svgRenderAsDom&&i.indexOf("svg")>-1,l="none"!==this.state.violationType?t().createElement(I.CSPMessage,{type:this.state.violationType}):t().createElement(v(),{appearance:"fill",type:"error"},(0,g._)("We can't find an image with this URL. Please enter a new URL."));return t().createElement(_,null,r&&t().createElement(b(),{canClear:!0,value:this.state.urlValue,onChange:this.handleURLChange,onKeyDown:this.handleTextKeyDown,style:P,elementRef:this.trackInputRef}),this.state.validUrl?e&&t().createElement(t().Fragment,null,t().createElement(x(),{style:U,defaultFilename:null,defaultImageDataURI:null,onImageChange:this.handleOnImageChange,allowExtensions:i}),o&&t().createElement(w,{"data-test":"gallery-sharing-warning"},E)):l)}}d()(O,"contextType",R()),O.propTypes={handleImageUpload:i().func,validImageTypes:i().array,svgRenderAsDom:i().bool},O.defaultProps={handleImageUpload:()=>{},validImageTypes:["gif","jpeg","jpg","png","webp"],svgRenderAsDom:!1};const S=O;var M=n(8855),j=n.n(M),T=n(7020),q=n.n(T),L=n(3563),A=n(5135),$=n(137);const V=t().createElement(j(),{"aria-label":(0,g._)("Remove image")}),B=m().div`
45
+ `,E=(0,g._)("Note: Uploaded image files can be accessed and deleted by others in your organization"),D=(0,k.memoize)(((e,t)=>{const n=e.slice();if(t)-1===n.indexOf("svg")&&n.push("svg");else{const e=n.indexOf("svg");e>-1&&n.splice(e,1)}return n}),((e,t)=>`${t}-${e.join("-")}`));class O extends e.Component{constructor(e){super(e),d()(this,"violationHandler",(e=>{e.blockedURI!==this.state.urlValue&&e.blockedURI!==`${this.state.urlValue}/`||"enforce"!==e.disposition?e.blockedURI!==this.state.urlValue&&e.blockedURI!==`${this.state.urlValue}/`||"report"!==e.disposition||this.setState({violationType:"warning"}):this.setState({violationType:"error"})})),d()(this,"checkImage",(e=>{if(!e)return;const t=new Image;t.onload=()=>{this.props.handleImageUpload({src:e})},t.onerror=()=>{this.setState((e=>e.urlValue?{validUrl:!1}:void 0))},t.src=e})),d()(this,"handleURLChange",((e,{value:t})=>{this.setState({urlValue:t,validUrl:!0,violationType:"none"})})),d()(this,"handleTextKeyDown",(e=>{"Enter"===e.key&&(e.preventDefault(),this.checkImage(this.state.urlValue))})),d()(this,"handleBlur",(e=>{var t;null!==(t=this.inputRef.current)&&void 0!==t&&t.contains(e.relatedTarget)||this.checkImage(this.state.urlValue)})),d()(this,"trackInputRef",(e=>{this.inputRef.current=e,e&&e.addEventListener("focusout",this.handleBlur)})),d()(this,"handleOnImageChange",(({filename:e,imageDataURI:t})=>{e&&t?this.props.handleImageUpload({filename:e,imageDataURI:t}):this.props.handleImageUpload({filename:null,imageDataURI:null})})),this.state={urlValue:"",validUrl:!0,violationType:"none"},this.inputRef=t().createRef()}componentDidMount(){document.addEventListener("securitypolicyviolation",this.violationHandler)}componentWillUnmount(){document.removeEventListener("securitypolicyviolation",this.violationHandler),this.inputRef.current&&this.inputRef.current.removeEventListener("focusout",this.handleBlur)}render(){const{enableImageFileUpload:e,enableSVGImageUpload:n,enableSvgHttpDownloader:a,enableGallerySharingWarning:o}=this.context||{},i=D(this.props.validImageTypes,n),r=i.indexOf("svg")<0||this.props.svgRenderAsDom&&i.indexOf("svg")>-1&&a||!this.props.svgRenderAsDom&&i.indexOf("svg")>-1,l="none"!==this.state.violationType?t().createElement(I.CSPMessage,{type:this.state.violationType}):t().createElement(v(),{appearance:"fill",type:"error"},(0,g._)("We can't find an image with this URL. Please enter a new URL."));return t().createElement(_,null,r&&t().createElement(b(),{canClear:!0,value:this.state.urlValue,onChange:this.handleURLChange,onKeyDown:this.handleTextKeyDown,style:P,elementRef:this.trackInputRef}),this.state.validUrl?e&&t().createElement(t().Fragment,null,t().createElement(x(),{style:U,defaultFilename:null,defaultImageDataURI:null,onImageChange:this.handleOnImageChange,allowExtensions:i}),o&&t().createElement(w,{"data-test":"gallery-sharing-warning"},E)):l)}}d()(O,"contextType",R()),O.propTypes={handleImageUpload:i().func,validImageTypes:i().array,svgRenderAsDom:i().bool},O.defaultProps={handleImageUpload:()=>{},validImageTypes:["gif","jpeg","jpg","png","webp"],svgRenderAsDom:!1};const S=O;var M=n(8855),j=n.n(M),T=n(7020),q=n.n(T),L=n(3563),A=n(5135),$=n(137);const V=t().createElement(j(),null),B=m().div`
46
46
  width: 100%;
47
47
  padding-bottom: 5px;
48
48
  `,W=m().div`
@@ -77,5 +77,5 @@
77
77
  margin: 0 auto;
78
78
  max-width: 100%;
79
79
  max-height: 180px;
80
- `,K=({filename:e,imageDataURI:n,onImageRemove:a,overrideCSPViolation:o})=>{const i=(0,A.useCSPViolationObserver)(n,o);return t().createElement(B,null,t().createElement(W,null,t().createElement(z,null,t().createElement(H,null,e),t().createElement(F,{appearance:"subtle",icon:V,onClick:a})),t().createElement(G,{alt:e,src:n})),"none"!==i&&t().createElement($.MessageContainer,null,t().createElement(I.CSPMessage,{type:i})))};K.propTypes={filename:i().string,imageDataURI:i().string,onImageRemove:i().func,overrideCSPViolation:i().string},K.defaultProps={onImageRemove:()=>{},filename:null,imageDataURI:null};const N=K,J=({onChange:n,name:a,value:o,labelPosition:i,labelWidth:r,label:s,validMediaTypes:c,svgRenderAsDom:d,overrideCSPViolation:p})=>{const m=(0,e.useContext)(l()),[g,f]=(0,e.useState)(null),[v,h]=(0,e.useState)(null),b=(0,e.useCallback)((async(e,t)=>{try{const o=await m.upload(t,{name:e},null,c);n(null,a,o)}catch(e){console.warn(e)}}),[m,c,n,a]),y=(0,e.useCallback)((({src:e,filename:t,imageDataURI:o})=>e?n(null,a,e):null!==t&&null!==o?b(t,o):n(null,a,null)),[b,n,a]),x=(0,e.useCallback)((e=>n(e,a,null)),[n,a]);return(0,e.useEffect)((()=>{(async()=>{if(o){const e=await(async(e,t)=>null!=e&&e.isResourceURL(t)?e.getByURL(t):{dataURI:t,metaData:{name:t}})(m,o);f(e.dataURI),h(e.metaData.name)}})()}),[o,m]),t().createElement(u(),{label:s,labelPosition:i,labelWidth:r},o?t().createElement(N,{filename:v,imageDataURI:g,onImageRemove:x,overrideCSPViolation:p}):t().createElement(S,{svgRenderAsDom:d,validImageTypes:c,handleImageUpload:y}))};J.propTypes={onChange:i().func.isRequired,name:i().string.isRequired,label:i().string.isRequired,value:i().string,labelPosition:i().oneOf(["top","left"]),labelWidth:i().number,validMediaTypes:i().array,svgRenderAsDom:i().bool,overrideCSPViolation:i().string},J.defaultProps={labelPosition:"top"};const Q=J})(),module.exports=a})();
80
+ `,K=({filename:e,imageDataURI:n,onImageRemove:a,overrideCSPViolation:o})=>{const i=(0,A.useCSPViolationObserver)(n,o);return t().createElement(B,null,t().createElement(W,null,t().createElement(z,null,t().createElement(H,null,e),t().createElement(F,{"aria-label":(0,g._)("Remove image"),appearance:"subtle",icon:V,onClick:a})),t().createElement(G,{alt:e,src:n})),"none"!==i&&t().createElement($.MessageContainer,null,t().createElement(I.CSPMessage,{type:i})))};K.propTypes={filename:i().string,imageDataURI:i().string,onImageRemove:i().func,overrideCSPViolation:i().string},K.defaultProps={onImageRemove:()=>{},filename:null,imageDataURI:null};const N=K,J=({onChange:n,name:a,value:o,labelPosition:i,labelWidth:r,label:s,validMediaTypes:c,svgRenderAsDom:d,overrideCSPViolation:p})=>{const m=(0,e.useContext)(l()),[g,f]=(0,e.useState)(null),[v,h]=(0,e.useState)(null),b=(0,e.useCallback)((async(e,t)=>{try{const o=await m.upload(t,{name:e},null,c);n(null,a,o)}catch(e){console.warn(e)}}),[m,c,n,a]),y=(0,e.useCallback)((({src:e,filename:t,imageDataURI:o})=>e?n(null,a,e):null!==t&&null!==o?b(t,o):n(null,a,null)),[b,n,a]),x=(0,e.useCallback)((e=>n(e,a,null)),[n,a]);return(0,e.useEffect)((()=>{(async()=>{if(o){const e=await(async(e,t)=>null!=e&&e.isResourceURL(t)?e.getByURL(t):{dataURI:t,metaData:{name:t}})(m,o);f(e.dataURI),h(e.metaData.name)}})()}),[o,m]),t().createElement(u(),{label:s,labelPosition:i,labelWidth:r},o?t().createElement(N,{filename:v,imageDataURI:g,onImageRemove:x,overrideCSPViolation:p}):t().createElement(S,{svgRenderAsDom:d,validImageTypes:c,handleImageUpload:y}))};J.propTypes={onChange:i().func.isRequired,name:i().string.isRequired,label:i().string.isRequired,value:i().string,labelPosition:i().oneOf(["top","left"]),labelWidth:i().number,validMediaTypes:i().array,svgRenderAsDom:i().bool,overrideCSPViolation:i().string},J.defaultProps={labelPosition:"top"};const Q=J})(),module.exports=a})();
81
81
  //# sourceMappingURL=ImageEditor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/./src/hooks/useCSPViolationObserver.tsx","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/CSPMessage.tsx","webpack://@splunk/dynamic-editors/./src/shared/MessageContainer.tsx","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/Cross\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Link\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Message\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Text\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/FeatureFlagContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/MessageContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/ImageContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Image\"","webpack://@splunk/dynamic-editors/./src/components/UploadImageEditor.jsx","webpack://@splunk/dynamic-editors/./src/components/ImageThumbnail.jsx","webpack://@splunk/dynamic-editors/./src/editors/ImageEditor.jsx"],"sourcesContent":["import { useState, useEffect } from 'react';\n\ntype ViolationType = 'error' | 'warning' | 'none';\n\nconst useCSPViolationObserver = (src: string, defaultValue: ViolationType = 'none'): ViolationType => {\n const [violation, setViolation] = useState<ViolationType>(defaultValue);\n useEffect(() => {\n const violationHandler = e => {\n if ((e.blockedURI === src || e.blockedURI === `${src}/`) && e.disposition === 'enforce') {\n // the second src condition is required as Chrome rewrites\n // URLs without query parameters (e.g. foo.com -> foo.com/ )\n setViolation('error');\n } else if ((e.blockedURI === src || e.blockedURI === `${src}/`) && e.disposition === 'report') {\n setViolation('warning');\n }\n };\n document.addEventListener('securitypolicyviolation', violationHandler);\n setViolation(defaultValue);\n return () => {\n document.removeEventListener('securitypolicyviolation', violationHandler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src]);\n return violation;\n};\n\nexport { useCSPViolationObserver };\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/react-ui/Message';\nimport Link from '@splunk/react-ui/Link';\nimport MessageContext from '@splunk/visualization-context/MessageContext';\n\nexport type CSPMessageProps = { type: 'warning' | 'error' };\n\nexport const CSPMessage = ({ type }: CSPMessageProps) => {\n const { cspMessageLink } = React.useContext(MessageContext) as Record<string, string>; // NOSONAR\n return (\n <Message appearance=\"fill\" type={type} data-test={`csp-message-${type}`}>\n {_(\n 'External image URLs must now have their domains listed in the Dashboards Trusted Domains List by working with your administrator. Alternatively, you can upload the image directly into the dashboard. '\n )}\n {cspMessageLink && (\n <Link to={cspMessageLink} openInNewContext>\n {_('Learn more')}\n </Link>\n )}\n </Message>\n );\n};\n","import styled from 'styled-components';\n\nexport const MessageContainer = styled.div`\n margin-top: 10px;\n`;\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@splunk/react-icons/Cross\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/Link\");","module.exports = require(\"@splunk/react-ui/Message\");","module.exports = require(\"@splunk/react-ui/Text\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"@splunk/visualization-context/FeatureFlagContext\");","module.exports = require(\"@splunk/visualization-context/MessageContext\");","module.exports = require(\"lodash\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualization-context/ImageContext\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/react-ui/Image\");","import React, { Component } from 'react';\nimport T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/react-ui/Message';\nimport Text from '@splunk/react-ui/Text';\nimport ImageFileReader from '@splunk/react-ui/Image';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { memoize } from 'lodash';\nimport { CSPMessage } from '../shared/CSPMessage';\n\nconst EditorContainer = styled.div`\n padding-bottom: 5px;\n width: 100%;\n text-align: center;\n`;\n\nconst textStyle = { marginBottom: 10 };\nconst imageFileReaderStyle = { width: '100%' };\nconst SharingWarning = styled.span`\n font-size: smaller;\n font-style: italic;\n`;\n\nexport const warningText = _(\n 'Note: Uploaded image files can be accessed and deleted by others in your organization'\n);\n\nexport const calculateAllowedImageFileTypes = memoize(\n (mediaTypes, enableSVGImageUpload) => {\n const allowedImageFileTypes = mediaTypes.slice();\n if (enableSVGImageUpload) {\n if (allowedImageFileTypes.indexOf('svg') === -1) {\n allowedImageFileTypes.push('svg');\n }\n } else {\n // if enableSVGImageUpload is set to false, then remove the svg upload capability\n const index = allowedImageFileTypes.indexOf('svg');\n if (index > -1) {\n allowedImageFileTypes.splice(index, 1);\n }\n }\n return allowedImageFileTypes;\n },\n (mediaTypes, enableSVGImageUpload) => `${enableSVGImageUpload}-${mediaTypes.join('-')}`\n);\n\nclass UploadImageEditor extends Component {\n static contextType = FeatureFlagContext;\n\n constructor(props) {\n super(props);\n this.state = {\n urlValue: '',\n validUrl: true,\n violationType: 'none',\n };\n\n // Reference to rendered SUI input clear button\n this.inputRef = React.createRef();\n }\n\n componentDidMount() {\n document.addEventListener('securitypolicyviolation', this.violationHandler);\n }\n\n componentWillUnmount() {\n document.removeEventListener('securitypolicyviolation', this.violationHandler);\n\n if (this.inputRef.current) {\n this.inputRef.current.removeEventListener('focusout', this.handleBlur);\n }\n }\n\n violationHandler = e => {\n if (\n (e.blockedURI === this.state.urlValue || e.blockedURI === `${this.state.urlValue}/`) &&\n e.disposition === 'enforce'\n ) {\n this.setState({\n violationType: 'error',\n });\n } else if (\n (e.blockedURI === this.state.urlValue || e.blockedURI === `${this.state.urlValue}/`) &&\n e.disposition === 'report'\n ) {\n this.setState({\n violationType: 'warning',\n });\n }\n };\n\n /**\n * Executes and passes the url to the callback function, handleImageUpload(), if the image url is valid, else sets the boolean validURL to false\n * @method checkImage\n * @param {String} src\n */\n checkImage = src => {\n if (!src) {\n return;\n }\n const img = new Image();\n img.onload = () => {\n this.props.handleImageUpload({ src });\n };\n img.onerror = () => {\n // Only set validUrl=false when there's a URL value in state\n this.setState(state => (!state.urlValue ? undefined : { validUrl: false }));\n };\n img.src = src;\n };\n\n /**\n * Callback to update text box value (url) on change\n * @method handleURLChange\n * @param {String} value\n * @param {Object} e\n */\n handleURLChange = (e, { value }) => {\n this.setState({\n urlValue: value,\n validUrl: true,\n violationType: 'none',\n });\n };\n\n /**\n * Checks if text key down is 'enter' and calls checkImage() accordingly\n * @method handleTextKeyDown\n * @param {Object} e\n */\n handleTextKeyDown = e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.checkImage(this.state.urlValue);\n }\n };\n\n handleBlur = event => {\n // If the element taking focus from the input is in the input tree\n // then it's probably the clear button\n if (this.inputRef.current?.contains(event.relatedTarget)) {\n return;\n }\n\n this.checkImage(this.state.urlValue);\n };\n\n // Custom ref/event listener for the Text input because SUI uses a blur event\n // which doesn't bubble. By using focusout the event will bubble and the clear\n // button can prevent checking for an image while it has focus but doesn't\n // block the check if a user tabs through the button\n trackInputRef = element => {\n this.inputRef.current = element;\n if (element) {\n element.addEventListener('focusout', this.handleBlur);\n }\n };\n\n /**\n * Executes and passes the filename+dataURI to the callback function, handleImageUpload()\n * @method handleOnImageChange\n * @param {Object} {filename, dataURI}\n */\n handleOnImageChange = ({ filename, imageDataURI }) => {\n if (filename && imageDataURI) {\n this.props.handleImageUpload({ filename, imageDataURI });\n } else {\n this.props.handleImageUpload({ filename: null, imageDataURI: null });\n }\n };\n\n render() {\n const {\n enableImageFileUpload,\n enableSVGImageUpload,\n enableSvgHttpDownloader,\n enableGallerySharingWarning,\n } = this.context || {};\n const allowedImageFileTypes = calculateAllowedImageFileTypes(\n this.props.validImageTypes,\n enableSVGImageUpload\n );\n\n // 1. allowedImageFileTypes does not have svg, show URL Input Field\n // 2. allowedImageFileTypes has svg and svg is rendered as dom (ChoroplethSvg), then if feature flag enableSvgHttpDownloader is true, show URL Input Field\n // 3. allowedImageFileTypes has svg and svg is not rendered as dom but with <img> (Image Viz), show URL Input Field\n\n const shouldShowURLField =\n allowedImageFileTypes.indexOf('svg') < 0 ||\n (this.props.svgRenderAsDom &&\n allowedImageFileTypes.indexOf('svg') > -1 &&\n enableSvgHttpDownloader) ||\n (!this.props.svgRenderAsDom && allowedImageFileTypes.indexOf('svg') > -1);\n\n const errorMessage =\n this.state.violationType !== 'none' ? (\n <CSPMessage type={this.state.violationType} />\n ) : (\n <Message appearance=\"fill\" type=\"error\">\n {_(\"We can't find an image with this URL. Please enter a new URL.\")}\n </Message>\n );\n return (\n <EditorContainer>\n {shouldShowURLField && (\n <Text\n canClear\n value={this.state.urlValue}\n onChange={this.handleURLChange}\n onKeyDown={this.handleTextKeyDown}\n style={textStyle}\n elementRef={this.trackInputRef}\n />\n )}\n {this.state.validUrl\n ? enableImageFileUpload && (\n <React.Fragment>\n <ImageFileReader\n style={imageFileReaderStyle}\n defaultFilename={null}\n defaultImageDataURI={null}\n onImageChange={this.handleOnImageChange}\n allowExtensions={allowedImageFileTypes}\n />\n {enableGallerySharingWarning && (\n <SharingWarning data-test=\"gallery-sharing-warning\">\n {warningText}\n </SharingWarning>\n )}\n </React.Fragment>\n )\n : errorMessage}\n </EditorContainer>\n );\n }\n}\n\nUploadImageEditor.propTypes = {\n handleImageUpload: T.func,\n validImageTypes: T.array,\n svgRenderAsDom: T.bool,\n};\n\nUploadImageEditor.defaultProps = {\n handleImageUpload: () => {},\n validImageTypes: ['gif', 'jpeg', 'jpg', 'png', 'webp'],\n svgRenderAsDom: false,\n};\n\nexport default UploadImageEditor;\n","import React from 'react';\nimport styled from 'styled-components';\nimport T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Cross from '@splunk/react-icons/Cross';\nimport Button from '@splunk/react-ui/Button';\nimport { variables, mixins } from '@splunk/themes';\nimport { useCSPViolationObserver } from '../hooks/useCSPViolationObserver';\nimport { CSPMessage } from '../shared/CSPMessage';\nimport { MessageContainer } from '../shared/MessageContainer';\n\nconst RemoveButtonIcon = <Cross aria-label={_('Remove image')} />;\n\nconst ImageUrlReaderContainer = styled.div`\n width: 100%;\n padding-bottom: 5px;\n`;\n\nconst StyledImagePreview = styled.div`\n border: 1px solid ${variables.borderColor};\n position: relative;\n min-height: 30px;\n height: auto;\n`;\n\nconst StyledTitleContainer = styled.div`\n background-color: ${variables.backgroundColorPage};\n color: ${variables.contentColorDefault};\n opacity: 0.9;\n position: absolute;\n width: 100%;\n min-height: 30px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nconst StyledTitle = styled.div`\n margin-left: ${variables.spacingMedium};\n overflow: hidden;\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StyledRemoveButton = styled(Button).attrs({ 'data-test': 'image-remove-button' })`\n flex-grow: 0;\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.actionColorBackgroundSecondaryHover} !important;\n }\n`;\n\nconst StyledImageThumbnail = styled.img`\n ${mixins.reset('block')};\n margin: 0 auto;\n max-width: 100%;\n max-height: 180px;\n`;\n\nconst ImageThumbnail = ({ filename, imageDataURI, onImageRemove, overrideCSPViolation }) => {\n const violationType = useCSPViolationObserver(imageDataURI, overrideCSPViolation);\n\n return (\n <ImageUrlReaderContainer>\n <StyledImagePreview>\n <StyledTitleContainer>\n <StyledTitle>{filename}</StyledTitle>\n <StyledRemoveButton appearance=\"subtle\" icon={RemoveButtonIcon} onClick={onImageRemove} />\n </StyledTitleContainer>\n <StyledImageThumbnail alt={filename} src={imageDataURI} />\n </StyledImagePreview>\n {violationType !== 'none' && (\n <MessageContainer>\n <CSPMessage type={violationType} />\n </MessageContainer>\n )}\n </ImageUrlReaderContainer>\n );\n};\n\nImageThumbnail.propTypes = {\n filename: T.string,\n imageDataURI: T.string,\n onImageRemove: T.func,\n overrideCSPViolation: T.string,\n};\n\nImageThumbnail.defaultProps = {\n onImageRemove: () => {},\n filename: null,\n imageDataURI: null,\n};\n\nexport default ImageThumbnail;\n","import React, { useContext, useEffect, useCallback, useState } from 'react';\nimport T from 'prop-types';\nimport ImageContext from '@splunk/visualization-context/ImageContext';\nimport ControlGroup from '../shared/AdvancedControlGroup';\nimport UploadImageEditor from '../components/UploadImageEditor';\nimport ImageThumbnail from '../components/ImageThumbnail';\n\nconst getImageData = async (registry, value) => {\n if (registry?.isResourceURL(value)) {\n return registry.getByURL(value);\n }\n return { dataURI: value, metaData: { name: value } };\n};\n\nconst ImageEditor = ({\n onChange,\n name,\n value,\n labelPosition,\n labelWidth,\n label,\n validMediaTypes,\n svgRenderAsDom,\n overrideCSPViolation,\n}) => {\n const imageRegistry = useContext(ImageContext);\n const [dataUri, setDataUri] = useState(null);\n const [fileName, setFileName] = useState(null);\n\n const uploadImage = useCallback(\n async (file, imageDataUri) => {\n try {\n const imageId = await imageRegistry.upload(\n imageDataUri,\n { name: file },\n null,\n validMediaTypes\n );\n onChange(null, name, imageId);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(error);\n }\n },\n [imageRegistry, validMediaTypes, onChange, name]\n );\n\n const handleUpload = useCallback(\n ({ src, filename: file, imageDataURI }) => {\n if (src) {\n return onChange(null, name, src);\n }\n\n if (file !== null && imageDataURI !== null) {\n return uploadImage(file, imageDataURI);\n }\n\n return onChange(null, name, null);\n },\n [uploadImage, onChange, name]\n );\n\n const handleRemove = useCallback(event => onChange(event, name, null), [onChange, name]);\n\n useEffect(() => {\n const populateData = async () => {\n if (value) {\n const obj = await getImageData(imageRegistry, value);\n\n setDataUri(obj.dataURI);\n setFileName(obj.metaData.name);\n }\n };\n\n populateData();\n }, [value, imageRegistry]);\n\n return (\n <ControlGroup label={label} labelPosition={labelPosition} labelWidth={labelWidth}>\n {value ? (\n <ImageThumbnail\n filename={fileName}\n imageDataURI={dataUri}\n onImageRemove={handleRemove}\n overrideCSPViolation={overrideCSPViolation}\n />\n ) : (\n <UploadImageEditor\n svgRenderAsDom={svgRenderAsDom}\n validImageTypes={validMediaTypes}\n handleImageUpload={handleUpload}\n />\n )}\n </ControlGroup>\n );\n};\n\nImageEditor.propTypes = {\n /**\n * Callback when changing the text value\n *\n * @param {SyntheticEvent} event The react `SyntheticEvent`\n * @param {string} name The option name\n * @param {string} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * The option value\n */\n value: T.string,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['top', 'left']),\n labelWidth: T.number,\n /**\n * The valid media type\n */\n validMediaTypes: T.array,\n /**\n * Boolean to indicate if svg render in domNode directly\n */\n svgRenderAsDom: T.bool,\n /**\n * Simulate CSP Violation\n */\n overrideCSPViolation: T.string,\n};\n\nImageEditor.defaultProps = {\n labelPosition: 'top',\n};\n\nexport default ImageEditor;\n"],"names":["useCSPViolationObserver","src","defaultValue","violation","setViolation","useState","useEffect","violationHandler","e","blockedURI","disposition","document","addEventListener","removeEventListener","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","map","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","CSPMessage","type","cspMessageLink","React","useContext","to","openInNewContext","MessageContainer","div","module","exports","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","value","EditorContainer","styled","textStyle","marginBottom","imageFileReaderStyle","width","SharingWarning","warningText","calculateAllowedImageFileTypes","memoize","mediaTypes","enableSVGImageUpload","allowedImageFileTypes","slice","indexOf","push","index","splice","join","UploadImageEditor","Component","constructor","props","super","_defineProperty","this","state","urlValue","setState","violationType","img","Image","onload","handleImageUpload","onerror","validUrl","preventDefault","checkImage","event","_this$inputRef$curren","inputRef","current","contains","relatedTarget","element","handleBlur","filename","imageDataURI","componentDidMount","componentWillUnmount","render","enableImageFileUpload","enableSvgHttpDownloader","enableGallerySharingWarning","context","validImageTypes","shouldShowURLField","svgRenderAsDom","errorMessage","Message","Text","canClear","onChange","handleURLChange","onKeyDown","handleTextKeyDown","elementRef","trackInputRef","ImageFileReader","defaultFilename","defaultImageDataURI","onImageChange","handleOnImageChange","allowExtensions","FeatureFlagContext","RemoveButtonIcon","Cross","ImageUrlReaderContainer","StyledImagePreview","borderColor","StyledTitleContainer","backgroundColorPage","contentColorDefault","StyledTitle","StyledRemoveButton","Button","attrs","actionColorBackgroundSecondaryHover","StyledImageThumbnail","mixins","reset","ImageThumbnail","onImageRemove","overrideCSPViolation","alt","ImageEditor","name","validMediaTypes","imageRegistry","ImageContext","dataUri","setDataUri","fileName","setFileName","uploadImage","useCallback","async","file","imageDataUri","imageId","upload","console","warn","handleUpload","handleRemove","registry","isResourceURL","getByURL","dataURI","metaData","getImageData","populateData","ControlGroup","isRequired"],"sourceRoot":""}
1
+ {"version":3,"file":"ImageEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/./src/hooks/useCSPViolationObserver.tsx","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/CSPMessage.tsx","webpack://@splunk/dynamic-editors/./src/shared/MessageContainer.tsx","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/Cross\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Link\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Message\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Text\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/FeatureFlagContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/MessageContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualization-context/ImageContext\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Image\"","webpack://@splunk/dynamic-editors/./src/components/UploadImageEditor.jsx","webpack://@splunk/dynamic-editors/./src/components/ImageThumbnail.jsx","webpack://@splunk/dynamic-editors/./src/editors/ImageEditor.jsx"],"sourcesContent":["import { useState, useEffect } from 'react';\n\ntype ViolationType = 'error' | 'warning' | 'none';\n\nconst useCSPViolationObserver = (src: string, defaultValue: ViolationType = 'none'): ViolationType => {\n const [violation, setViolation] = useState<ViolationType>(defaultValue);\n useEffect(() => {\n const violationHandler = e => {\n if ((e.blockedURI === src || e.blockedURI === `${src}/`) && e.disposition === 'enforce') {\n // the second src condition is required as Chrome rewrites\n // URLs without query parameters (e.g. foo.com -> foo.com/ )\n setViolation('error');\n } else if ((e.blockedURI === src || e.blockedURI === `${src}/`) && e.disposition === 'report') {\n setViolation('warning');\n }\n };\n document.addEventListener('securitypolicyviolation', violationHandler);\n setViolation(defaultValue);\n return () => {\n document.removeEventListener('securitypolicyviolation', violationHandler);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [src]);\n return violation;\n};\n\nexport { useCSPViolationObserver };\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/react-ui/Message';\nimport Link from '@splunk/react-ui/Link';\nimport MessageContext from '@splunk/visualization-context/MessageContext';\n\nexport type CSPMessageProps = { type: 'warning' | 'error' };\n\nexport const CSPMessage = ({ type }: CSPMessageProps) => {\n const { cspMessageLink } = React.useContext(MessageContext) as Record<string, string>; // NOSONAR\n return (\n <Message appearance=\"fill\" type={type} data-test={`csp-message-${type}`}>\n {_(\n 'External image URLs must now have their domains listed in the Dashboards Trusted Domains List by working with your administrator. Alternatively, you can upload the image directly into the dashboard. '\n )}\n {cspMessageLink && (\n <Link to={cspMessageLink} openInNewContext>\n {_('Learn more')}\n </Link>\n )}\n </Message>\n );\n};\n","import styled from 'styled-components';\n\nexport const MessageContainer = styled.div`\n margin-top: 10px;\n`;\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@splunk/react-icons/Cross\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/Link\");","module.exports = require(\"@splunk/react-ui/Message\");","module.exports = require(\"@splunk/react-ui/Text\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"@splunk/visualization-context/FeatureFlagContext\");","module.exports = require(\"@splunk/visualization-context/MessageContext\");","module.exports = require(\"lodash\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualization-context/ImageContext\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/react-ui/Image\");","import React, { Component } from 'react';\nimport T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/react-ui/Message';\nimport Text from '@splunk/react-ui/Text';\nimport ImageFileReader from '@splunk/react-ui/Image';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { memoize } from 'lodash';\nimport { CSPMessage } from '../shared/CSPMessage';\n\nconst EditorContainer = styled.div`\n padding-bottom: 5px;\n width: 100%;\n text-align: center;\n`;\n\nconst textStyle = { marginBottom: 10 };\nconst imageFileReaderStyle = { width: '100%' };\nconst SharingWarning = styled.span`\n font-size: smaller;\n font-style: italic;\n`;\n\nexport const warningText = _(\n 'Note: Uploaded image files can be accessed and deleted by others in your organization'\n);\n\nexport const calculateAllowedImageFileTypes = memoize(\n (mediaTypes, enableSVGImageUpload) => {\n const allowedImageFileTypes = mediaTypes.slice();\n if (enableSVGImageUpload) {\n if (allowedImageFileTypes.indexOf('svg') === -1) {\n allowedImageFileTypes.push('svg');\n }\n } else {\n // if enableSVGImageUpload is set to false, then remove the svg upload capability\n const index = allowedImageFileTypes.indexOf('svg');\n if (index > -1) {\n allowedImageFileTypes.splice(index, 1);\n }\n }\n return allowedImageFileTypes;\n },\n (mediaTypes, enableSVGImageUpload) => `${enableSVGImageUpload}-${mediaTypes.join('-')}`\n);\n\nclass UploadImageEditor extends Component {\n static contextType = FeatureFlagContext;\n\n constructor(props) {\n super(props);\n this.state = {\n urlValue: '',\n validUrl: true,\n violationType: 'none',\n };\n\n // Reference to rendered SUI input clear button\n this.inputRef = React.createRef();\n }\n\n componentDidMount() {\n document.addEventListener('securitypolicyviolation', this.violationHandler);\n }\n\n componentWillUnmount() {\n document.removeEventListener('securitypolicyviolation', this.violationHandler);\n\n if (this.inputRef.current) {\n this.inputRef.current.removeEventListener('focusout', this.handleBlur);\n }\n }\n\n violationHandler = e => {\n if (\n (e.blockedURI === this.state.urlValue || e.blockedURI === `${this.state.urlValue}/`) &&\n e.disposition === 'enforce'\n ) {\n this.setState({\n violationType: 'error',\n });\n } else if (\n (e.blockedURI === this.state.urlValue || e.blockedURI === `${this.state.urlValue}/`) &&\n e.disposition === 'report'\n ) {\n this.setState({\n violationType: 'warning',\n });\n }\n };\n\n /**\n * Executes and passes the url to the callback function, handleImageUpload(), if the image url is valid, else sets the boolean validURL to false\n * @method checkImage\n * @param {String} src\n */\n checkImage = src => {\n if (!src) {\n return;\n }\n const img = new Image();\n img.onload = () => {\n this.props.handleImageUpload({ src });\n };\n img.onerror = () => {\n // Only set validUrl=false when there's a URL value in state\n this.setState(state => (!state.urlValue ? undefined : { validUrl: false }));\n };\n img.src = src;\n };\n\n /**\n * Callback to update text box value (url) on change\n * @method handleURLChange\n * @param {String} value\n * @param {Object} e\n */\n handleURLChange = (e, { value }) => {\n this.setState({\n urlValue: value,\n validUrl: true,\n violationType: 'none',\n });\n };\n\n /**\n * Checks if text key down is 'enter' and calls checkImage() accordingly\n * @method handleTextKeyDown\n * @param {Object} e\n */\n handleTextKeyDown = e => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.checkImage(this.state.urlValue);\n }\n };\n\n handleBlur = event => {\n // If the element taking focus from the input is in the input tree\n // then it's probably the clear button\n if (this.inputRef.current?.contains(event.relatedTarget)) {\n return;\n }\n\n this.checkImage(this.state.urlValue);\n };\n\n // Custom ref/event listener for the Text input because SUI uses a blur event\n // which doesn't bubble. By using focusout the event will bubble and the clear\n // button can prevent checking for an image while it has focus but doesn't\n // block the check if a user tabs through the button\n trackInputRef = element => {\n this.inputRef.current = element;\n if (element) {\n element.addEventListener('focusout', this.handleBlur);\n }\n };\n\n /**\n * Executes and passes the filename+dataURI to the callback function, handleImageUpload()\n * @method handleOnImageChange\n * @param {Object} {filename, dataURI}\n */\n handleOnImageChange = ({ filename, imageDataURI }) => {\n if (filename && imageDataURI) {\n this.props.handleImageUpload({ filename, imageDataURI });\n } else {\n this.props.handleImageUpload({ filename: null, imageDataURI: null });\n }\n };\n\n render() {\n const {\n enableImageFileUpload,\n enableSVGImageUpload,\n enableSvgHttpDownloader,\n enableGallerySharingWarning,\n } = this.context || {};\n const allowedImageFileTypes = calculateAllowedImageFileTypes(\n this.props.validImageTypes,\n enableSVGImageUpload\n );\n\n // 1. allowedImageFileTypes does not have svg, show URL Input Field\n // 2. allowedImageFileTypes has svg and svg is rendered as dom (ChoroplethSvg), then if feature flag enableSvgHttpDownloader is true, show URL Input Field\n // 3. allowedImageFileTypes has svg and svg is not rendered as dom but with <img> (Image Viz), show URL Input Field\n\n const shouldShowURLField =\n allowedImageFileTypes.indexOf('svg') < 0 ||\n (this.props.svgRenderAsDom &&\n allowedImageFileTypes.indexOf('svg') > -1 &&\n enableSvgHttpDownloader) ||\n (!this.props.svgRenderAsDom && allowedImageFileTypes.indexOf('svg') > -1);\n\n const errorMessage =\n this.state.violationType !== 'none' ? (\n <CSPMessage type={this.state.violationType} />\n ) : (\n <Message appearance=\"fill\" type=\"error\">\n {_(\"We can't find an image with this URL. Please enter a new URL.\")}\n </Message>\n );\n return (\n <EditorContainer>\n {shouldShowURLField && (\n <Text\n canClear\n value={this.state.urlValue}\n onChange={this.handleURLChange}\n onKeyDown={this.handleTextKeyDown}\n style={textStyle}\n elementRef={this.trackInputRef}\n />\n )}\n {this.state.validUrl\n ? enableImageFileUpload && (\n <React.Fragment>\n <ImageFileReader\n style={imageFileReaderStyle}\n defaultFilename={null}\n defaultImageDataURI={null}\n onImageChange={this.handleOnImageChange}\n allowExtensions={allowedImageFileTypes}\n />\n {enableGallerySharingWarning && (\n <SharingWarning data-test=\"gallery-sharing-warning\">\n {warningText}\n </SharingWarning>\n )}\n </React.Fragment>\n )\n : errorMessage}\n </EditorContainer>\n );\n }\n}\n\nUploadImageEditor.propTypes = {\n handleImageUpload: T.func,\n validImageTypes: T.array,\n svgRenderAsDom: T.bool,\n};\n\nUploadImageEditor.defaultProps = {\n handleImageUpload: () => {},\n validImageTypes: ['gif', 'jpeg', 'jpg', 'png', 'webp'],\n svgRenderAsDom: false,\n};\n\nexport default UploadImageEditor;\n","import React from 'react';\nimport styled from 'styled-components';\nimport T from 'prop-types';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Cross from '@splunk/react-icons/Cross';\nimport Button from '@splunk/react-ui/Button';\nimport { variables, mixins } from '@splunk/themes';\nimport { useCSPViolationObserver } from '../hooks/useCSPViolationObserver';\nimport { CSPMessage } from '../shared/CSPMessage';\nimport { MessageContainer } from '../shared/MessageContainer';\n\nconst RemoveButtonIcon = <Cross />;\n\nconst ImageUrlReaderContainer = styled.div`\n width: 100%;\n padding-bottom: 5px;\n`;\n\nconst StyledImagePreview = styled.div`\n border: 1px solid ${variables.borderColor};\n position: relative;\n min-height: 30px;\n height: auto;\n`;\n\nconst StyledTitleContainer = styled.div`\n background-color: ${variables.backgroundColorPage};\n color: ${variables.contentColorDefault};\n opacity: 0.9;\n position: absolute;\n width: 100%;\n min-height: 30px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n`;\n\nconst StyledTitle = styled.div`\n margin-left: ${variables.spacingMedium};\n overflow: hidden;\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StyledRemoveButton = styled(Button).attrs({\n 'data-test': 'image-remove-button',\n})`\n flex-grow: 0;\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.actionColorBackgroundSecondaryHover} !important;\n }\n`;\n\nconst StyledImageThumbnail = styled.img`\n ${mixins.reset('block')};\n margin: 0 auto;\n max-width: 100%;\n max-height: 180px;\n`;\n\nconst ImageThumbnail = ({ filename, imageDataURI, onImageRemove, overrideCSPViolation }) => {\n const violationType = useCSPViolationObserver(imageDataURI, overrideCSPViolation);\n\n return (\n <ImageUrlReaderContainer>\n <StyledImagePreview>\n <StyledTitleContainer>\n <StyledTitle>{filename}</StyledTitle>\n <StyledRemoveButton\n aria-label={_('Remove image')}\n appearance=\"subtle\"\n icon={RemoveButtonIcon}\n onClick={onImageRemove}\n />\n </StyledTitleContainer>\n <StyledImageThumbnail alt={filename} src={imageDataURI} />\n </StyledImagePreview>\n {violationType !== 'none' && (\n <MessageContainer>\n <CSPMessage type={violationType} />\n </MessageContainer>\n )}\n </ImageUrlReaderContainer>\n );\n};\n\nImageThumbnail.propTypes = {\n filename: T.string,\n imageDataURI: T.string,\n onImageRemove: T.func,\n overrideCSPViolation: T.string,\n};\n\nImageThumbnail.defaultProps = {\n onImageRemove: () => {},\n filename: null,\n imageDataURI: null,\n};\n\nexport default ImageThumbnail;\n","import React, { useContext, useEffect, useCallback, useState } from 'react';\nimport T from 'prop-types';\nimport ImageContext from '@splunk/visualization-context/ImageContext';\nimport ControlGroup from '../shared/AdvancedControlGroup';\nimport UploadImageEditor from '../components/UploadImageEditor';\nimport ImageThumbnail from '../components/ImageThumbnail';\n\nconst getImageData = async (registry, value) => {\n if (registry?.isResourceURL(value)) {\n return registry.getByURL(value);\n }\n return { dataURI: value, metaData: { name: value } };\n};\n\nconst ImageEditor = ({\n onChange,\n name,\n value,\n labelPosition,\n labelWidth,\n label,\n validMediaTypes,\n svgRenderAsDom,\n overrideCSPViolation,\n}) => {\n const imageRegistry = useContext(ImageContext);\n const [dataUri, setDataUri] = useState(null);\n const [fileName, setFileName] = useState(null);\n\n const uploadImage = useCallback(\n async (file, imageDataUri) => {\n try {\n const imageId = await imageRegistry.upload(\n imageDataUri,\n { name: file },\n null,\n validMediaTypes\n );\n onChange(null, name, imageId);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(error);\n }\n },\n [imageRegistry, validMediaTypes, onChange, name]\n );\n\n const handleUpload = useCallback(\n ({ src, filename: file, imageDataURI }) => {\n if (src) {\n return onChange(null, name, src);\n }\n\n if (file !== null && imageDataURI !== null) {\n return uploadImage(file, imageDataURI);\n }\n\n return onChange(null, name, null);\n },\n [uploadImage, onChange, name]\n );\n\n const handleRemove = useCallback(event => onChange(event, name, null), [onChange, name]);\n\n useEffect(() => {\n const populateData = async () => {\n if (value) {\n const obj = await getImageData(imageRegistry, value);\n\n setDataUri(obj.dataURI);\n setFileName(obj.metaData.name);\n }\n };\n\n populateData();\n }, [value, imageRegistry]);\n\n return (\n <ControlGroup label={label} labelPosition={labelPosition} labelWidth={labelWidth}>\n {value ? (\n <ImageThumbnail\n filename={fileName}\n imageDataURI={dataUri}\n onImageRemove={handleRemove}\n overrideCSPViolation={overrideCSPViolation}\n />\n ) : (\n <UploadImageEditor\n svgRenderAsDom={svgRenderAsDom}\n validImageTypes={validMediaTypes}\n handleImageUpload={handleUpload}\n />\n )}\n </ControlGroup>\n );\n};\n\nImageEditor.propTypes = {\n /**\n * Callback when changing the text value\n *\n * @param {SyntheticEvent} event The react `SyntheticEvent`\n * @param {string} name The option name\n * @param {string} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * The option value\n */\n value: T.string,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['top', 'left']),\n labelWidth: T.number,\n /**\n * The valid media type\n */\n validMediaTypes: T.array,\n /**\n * Boolean to indicate if svg render in domNode directly\n */\n svgRenderAsDom: T.bool,\n /**\n * Simulate CSP Violation\n */\n overrideCSPViolation: T.string,\n};\n\nImageEditor.defaultProps = {\n labelPosition: 'top',\n};\n\nexport default ImageEditor;\n"],"names":["useCSPViolationObserver","src","defaultValue","violation","setViolation","useState","useEffect","violationHandler","e","blockedURI","disposition","document","addEventListener","removeEventListener","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","map","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","CSPMessage","type","cspMessageLink","React","useContext","to","openInNewContext","MessageContainer","div","module","exports","require","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","value","EditorContainer","styled","textStyle","marginBottom","imageFileReaderStyle","width","SharingWarning","warningText","calculateAllowedImageFileTypes","memoize","mediaTypes","enableSVGImageUpload","allowedImageFileTypes","slice","indexOf","push","index","splice","join","UploadImageEditor","Component","constructor","props","super","_defineProperty","this","state","urlValue","setState","violationType","img","Image","onload","handleImageUpload","onerror","validUrl","preventDefault","checkImage","event","_this$inputRef$curren","inputRef","current","contains","relatedTarget","element","handleBlur","filename","imageDataURI","componentDidMount","componentWillUnmount","render","enableImageFileUpload","enableSvgHttpDownloader","enableGallerySharingWarning","context","validImageTypes","shouldShowURLField","svgRenderAsDom","errorMessage","Message","Text","canClear","onChange","handleURLChange","onKeyDown","handleTextKeyDown","elementRef","trackInputRef","ImageFileReader","defaultFilename","defaultImageDataURI","onImageChange","handleOnImageChange","allowExtensions","FeatureFlagContext","RemoveButtonIcon","Cross","ImageUrlReaderContainer","StyledImagePreview","borderColor","StyledTitleContainer","backgroundColorPage","contentColorDefault","StyledTitle","StyledRemoveButton","Button","attrs","actionColorBackgroundSecondaryHover","StyledImageThumbnail","mixins","reset","ImageThumbnail","onImageRemove","overrideCSPViolation","alt","ImageEditor","name","validMediaTypes","imageRegistry","ImageContext","dataUri","setDataUri","fileName","setFileName","uploadImage","useCallback","async","file","imageDataUri","imageId","upload","console","warn","handleUpload","handleRemove","registry","isResourceURL","getByURL","dataURI","metaData","getImageData","populateData","ControlGroup","isRequired"],"sourceRoot":""}
@@ -1 +1 @@
1
- {"version":3,"file":"RadioBarEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/forIn\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/clone\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/isPlainObject\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/set\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/schemaUtils\"","webpack://@splunk/dynamic-editors/./src/utils/EditorFunctions.js","webpack://@splunk/dynamic-editors/./src/utils/token.js","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/dimensionConstants.ts","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/extends\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/RadioBar\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/omit\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/./src/editors/RadioBarEditor.jsx"],"sourcesContent":["const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/forIn\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/clone\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/isPlainObject\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/set\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/schemaUtils\");","import omit from 'lodash/omit';\nimport forIn from 'lodash/forIn';\nimport cloneDeep from 'lodash/clone';\nimport isPlainObject from 'lodash/isPlainObject';\nimport set from 'lodash/set';\nimport { DYNAMIC_OPTIONS_DSL_PATTERN } from '@splunk/visualizations-shared/schemaUtils';\n\n/**\n * Return values, or parse enum values if values do not exist\n * @param {Object} itemSchema Validation config for an editor item\n * @param {Object[]} values List of predefined { label, value } objects for use by editor\n * @returns {Object[]} List of { label, value } objects for use by editor\n */\nexport const getOptions = (itemSchema, values) => {\n if (Array.isArray(values)) {\n return values;\n }\n\n if (itemSchema && Array.isArray(itemSchema.enum)) {\n return itemSchema.enum.map(item => ({ value: item }));\n }\n\n throw Error(`No valid values provided to editor: ${JSON.stringify(itemSchema)}`);\n};\n\nexport function handleOptionsChange(name, value, options = { debounce: false }) {\n const { visualization } = this.props;\n if (value == null) {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: omit(visualization.options, [name]),\n },\n options\n );\n } else {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: {\n ...visualization.options,\n [name]: value,\n },\n },\n options\n );\n }\n}\n\n/*\n * @method isMultipleRulesSchema\n * @param {Object} itemSchema\n * @returns {Boolean}\n */\nexport const isMultipleRulesSchema = itemSchema => !!itemSchema.anyOf && itemSchema.anyOf.length > 0;\n\n/*\n * @method isDynamicOptionSchema\n * @param {Object} schema\n * @returns {Boolean}\n */\nexport const isDynamicOptionSchema = schema =>\n schema.type === 'string' && schema.pattern === DYNAMIC_OPTIONS_DSL_PATTERN;\n\n/*\n * @method isNestedOption\n * @param {String} optionName\n * @returns {Boolean}\n */\nexport const isNestedOption = optionName => /^\\w+\\[\\d+\\]\\.(.+)$/.test(optionName);\n\n/*\n * @method getStaticItemSchema\n * @param {Object} itemSchema\n * @returns {Object} staticItemSchema\n */\nexport const getStaticItemSchema = itemSchema => {\n if (!isMultipleRulesSchema(itemSchema)) {\n return itemSchema;\n }\n\n const staticSchema = itemSchema.anyOf.find(schema => !isDynamicOptionSchema(schema));\n return { ...omit(itemSchema, 'anyOf'), ...staticSchema };\n};\n\n/**\n * @method getFormatterConfig\n * @param {Object} props\n * @param {Array | Object} [props.contextConfig]\n * @param {Array} props.formatters\n * @param {String} props.formatterFromDSL\n * @param {String} props.selectedDataSelector\n * @returns {Array | Object} the default formatter config of dynamic color editors' fomatter\n */\nexport const getFormatterConfig = ({ contextConfig, formatters, formatterFromDSL, selectedDataSelector }) => {\n if (contextConfig) {\n return contextConfig;\n }\n\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n};\n\n/**\n * @method isSupportedDataSelector\n * @param {Object} config\n * @param {String} config.selectedDataSelector e.g. 'majorValue'\n * @param {Array} config.dataSelectors e.g. [{ label: 'value', value: 'majorValue'}]\n * @returns {Boolean} true if dataSelectors includes selectedDataSelector\n */\nexport const isSupportedDataSelector = ({ selectedDataSelector, dataSelectors }) => {\n if (!selectedDataSelector || !dataSelectors || !dataSelectors.length) {\n return false;\n }\n return dataSelectors.some(ds => ds.value === selectedDataSelector);\n};\n\n/**\n * @method isSupportedFormatter\n * @param {Object} config\n * @param {String} [config.selectedFormatterType] e.g. 'rangeValue'\n * @param {Array} [config.formattersFromEditor] e.g. [{ label: 'rangle', value: 'rangeValue', defaults: {}}]\n * @param {Object} config.supportedFormatters e.g. {rangeValue: {}, matchValue: {}}\n * @returns {Boolean} true if formattersFromEditor includes selectedFormatterType and selectedFormatterType is one of supportedFormatters on editor\n */\nexport const isSupportedFormatter = ({\n selectedFormatterType,\n formattersFromEditor,\n supportedFormatters,\n}) => {\n if (\n !selectedFormatterType ||\n !supportedFormatters[selectedFormatterType] ||\n !formattersFromEditor ||\n !formattersFromEditor.length\n ) {\n return false;\n }\n return formattersFromEditor.some(fm => fm.value === selectedFormatterType);\n};\n\n/**\n * @method getFilteredRowsByShowEditor filters the EditorItem objects which are visible based on showEditor property\n * @param {Object} args\n * @param {Array} args.row\n * @param {Object} args.options // item options\n * @param {Object} args.encoding\n * @param {Object} args.featureFlags\n * @returns array of EditorItem objects or empty array\n */\nexport const getFilteredRowsByShowEditor = ({ row, options, encoding, featureFlags }) => {\n if (!row || !Array.isArray(row)) {\n return [];\n }\n const filteredRow = row.filter(\n item =>\n typeof item.showEditor === 'undefined' ||\n (typeof item.showEditor === 'function' && item.showEditor({ options, encoding, featureFlags }))\n );\n return filteredRow;\n};\n\n/**\n * @method removeEmptyEntries Removes of all entries where the value is null, undefined, and convert nulls in arrays to undefined\n * @param {Object} obj\n */\nconst removeEmptyEntries = obj => {\n const returnObj = cloneDeep(obj);\n forIn(returnObj, (value, key) => {\n if ((value !== null && value !== undefined && Array.isArray(value)) || isPlainObject(value)) {\n returnObj[key] = removeEmptyEntries(returnObj[key]);\n }\n if (Array.isArray(value)) {\n returnObj[key] = value.map(val => (val === null ? undefined : val));\n }\n if (value === null || value === undefined) {\n delete returnObj[key];\n }\n });\n return returnObj;\n};\n\n/**\n * @method setOption sets an options value\n * @param {String} option\n * @param {Any} value\n * @param {Object} oldVisualization\n * @param {Object} optionSchema\n * @returns visualization object with updated options\n */\nexport const setOption = (option, value, oldVisualization, optionSchema, defaultOverrides) => {\n const obj = {\n ...oldVisualization,\n };\n\n let newOption = option;\n let newValue = value;\n\n // Remove from definition if value is null/undefined, and the key is explicitly set in the optionSchema\n if ((newValue === null || newValue === undefined) && optionSchema[newOption]) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n\n // Remove from definition if value is the same as the default from the overrides or the schema\n const schemaDefault = defaultOverrides?.[newOption] ?? optionSchema[newOption]?.default;\n if (typeof schemaDefault !== 'undefined' && newValue === schemaDefault) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n // Copy options\n obj.options = cloneDeep(oldVisualization.options);\n obj.options ??= {};\n // ColumnSelectionEditor returns the option as an object\n // with a key/value pair inside that object with the param value as undefiend\n if ((value === null || value === undefined) && isPlainObject(option) && isPlainObject(option.options)) {\n [newOption] = Object.keys(option.options);\n [newValue] = Object.values(option.options);\n }\n // Select explicitly exposed option first for non arrays / objects\n if (optionSchema[newOption]) {\n if (optionSchema[newOption].type !== 'array') {\n obj.options[newOption] = newValue;\n return obj;\n }\n }\n // Set option using loadash to translate string path like `object.object.key` to target a specific key within nested objects\n if (newValue === null) {\n newValue = undefined;\n }\n set(obj.options, newOption, newValue);\n // Remove any null, undefined, nad nulls from arrays\n obj.options = removeEmptyEntries(obj.options);\n return obj;\n};\n","const TOKEN_NAMESPACE_PREFIX_PATTERN = /(\\w+:)?/.source;\n// ex: token.name|suh (old-style filter chain)\n// ex: token.name|lower|capitalize (new-style filter chain)\nconst TOKEN_NAME_CHARS_PATTERN = /([^$|:]+?)(\\|[|\\w]+)?/.source;\n// ex: $ns:token.name|suh$\nconst TOKEN_PATTERN = /\\$/.source + TOKEN_NAMESPACE_PREFIX_PATTERN + TOKEN_NAME_CHARS_PATTERN + /\\$/.source;\n\nconst TokenRegExp = new RegExp(TOKEN_PATTERN);\n\nexport const hasTokens = value => typeof value === 'string' && TokenRegExp.test(value);\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","export const FLYOUT_PADDING = 21;\nexport const COLUMN_FLYOUT_PADDING = 16;\nexport const FLYOUT_WIDTH = 344;\n\nexport const VERTICAL_EDITOR_SPACING = 16;\n\nexport const DROPDOWN_MENU_WIDTH = 327;\n\nexport const editorStyle = { width: '100%' };\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@babel/runtime/helpers/extends\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/RadioBar\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"lodash/omit\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport RadioBar from '@splunk/react-ui/RadioBar';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst RadioBarEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition,\n labelWidth,\n label,\n isDisabled,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n // TODO: SUI 4.0 renders empty labels differently. Labels should never be empty strings, instead pass\n // a valid label and set hideLabel on ControlGroup\n const controlGroupMarginFix = !label || label === '' ? { marginTop: '-8px' } : undefined;\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n style={controlGroupMarginFix}\n >\n <RadioBar\n data-test={name}\n onChange={handleChange}\n value={value}\n style={editorStyle}\n disabled={disabled}\n >\n {options.map(v => {\n const displayContent = v.label || v.value;\n\n // TODO: Revisit this. SUI supports label with icon, so why doesn't this editor?\n const optionProps = {};\n if (v.icon) {\n // Splunk-UI Button does not support tooltip as of now, so we need to use Tooltip on icon\n optionProps.startAdornment = (\n <Tooltip content={displayContent}>\n <v.icon hideDefaultTooltip />\n </Tooltip>\n );\n } else {\n optionProps.label = displayContent;\n }\n\n return (\n <RadioBar.Option key={v.value} value={v.value} disabled={disabled} {...optionProps} />\n );\n })}\n </RadioBar>\n </ControlGroup>\n );\n};\n\nRadioBarEditor.propTypes = {\n /**\n * Callback when selecting an item from radio bar\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.bool]).isRequired,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.bool]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n};\n\nRadioBarEditor.defaultProps = {\n labelPosition: 'top',\n isDisabled: false,\n};\n\nexport default RadioBarEditor;\n"],"names":["require","getOptions","itemSchema","values","Array","isArray","enum","map","item","value","Error","JSON","stringify","TokenRegExp","RegExp","source","hasTokens","test","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","editorStyle","width","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","RadioBarEditor","onChange","name","isDisabled","options","disabled","handleChange","useCallback","event","v","controlGroupMarginFix","marginTop","React","ControlGroup","RadioBar","displayContent","optionProps","startAdornment","Tooltip","hideDefaultTooltip","_extends","isRequired"],"sourceRoot":""}
1
+ {"version":3,"file":"RadioBarEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/forIn\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/clone\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/isPlainObject\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/set\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/schemaUtils\"","webpack://@splunk/dynamic-editors/./src/utils/EditorFunctions.js","webpack://@splunk/dynamic-editors/./src/utils/token.js","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/dimensionConstants.ts","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/extends\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/RadioBar\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/omit\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/./src/editors/RadioBarEditor.jsx"],"sourcesContent":["const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/forIn\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/clone\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/isPlainObject\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/set\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/schemaUtils\");","import omit from 'lodash/omit';\nimport forIn from 'lodash/forIn';\nimport cloneDeep from 'lodash/clone';\nimport isPlainObject from 'lodash/isPlainObject';\nimport set from 'lodash/set';\nimport { DYNAMIC_OPTIONS_DSL_PATTERN } from '@splunk/visualizations-shared/schemaUtils';\n\n/**\n * Return values, or parse enum values if values do not exist\n * @param {Object} itemSchema Validation config for an editor item\n * @param {Object[]} values List of predefined { label, value } objects for use by editor\n * @returns {Object[]} List of { label, value } objects for use by editor\n */\nexport const getOptions = (itemSchema, values) => {\n if (Array.isArray(values)) {\n return values;\n }\n\n if (itemSchema && Array.isArray(itemSchema.enum)) {\n return itemSchema.enum.map(item => ({ value: item }));\n }\n\n throw Error(`No valid values provided to editor: ${JSON.stringify(itemSchema)}`);\n};\n\nexport function handleOptionsChange(name, value, options = { debounce: false }) {\n const { visualization } = this.props;\n if (value == null) {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: omit(visualization.options, [name]),\n },\n options\n );\n } else {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: {\n ...visualization.options,\n [name]: value,\n },\n },\n options\n );\n }\n}\n\n/*\n * @method isMultipleRulesSchema\n * @param {Object} itemSchema\n * @returns {Boolean}\n */\nexport const isMultipleRulesSchema = itemSchema => !!itemSchema.anyOf && itemSchema.anyOf.length > 0;\n\n/*\n * @method isDynamicOptionSchema\n * @param {Object} schema\n * @returns {Boolean}\n */\nexport const isDynamicOptionSchema = schema =>\n schema.type === 'string' && schema.pattern === DYNAMIC_OPTIONS_DSL_PATTERN;\n\n/*\n * @method isNestedOption\n * @param {String} optionName\n * @returns {Boolean}\n */\nexport const isNestedOption = optionName => {\n const nestedOptionPattern = /^\\w+\\[\\d+\\]\\.(.+)$/;\n return nestedOptionPattern.exec(optionName) !== null;\n};\n\n/*\n * @method getStaticItemSchema\n * @param {Object} itemSchema\n * @returns {Object} staticItemSchema\n */\nexport const getStaticItemSchema = itemSchema => {\n if (!isMultipleRulesSchema(itemSchema)) {\n return itemSchema;\n }\n\n const staticSchema = itemSchema.anyOf.find(schema => !isDynamicOptionSchema(schema));\n return { ...omit(itemSchema, 'anyOf'), ...staticSchema };\n};\n\n/**\n * @method isContextCompatibleWithFormatter\n * @param {Array | Object} contextConfig\n * @param {String} formatterType\n * @returns {Boolean} true if context structure is compatible with formatter type\n */\nconst isContextCompatibleWithFormatter = (contextConfig, formatterType) => {\n if (!contextConfig || !formatterType) {\n return false;\n }\n\n // Gradient formatter expects an object with 'colors' property\n if (formatterType === 'gradient') {\n return (\n typeof contextConfig === 'object' && !Array.isArray(contextConfig) && 'colors' in contextConfig\n );\n }\n\n // Range/Match formatters expect an array\n if (formatterType === 'rangeValue' || formatterType === 'matchValue') {\n return Array.isArray(contextConfig);\n }\n\n // For unknown formatters, assume compatible to maintain existing behavior\n return true;\n};\n\n/**\n * @method getFormatterConfig\n * @param {Object} props\n * @param {Array | Object} [props.contextConfig]\n * @param {Array} props.formatters\n * @param {String} props.formatterFromDSL\n * @param {String} props.selectedDataSelector\n * @returns {Array | Object} the default formatter config of dynamic color editors' fomatter\n */\nexport const getFormatterConfig = ({ contextConfig, formatters, formatterFromDSL, selectedDataSelector }) => {\n // If no context exists, use default config\n if (!contextConfig) {\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n }\n\n // If no formatter type is provided, return context as-is for backward compatibility\n if (!formatterFromDSL) {\n return contextConfig;\n }\n\n // Check if existing context is compatible with the formatter type\n if (isContextCompatibleWithFormatter(contextConfig, formatterFromDSL)) {\n return contextConfig;\n }\n\n // Context is incompatible, use default config instead\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n};\n\n/**\n * @method isSupportedDataSelector\n * @param {Object} config\n * @param {String} config.selectedDataSelector e.g. 'majorValue'\n * @param {Array} config.dataSelectors e.g. [{ label: 'value', value: 'majorValue'}]\n * @returns {Boolean} true if dataSelectors includes selectedDataSelector\n */\nexport const isSupportedDataSelector = ({ selectedDataSelector, dataSelectors }) => {\n if (!selectedDataSelector || !dataSelectors?.length) {\n return false;\n }\n return dataSelectors.some(ds => ds.value === selectedDataSelector);\n};\n\n/**\n * @method isSupportedFormatter\n * @param {Object} config\n * @param {String} [config.selectedFormatterType] e.g. 'rangeValue'\n * @param {Array} [config.formattersFromEditor] e.g. [{ label: 'rangle', value: 'rangeValue', defaults: {}}]\n * @param {Object} config.supportedFormatters e.g. {rangeValue: {}, matchValue: {}}\n * @returns {Boolean} true if formattersFromEditor includes selectedFormatterType and selectedFormatterType is one of supportedFormatters on editor\n */\nexport const isSupportedFormatter = ({\n selectedFormatterType,\n formattersFromEditor,\n supportedFormatters,\n}) => {\n if (\n !selectedFormatterType ||\n !supportedFormatters?.[selectedFormatterType] ||\n !formattersFromEditor?.length\n ) {\n return false;\n }\n return formattersFromEditor.some(fm => fm.value === selectedFormatterType);\n};\n\n/**\n * @method getFilteredRowsByShowEditor filters the EditorItem objects which are visible based on showEditor property\n * @param {Object} args\n * @param {Array} args.row\n * @param {Object} args.options // item options\n * @param {Object} args.encoding\n * @param {Object} args.featureFlags\n * @returns array of EditorItem objects or empty array\n */\nexport const getFilteredRowsByShowEditor = ({ row, options, encoding, featureFlags }) => {\n if (!row || !Array.isArray(row)) {\n return [];\n }\n const filteredRow = row.filter(\n item =>\n typeof item.showEditor === 'undefined' ||\n (typeof item.showEditor === 'function' && item.showEditor({ options, encoding, featureFlags }))\n );\n return filteredRow;\n};\n\n/**\n * @method removeEmptyEntries Removes of all entries where the value is null, undefined, and convert nulls in arrays to undefined\n * @param {Object} obj\n */\nconst removeEmptyEntries = obj => {\n const returnObj = cloneDeep(obj);\n forIn(returnObj, (value, key) => {\n if ((value !== null && value !== undefined && Array.isArray(value)) || isPlainObject(value)) {\n returnObj[key] = removeEmptyEntries(returnObj[key]);\n }\n if (Array.isArray(value)) {\n returnObj[key] = value.map(val => (val === null ? undefined : val));\n }\n if (value === null || value === undefined) {\n delete returnObj[key];\n }\n });\n return returnObj;\n};\n\n/**\n * @method getToggleOffValueForDataColors determines the appropriate value when toggling off dataColors\n * @param {Object} config\n * @param {String} config.name - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String} appropriate toggle-off value (empty string or gradient fallback)\n */\nexport const getToggleOffValueForDataColors = ({ name, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!name?.includes('dataColors')) {\n return '';\n }\n\n // Check if this is a choropleth layer by examining the layer configuration\n const isChoroplethLayer = () => {\n // Handle top-level dataColors\n if (name === 'dataColors') {\n return options?.type === 'choropleth' || options?.layerType === 'choropleth';\n }\n\n // Handle nested layer dataColors (e.g., layers[0].dataColors)\n const layerPattern = /^layers\\[(\\d+)\\]\\.dataColors$/;\n const layerMatch = layerPattern.exec(name);\n if (layerMatch) {\n const layerIndex = parseInt(layerMatch[1], 10);\n const layer = options?.layers?.[layerIndex];\n return layer?.type === 'choropleth' || layer?.layerType === 'choropleth';\n }\n\n return false;\n };\n\n // Check if areaValues is available as a data selector\n const hasAreaValuesSelector = dataSelectors.includes('areaValues');\n\n // Return gradient fallback for choropleth layers with areaValues, empty string otherwise\n if (isChoroplethLayer() && hasAreaValuesSelector) {\n return '> areaValues | gradient()';\n }\n\n return '';\n};\n\n/**\n * @method convertEmptyDataColorsForChoropleth handles the conversion of empty dataColors option to gradient fallback for choropleth layers\n * @param {Object} config\n * @param {String} config.option - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Any} config.value - the option value\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String|Any} converted value for choropleth or original value\n */\nexport const convertEmptyDataColorsForChoropleth = ({ option, value, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!option?.includes('dataColors')) {\n return value;\n }\n\n // Only convert empty string values\n if (value !== '') {\n return value;\n }\n\n // Use the toggle-off value logic\n return getToggleOffValueForDataColors({ name: option, options, dataSelectors });\n};\n\n/**\n * @method setOption sets an options value\n * @param {String} option\n * @param {Any} value\n * @param {Object} oldVisualization\n * @param {Object} optionSchema\n * @param {Object} defaultOverrides\n * @param {String[]} dataSelectors - available data selectors for choropleth conversion\n * @returns visualization object with updated options\n */\nexport const setOption = (option, value, oldVisualization, optionSchema, defaultOverrides, dataSelectors) => {\n const obj = {\n ...oldVisualization,\n };\n\n let newOption = option;\n let newValue = value;\n\n // Apply choropleth-specific conversion for empty dataColors\n if (newValue === '' && newOption?.includes('dataColors')) {\n newValue = convertEmptyDataColorsForChoropleth({\n option: newOption,\n value: newValue,\n options: oldVisualization.options,\n dataSelectors,\n });\n }\n\n // Remove from definition if value is null/undefined, and the key is explicitly set in the optionSchema\n if ((newValue === null || newValue === undefined) && optionSchema[newOption]) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n\n // Remove from definition if value is the same as the default from the overrides or the schema\n const schemaDefault = defaultOverrides?.[newOption] ?? optionSchema[newOption]?.default;\n if (typeof schemaDefault !== 'undefined' && newValue === schemaDefault) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n // Copy options\n obj.options = cloneDeep(oldVisualization.options);\n obj.options ??= {};\n // ColumnSelectionEditor returns the option as an object\n // with a key/value pair inside that object with the param value as undefiend\n if ((value === null || value === undefined) && isPlainObject(option) && isPlainObject(option.options)) {\n [newOption] = Object.keys(option.options);\n [newValue] = Object.values(option.options);\n }\n // Select explicitly exposed option first for non arrays / objects\n if (optionSchema[newOption]) {\n if (optionSchema[newOption].type !== 'array') {\n obj.options[newOption] = newValue;\n return obj;\n }\n }\n // Set option using loadash to translate string path like `object.object.key` to target a specific key within nested objects\n if (newValue === null) {\n newValue = undefined;\n }\n set(obj.options, newOption, newValue);\n // Remove any null, undefined, nad nulls from arrays\n obj.options = removeEmptyEntries(obj.options);\n return obj;\n};\n","const TOKEN_NAMESPACE_PREFIX_PATTERN = /(\\w+:)?/.source;\n// ex: token.name|suh (old-style filter chain)\n// ex: token.name|lower|capitalize (new-style filter chain)\nconst TOKEN_NAME_CHARS_PATTERN = /([^$|:]+?)(\\|[|\\w]+)?/.source;\n// ex: $ns:token.name|suh$\nconst TOKEN_PATTERN = /\\$/.source + TOKEN_NAMESPACE_PREFIX_PATTERN + TOKEN_NAME_CHARS_PATTERN + /\\$/.source;\n\nconst TokenRegExp = new RegExp(TOKEN_PATTERN);\n\nexport const hasTokens = value => typeof value === 'string' && TokenRegExp.test(value);\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","export const FLYOUT_PADDING = 21;\nexport const COLUMN_FLYOUT_PADDING = 16;\nexport const FLYOUT_WIDTH = 344;\n\nexport const VERTICAL_EDITOR_SPACING = 16;\n\nexport const DROPDOWN_MENU_WIDTH = 327;\n\nexport const editorStyle = { width: '100%' };\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@babel/runtime/helpers/extends\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/RadioBar\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"lodash/omit\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport RadioBar from '@splunk/react-ui/RadioBar';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst RadioBarEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition,\n labelWidth,\n label,\n isDisabled,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n // TODO: SUI 4.0 renders empty labels differently. Labels should never be empty strings, instead pass\n // a valid label and set hideLabel on ControlGroup\n const controlGroupMarginFix = !label || label === '' ? { marginTop: '-8px' } : undefined;\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n style={controlGroupMarginFix}\n >\n <RadioBar\n data-test={name}\n onChange={handleChange}\n value={value}\n style={editorStyle}\n disabled={disabled}\n >\n {options.map(v => {\n const displayContent = v.label || v.value;\n\n // TODO: Revisit this. SUI supports label with icon, so why doesn't this editor?\n const optionProps = {};\n if (v.icon) {\n // Splunk-UI Button does not support tooltip as of now, so we need to use Tooltip on icon\n optionProps.startAdornment = (\n <Tooltip content={displayContent}>\n <v.icon hideDefaultTooltip />\n </Tooltip>\n );\n } else {\n optionProps.label = displayContent;\n }\n\n return (\n <RadioBar.Option key={v.value} value={v.value} disabled={disabled} {...optionProps} />\n );\n })}\n </RadioBar>\n </ControlGroup>\n );\n};\n\nRadioBarEditor.propTypes = {\n /**\n * Callback when selecting an item from radio bar\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.bool]).isRequired,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.bool]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n};\n\nRadioBarEditor.defaultProps = {\n labelPosition: 'top',\n isDisabled: false,\n};\n\nexport default RadioBarEditor;\n"],"names":["require","getOptions","itemSchema","values","Array","isArray","enum","map","item","value","Error","JSON","stringify","TokenRegExp","RegExp","source","hasTokens","test","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","editorStyle","width","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","RadioBarEditor","onChange","name","isDisabled","options","disabled","handleChange","useCallback","event","v","controlGroupMarginFix","marginTop","React","ControlGroup","RadioBar","displayContent","optionProps","startAdornment","Tooltip","hideDefaultTooltip","_extends","isRequired"],"sourceRoot":""}
@@ -1 +1 @@
1
- {"version":3,"file":"SelectEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/forIn\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/clone\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/isPlainObject\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/set\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/schemaUtils\"","webpack://@splunk/dynamic-editors/./src/utils/EditorFunctions.js","webpack://@splunk/dynamic-editors/./src/utils/token.js","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/dimensionConstants.ts","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Select\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/omit\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/./src/editors/SelectEditor.jsx"],"sourcesContent":["const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/forIn\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/clone\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/isPlainObject\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/set\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/schemaUtils\");","import omit from 'lodash/omit';\nimport forIn from 'lodash/forIn';\nimport cloneDeep from 'lodash/clone';\nimport isPlainObject from 'lodash/isPlainObject';\nimport set from 'lodash/set';\nimport { DYNAMIC_OPTIONS_DSL_PATTERN } from '@splunk/visualizations-shared/schemaUtils';\n\n/**\n * Return values, or parse enum values if values do not exist\n * @param {Object} itemSchema Validation config for an editor item\n * @param {Object[]} values List of predefined { label, value } objects for use by editor\n * @returns {Object[]} List of { label, value } objects for use by editor\n */\nexport const getOptions = (itemSchema, values) => {\n if (Array.isArray(values)) {\n return values;\n }\n\n if (itemSchema && Array.isArray(itemSchema.enum)) {\n return itemSchema.enum.map(item => ({ value: item }));\n }\n\n throw Error(`No valid values provided to editor: ${JSON.stringify(itemSchema)}`);\n};\n\nexport function handleOptionsChange(name, value, options = { debounce: false }) {\n const { visualization } = this.props;\n if (value == null) {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: omit(visualization.options, [name]),\n },\n options\n );\n } else {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: {\n ...visualization.options,\n [name]: value,\n },\n },\n options\n );\n }\n}\n\n/*\n * @method isMultipleRulesSchema\n * @param {Object} itemSchema\n * @returns {Boolean}\n */\nexport const isMultipleRulesSchema = itemSchema => !!itemSchema.anyOf && itemSchema.anyOf.length > 0;\n\n/*\n * @method isDynamicOptionSchema\n * @param {Object} schema\n * @returns {Boolean}\n */\nexport const isDynamicOptionSchema = schema =>\n schema.type === 'string' && schema.pattern === DYNAMIC_OPTIONS_DSL_PATTERN;\n\n/*\n * @method isNestedOption\n * @param {String} optionName\n * @returns {Boolean}\n */\nexport const isNestedOption = optionName => /^\\w+\\[\\d+\\]\\.(.+)$/.test(optionName);\n\n/*\n * @method getStaticItemSchema\n * @param {Object} itemSchema\n * @returns {Object} staticItemSchema\n */\nexport const getStaticItemSchema = itemSchema => {\n if (!isMultipleRulesSchema(itemSchema)) {\n return itemSchema;\n }\n\n const staticSchema = itemSchema.anyOf.find(schema => !isDynamicOptionSchema(schema));\n return { ...omit(itemSchema, 'anyOf'), ...staticSchema };\n};\n\n/**\n * @method getFormatterConfig\n * @param {Object} props\n * @param {Array | Object} [props.contextConfig]\n * @param {Array} props.formatters\n * @param {String} props.formatterFromDSL\n * @param {String} props.selectedDataSelector\n * @returns {Array | Object} the default formatter config of dynamic color editors' fomatter\n */\nexport const getFormatterConfig = ({ contextConfig, formatters, formatterFromDSL, selectedDataSelector }) => {\n if (contextConfig) {\n return contextConfig;\n }\n\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n};\n\n/**\n * @method isSupportedDataSelector\n * @param {Object} config\n * @param {String} config.selectedDataSelector e.g. 'majorValue'\n * @param {Array} config.dataSelectors e.g. [{ label: 'value', value: 'majorValue'}]\n * @returns {Boolean} true if dataSelectors includes selectedDataSelector\n */\nexport const isSupportedDataSelector = ({ selectedDataSelector, dataSelectors }) => {\n if (!selectedDataSelector || !dataSelectors || !dataSelectors.length) {\n return false;\n }\n return dataSelectors.some(ds => ds.value === selectedDataSelector);\n};\n\n/**\n * @method isSupportedFormatter\n * @param {Object} config\n * @param {String} [config.selectedFormatterType] e.g. 'rangeValue'\n * @param {Array} [config.formattersFromEditor] e.g. [{ label: 'rangle', value: 'rangeValue', defaults: {}}]\n * @param {Object} config.supportedFormatters e.g. {rangeValue: {}, matchValue: {}}\n * @returns {Boolean} true if formattersFromEditor includes selectedFormatterType and selectedFormatterType is one of supportedFormatters on editor\n */\nexport const isSupportedFormatter = ({\n selectedFormatterType,\n formattersFromEditor,\n supportedFormatters,\n}) => {\n if (\n !selectedFormatterType ||\n !supportedFormatters[selectedFormatterType] ||\n !formattersFromEditor ||\n !formattersFromEditor.length\n ) {\n return false;\n }\n return formattersFromEditor.some(fm => fm.value === selectedFormatterType);\n};\n\n/**\n * @method getFilteredRowsByShowEditor filters the EditorItem objects which are visible based on showEditor property\n * @param {Object} args\n * @param {Array} args.row\n * @param {Object} args.options // item options\n * @param {Object} args.encoding\n * @param {Object} args.featureFlags\n * @returns array of EditorItem objects or empty array\n */\nexport const getFilteredRowsByShowEditor = ({ row, options, encoding, featureFlags }) => {\n if (!row || !Array.isArray(row)) {\n return [];\n }\n const filteredRow = row.filter(\n item =>\n typeof item.showEditor === 'undefined' ||\n (typeof item.showEditor === 'function' && item.showEditor({ options, encoding, featureFlags }))\n );\n return filteredRow;\n};\n\n/**\n * @method removeEmptyEntries Removes of all entries where the value is null, undefined, and convert nulls in arrays to undefined\n * @param {Object} obj\n */\nconst removeEmptyEntries = obj => {\n const returnObj = cloneDeep(obj);\n forIn(returnObj, (value, key) => {\n if ((value !== null && value !== undefined && Array.isArray(value)) || isPlainObject(value)) {\n returnObj[key] = removeEmptyEntries(returnObj[key]);\n }\n if (Array.isArray(value)) {\n returnObj[key] = value.map(val => (val === null ? undefined : val));\n }\n if (value === null || value === undefined) {\n delete returnObj[key];\n }\n });\n return returnObj;\n};\n\n/**\n * @method setOption sets an options value\n * @param {String} option\n * @param {Any} value\n * @param {Object} oldVisualization\n * @param {Object} optionSchema\n * @returns visualization object with updated options\n */\nexport const setOption = (option, value, oldVisualization, optionSchema, defaultOverrides) => {\n const obj = {\n ...oldVisualization,\n };\n\n let newOption = option;\n let newValue = value;\n\n // Remove from definition if value is null/undefined, and the key is explicitly set in the optionSchema\n if ((newValue === null || newValue === undefined) && optionSchema[newOption]) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n\n // Remove from definition if value is the same as the default from the overrides or the schema\n const schemaDefault = defaultOverrides?.[newOption] ?? optionSchema[newOption]?.default;\n if (typeof schemaDefault !== 'undefined' && newValue === schemaDefault) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n // Copy options\n obj.options = cloneDeep(oldVisualization.options);\n obj.options ??= {};\n // ColumnSelectionEditor returns the option as an object\n // with a key/value pair inside that object with the param value as undefiend\n if ((value === null || value === undefined) && isPlainObject(option) && isPlainObject(option.options)) {\n [newOption] = Object.keys(option.options);\n [newValue] = Object.values(option.options);\n }\n // Select explicitly exposed option first for non arrays / objects\n if (optionSchema[newOption]) {\n if (optionSchema[newOption].type !== 'array') {\n obj.options[newOption] = newValue;\n return obj;\n }\n }\n // Set option using loadash to translate string path like `object.object.key` to target a specific key within nested objects\n if (newValue === null) {\n newValue = undefined;\n }\n set(obj.options, newOption, newValue);\n // Remove any null, undefined, nad nulls from arrays\n obj.options = removeEmptyEntries(obj.options);\n return obj;\n};\n","const TOKEN_NAMESPACE_PREFIX_PATTERN = /(\\w+:)?/.source;\n// ex: token.name|suh (old-style filter chain)\n// ex: token.name|lower|capitalize (new-style filter chain)\nconst TOKEN_NAME_CHARS_PATTERN = /([^$|:]+?)(\\|[|\\w]+)?/.source;\n// ex: $ns:token.name|suh$\nconst TOKEN_PATTERN = /\\$/.source + TOKEN_NAMESPACE_PREFIX_PATTERN + TOKEN_NAME_CHARS_PATTERN + /\\$/.source;\n\nconst TokenRegExp = new RegExp(TOKEN_PATTERN);\n\nexport const hasTokens = value => typeof value === 'string' && TokenRegExp.test(value);\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","export const FLYOUT_PADDING = 21;\nexport const COLUMN_FLYOUT_PADDING = 16;\nexport const FLYOUT_WIDTH = 344;\n\nexport const VERTICAL_EDITOR_SPACING = 16;\n\nexport const DROPDOWN_MENU_WIDTH = 327;\n\nexport const editorStyle = { width: '100%' };\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/Select\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"lodash/omit\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport Select from '@splunk/react-ui/Select';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst SelectEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition,\n labelWidth,\n label,\n tooltip,\n isDisabled,\n isAdvanced,\n hideLabel,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n isAdvanced={isAdvanced}\n hideLabel={hideLabel}\n >\n <Select\n data-test={name}\n onChange={handleChange}\n value={value}\n disabled={disabled}\n style={editorStyle}\n >\n {options.map(v => (\n <Select.Option\n key={v.value}\n value={v.value}\n label={v.label || v.value}\n icon={v.icon ? <v.icon /> : null}\n />\n ))}\n </Select>\n </ControlGroup>\n );\n};\n\nSelectEditor.propTypes = {\n /**\n * Callback when selecting an item from the menu\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.number]).isRequired,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.number]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Text to display in a tooltip next to the label\n */\n tooltip: T.string,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n /**\n * As advanced editor to show advanced config button\n */\n isAdvanced: T.bool,\n /**\n * Disable label of control group\n */\n hideLabel: T.bool,\n};\n\nSelectEditor.defaultProps = {\n labelPosition: 'top',\n isDisabled: false,\n};\n\nexport default SelectEditor;\n"],"names":["require","getOptions","itemSchema","values","Array","isArray","enum","map","item","value","Error","JSON","stringify","TokenRegExp","RegExp","source","hasTokens","test","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","editorStyle","width","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","SelectEditor","onChange","name","isDisabled","options","disabled","handleChange","useCallback","event","v","React","ControlGroup","Select","isRequired"],"sourceRoot":""}
1
+ {"version":3,"file":"SelectEditor.js","mappings":"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","sources":["webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/forIn\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/clone\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/isPlainObject\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/set\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/visualizations-shared/schemaUtils\"","webpack://@splunk/dynamic-editors/./src/utils/EditorFunctions.js","webpack://@splunk/dynamic-editors/./src/utils/token.js","webpack://@splunk/dynamic-editors/./src/shared/AdvancedControlGroup.tsx","webpack://@splunk/dynamic-editors/./src/shared/dimensionConstants.ts","webpack://@splunk/dynamic-editors/external commonjs2 \"@babel/runtime/helpers/defineProperty\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-icons/SlidersDoubleHorizontal\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Button\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/ControlGroup\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Select\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/react-ui/Tooltip\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/themes\"","webpack://@splunk/dynamic-editors/external commonjs2 \"@splunk/ui-utils/i18n\"","webpack://@splunk/dynamic-editors/external commonjs2 \"lodash/omit\"","webpack://@splunk/dynamic-editors/external commonjs2 \"prop-types\"","webpack://@splunk/dynamic-editors/external commonjs2 \"react\"","webpack://@splunk/dynamic-editors/external commonjs2 \"styled-components\"","webpack://@splunk/dynamic-editors/webpack/bootstrap","webpack://@splunk/dynamic-editors/webpack/runtime/compat get default export","webpack://@splunk/dynamic-editors/webpack/runtime/define property getters","webpack://@splunk/dynamic-editors/webpack/runtime/hasOwnProperty shorthand","webpack://@splunk/dynamic-editors/webpack/runtime/make namespace object","webpack://@splunk/dynamic-editors/./src/editors/SelectEditor.jsx"],"sourcesContent":["const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/forIn\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/clone\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/isPlainObject\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"lodash/set\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@splunk/visualizations-shared/schemaUtils\");","import omit from 'lodash/omit';\nimport forIn from 'lodash/forIn';\nimport cloneDeep from 'lodash/clone';\nimport isPlainObject from 'lodash/isPlainObject';\nimport set from 'lodash/set';\nimport { DYNAMIC_OPTIONS_DSL_PATTERN } from '@splunk/visualizations-shared/schemaUtils';\n\n/**\n * Return values, or parse enum values if values do not exist\n * @param {Object} itemSchema Validation config for an editor item\n * @param {Object[]} values List of predefined { label, value } objects for use by editor\n * @returns {Object[]} List of { label, value } objects for use by editor\n */\nexport const getOptions = (itemSchema, values) => {\n if (Array.isArray(values)) {\n return values;\n }\n\n if (itemSchema && Array.isArray(itemSchema.enum)) {\n return itemSchema.enum.map(item => ({ value: item }));\n }\n\n throw Error(`No valid values provided to editor: ${JSON.stringify(itemSchema)}`);\n};\n\nexport function handleOptionsChange(name, value, options = { debounce: false }) {\n const { visualization } = this.props;\n if (value == null) {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: omit(visualization.options, [name]),\n },\n options\n );\n } else {\n this.props.onVisualizationChange(\n {\n ...visualization,\n options: {\n ...visualization.options,\n [name]: value,\n },\n },\n options\n );\n }\n}\n\n/*\n * @method isMultipleRulesSchema\n * @param {Object} itemSchema\n * @returns {Boolean}\n */\nexport const isMultipleRulesSchema = itemSchema => !!itemSchema.anyOf && itemSchema.anyOf.length > 0;\n\n/*\n * @method isDynamicOptionSchema\n * @param {Object} schema\n * @returns {Boolean}\n */\nexport const isDynamicOptionSchema = schema =>\n schema.type === 'string' && schema.pattern === DYNAMIC_OPTIONS_DSL_PATTERN;\n\n/*\n * @method isNestedOption\n * @param {String} optionName\n * @returns {Boolean}\n */\nexport const isNestedOption = optionName => {\n const nestedOptionPattern = /^\\w+\\[\\d+\\]\\.(.+)$/;\n return nestedOptionPattern.exec(optionName) !== null;\n};\n\n/*\n * @method getStaticItemSchema\n * @param {Object} itemSchema\n * @returns {Object} staticItemSchema\n */\nexport const getStaticItemSchema = itemSchema => {\n if (!isMultipleRulesSchema(itemSchema)) {\n return itemSchema;\n }\n\n const staticSchema = itemSchema.anyOf.find(schema => !isDynamicOptionSchema(schema));\n return { ...omit(itemSchema, 'anyOf'), ...staticSchema };\n};\n\n/**\n * @method isContextCompatibleWithFormatter\n * @param {Array | Object} contextConfig\n * @param {String} formatterType\n * @returns {Boolean} true if context structure is compatible with formatter type\n */\nconst isContextCompatibleWithFormatter = (contextConfig, formatterType) => {\n if (!contextConfig || !formatterType) {\n return false;\n }\n\n // Gradient formatter expects an object with 'colors' property\n if (formatterType === 'gradient') {\n return (\n typeof contextConfig === 'object' && !Array.isArray(contextConfig) && 'colors' in contextConfig\n );\n }\n\n // Range/Match formatters expect an array\n if (formatterType === 'rangeValue' || formatterType === 'matchValue') {\n return Array.isArray(contextConfig);\n }\n\n // For unknown formatters, assume compatible to maintain existing behavior\n return true;\n};\n\n/**\n * @method getFormatterConfig\n * @param {Object} props\n * @param {Array | Object} [props.contextConfig]\n * @param {Array} props.formatters\n * @param {String} props.formatterFromDSL\n * @param {String} props.selectedDataSelector\n * @returns {Array | Object} the default formatter config of dynamic color editors' fomatter\n */\nexport const getFormatterConfig = ({ contextConfig, formatters, formatterFromDSL, selectedDataSelector }) => {\n // If no context exists, use default config\n if (!contextConfig) {\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n }\n\n // If no formatter type is provided, return context as-is for backward compatibility\n if (!formatterFromDSL) {\n return contextConfig;\n }\n\n // Check if existing context is compatible with the formatter type\n if (isContextCompatibleWithFormatter(contextConfig, formatterFromDSL)) {\n return contextConfig;\n }\n\n // Context is incompatible, use default config instead\n const currentFormatter = formatters?.find(formatter => formatter.value === formatterFromDSL);\n const formatterConfig = currentFormatter?.defaults?.[selectedDataSelector];\n return formatterConfig || [];\n};\n\n/**\n * @method isSupportedDataSelector\n * @param {Object} config\n * @param {String} config.selectedDataSelector e.g. 'majorValue'\n * @param {Array} config.dataSelectors e.g. [{ label: 'value', value: 'majorValue'}]\n * @returns {Boolean} true if dataSelectors includes selectedDataSelector\n */\nexport const isSupportedDataSelector = ({ selectedDataSelector, dataSelectors }) => {\n if (!selectedDataSelector || !dataSelectors?.length) {\n return false;\n }\n return dataSelectors.some(ds => ds.value === selectedDataSelector);\n};\n\n/**\n * @method isSupportedFormatter\n * @param {Object} config\n * @param {String} [config.selectedFormatterType] e.g. 'rangeValue'\n * @param {Array} [config.formattersFromEditor] e.g. [{ label: 'rangle', value: 'rangeValue', defaults: {}}]\n * @param {Object} config.supportedFormatters e.g. {rangeValue: {}, matchValue: {}}\n * @returns {Boolean} true if formattersFromEditor includes selectedFormatterType and selectedFormatterType is one of supportedFormatters on editor\n */\nexport const isSupportedFormatter = ({\n selectedFormatterType,\n formattersFromEditor,\n supportedFormatters,\n}) => {\n if (\n !selectedFormatterType ||\n !supportedFormatters?.[selectedFormatterType] ||\n !formattersFromEditor?.length\n ) {\n return false;\n }\n return formattersFromEditor.some(fm => fm.value === selectedFormatterType);\n};\n\n/**\n * @method getFilteredRowsByShowEditor filters the EditorItem objects which are visible based on showEditor property\n * @param {Object} args\n * @param {Array} args.row\n * @param {Object} args.options // item options\n * @param {Object} args.encoding\n * @param {Object} args.featureFlags\n * @returns array of EditorItem objects or empty array\n */\nexport const getFilteredRowsByShowEditor = ({ row, options, encoding, featureFlags }) => {\n if (!row || !Array.isArray(row)) {\n return [];\n }\n const filteredRow = row.filter(\n item =>\n typeof item.showEditor === 'undefined' ||\n (typeof item.showEditor === 'function' && item.showEditor({ options, encoding, featureFlags }))\n );\n return filteredRow;\n};\n\n/**\n * @method removeEmptyEntries Removes of all entries where the value is null, undefined, and convert nulls in arrays to undefined\n * @param {Object} obj\n */\nconst removeEmptyEntries = obj => {\n const returnObj = cloneDeep(obj);\n forIn(returnObj, (value, key) => {\n if ((value !== null && value !== undefined && Array.isArray(value)) || isPlainObject(value)) {\n returnObj[key] = removeEmptyEntries(returnObj[key]);\n }\n if (Array.isArray(value)) {\n returnObj[key] = value.map(val => (val === null ? undefined : val));\n }\n if (value === null || value === undefined) {\n delete returnObj[key];\n }\n });\n return returnObj;\n};\n\n/**\n * @method getToggleOffValueForDataColors determines the appropriate value when toggling off dataColors\n * @param {Object} config\n * @param {String} config.name - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String} appropriate toggle-off value (empty string or gradient fallback)\n */\nexport const getToggleOffValueForDataColors = ({ name, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!name?.includes('dataColors')) {\n return '';\n }\n\n // Check if this is a choropleth layer by examining the layer configuration\n const isChoroplethLayer = () => {\n // Handle top-level dataColors\n if (name === 'dataColors') {\n return options?.type === 'choropleth' || options?.layerType === 'choropleth';\n }\n\n // Handle nested layer dataColors (e.g., layers[0].dataColors)\n const layerPattern = /^layers\\[(\\d+)\\]\\.dataColors$/;\n const layerMatch = layerPattern.exec(name);\n if (layerMatch) {\n const layerIndex = parseInt(layerMatch[1], 10);\n const layer = options?.layers?.[layerIndex];\n return layer?.type === 'choropleth' || layer?.layerType === 'choropleth';\n }\n\n return false;\n };\n\n // Check if areaValues is available as a data selector\n const hasAreaValuesSelector = dataSelectors.includes('areaValues');\n\n // Return gradient fallback for choropleth layers with areaValues, empty string otherwise\n if (isChoroplethLayer() && hasAreaValuesSelector) {\n return '> areaValues | gradient()';\n }\n\n return '';\n};\n\n/**\n * @method convertEmptyDataColorsForChoropleth handles the conversion of empty dataColors option to gradient fallback for choropleth layers\n * @param {Object} config\n * @param {String} config.option - the option name (e.g., 'dataColors', 'layers[0].dataColors')\n * @param {Any} config.value - the option value\n * @param {Object} config.options - all visualization options\n * @param {String[]} config.dataSelectors - available data selectors (e.g., ['areaValues'])\n * @returns {String|Any} converted value for choropleth or original value\n */\nexport const convertEmptyDataColorsForChoropleth = ({ option, value, options, dataSelectors = [] }) => {\n // Only process dataColors options\n if (!option?.includes('dataColors')) {\n return value;\n }\n\n // Only convert empty string values\n if (value !== '') {\n return value;\n }\n\n // Use the toggle-off value logic\n return getToggleOffValueForDataColors({ name: option, options, dataSelectors });\n};\n\n/**\n * @method setOption sets an options value\n * @param {String} option\n * @param {Any} value\n * @param {Object} oldVisualization\n * @param {Object} optionSchema\n * @param {Object} defaultOverrides\n * @param {String[]} dataSelectors - available data selectors for choropleth conversion\n * @returns visualization object with updated options\n */\nexport const setOption = (option, value, oldVisualization, optionSchema, defaultOverrides, dataSelectors) => {\n const obj = {\n ...oldVisualization,\n };\n\n let newOption = option;\n let newValue = value;\n\n // Apply choropleth-specific conversion for empty dataColors\n if (newValue === '' && newOption?.includes('dataColors')) {\n newValue = convertEmptyDataColorsForChoropleth({\n option: newOption,\n value: newValue,\n options: oldVisualization.options,\n dataSelectors,\n });\n }\n\n // Remove from definition if value is null/undefined, and the key is explicitly set in the optionSchema\n if ((newValue === null || newValue === undefined) && optionSchema[newOption]) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n\n // Remove from definition if value is the same as the default from the overrides or the schema\n const schemaDefault = defaultOverrides?.[newOption] ?? optionSchema[newOption]?.default;\n if (typeof schemaDefault !== 'undefined' && newValue === schemaDefault) {\n obj.options = omit(oldVisualization.options, newOption);\n return obj;\n }\n // Copy options\n obj.options = cloneDeep(oldVisualization.options);\n obj.options ??= {};\n // ColumnSelectionEditor returns the option as an object\n // with a key/value pair inside that object with the param value as undefiend\n if ((value === null || value === undefined) && isPlainObject(option) && isPlainObject(option.options)) {\n [newOption] = Object.keys(option.options);\n [newValue] = Object.values(option.options);\n }\n // Select explicitly exposed option first for non arrays / objects\n if (optionSchema[newOption]) {\n if (optionSchema[newOption].type !== 'array') {\n obj.options[newOption] = newValue;\n return obj;\n }\n }\n // Set option using loadash to translate string path like `object.object.key` to target a specific key within nested objects\n if (newValue === null) {\n newValue = undefined;\n }\n set(obj.options, newOption, newValue);\n // Remove any null, undefined, nad nulls from arrays\n obj.options = removeEmptyEntries(obj.options);\n return obj;\n};\n","const TOKEN_NAMESPACE_PREFIX_PATTERN = /(\\w+:)?/.source;\n// ex: token.name|suh (old-style filter chain)\n// ex: token.name|lower|capitalize (new-style filter chain)\nconst TOKEN_NAME_CHARS_PATTERN = /([^$|:]+?)(\\|[|\\w]+)?/.source;\n// ex: $ns:token.name|suh$\nconst TOKEN_PATTERN = /\\$/.source + TOKEN_NAMESPACE_PREFIX_PATTERN + TOKEN_NAME_CHARS_PATTERN + /\\$/.source;\n\nconst TokenRegExp = new RegExp(TOKEN_PATTERN);\n\nexport const hasTokens = value => typeof value === 'string' && TokenRegExp.test(value);\n","import React, { Children, cloneElement, ReactElement } from 'react';\nimport * as T from 'prop-types';\nimport styled from 'styled-components';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport AdvancedConfigIcon from '@splunk/react-icons/SlidersDoubleHorizontal';\nimport { variables } from '@splunk/themes';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport Button, { ButtonClickHandler, ButtonProps } from '@splunk/react-ui/Button';\nimport SUIControlGroup, { ControlGroupPropsBase } from '@splunk/react-ui/ControlGroup';\n\ninterface AdvancedControlGroupProps extends Omit<ControlGroupPropsBase, 'splunkTheme'> {\n 'data-test'?: string;\n style?: Record<string, string | number>;\n isAdvanced?: boolean;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n onAdvancedConfigButtonClick?: ButtonClickHandler;\n}\n\ninterface AdvancedConfigButtonProps {\n label?: string;\n onClick?: ButtonClickHandler;\n}\n\n// remove all surrounding margins. let parent add padding\nconst ControlGroupContainer = styled(SUIControlGroup)`\n margin-top: 0;\n padding: 0;\n // adjust bottom margin according to theme\n margin-bottom: ${variables.spacingMedium};\n width: 100%;\n\n // remove top margin of the first component in control group\n &:first-child {\n margin-top: 0;\n }\n\n // remove bottom margin of the last component in control group\n &:last-child {\n margin-bottom: 0;\n }\n // remove top padding on label of the first control group\n [data-test='label']:first-of-type {\n padding-top: 0;\n }\n`;\n\n// override tooltip to set desired config button style\nconst StyledToolTip = styled(Tooltip)`\n display: flex;\n > span {\n display: flex;\n width: 35px;\n }\n`;\n\nconst StyledAdvancedConfigButton = styled(Button)<ButtonProps>`\n color: ${variables.contentColorActive} !important;\n &:hover {\n background-color: ${variables.interactiveColorOverlayDrag} !important;\n }\n`;\n\nexport const AdvancedConfigButton = ({\n label = '',\n onClick,\n}: AdvancedConfigButtonProps): React.ReactElement => {\n return (\n <StyledToolTip\n data-test={`${label}-advanced-config-button-tooltip`}\n content={_('Advanced configurations')}\n >\n <StyledAdvancedConfigButton\n data-test={`${label}-advanced-config-button`}\n icon={<AdvancedConfigIcon data-test={`${label}-advanced-config-button-icon`} />}\n appearance=\"subtle\"\n onClick={onClick}\n />\n </StyledToolTip>\n );\n};\n\nconst AdvancedControlGroup = ({\n 'data-test': dataTest,\n children,\n isAdvanced,\n label,\n hideLabel,\n labelPosition,\n labelWidth,\n tooltip,\n help,\n style,\n error,\n controlsLayout,\n onClick,\n onAdvancedConfigButtonClick,\n}: AdvancedControlGroupProps): React.ReactElement => (\n <ControlGroupContainer\n data-test={dataTest ?? 'control-group'}\n label={label}\n hideLabel={hideLabel}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n help={help}\n error={error}\n style={style}\n onClick={onClick}\n controlsLayout={controlsLayout}\n >\n {isAdvanced\n ? Children.toArray(children)\n .filter(Boolean)\n .map(child =>\n cloneElement(child as ReactElement, {\n style: { flex: 1 },\n })\n )\n : children}\n {isAdvanced ? <AdvancedConfigButton label={label} onClick={onAdvancedConfigButtonClick} /> : null}\n </ControlGroupContainer>\n);\n\nAdvancedControlGroup.propTypes = {\n /**\n * Style overriding SUI ControlGroup\n */\n style: T.object,\n /**\n * Whether the current editor is enabled with advanced configurations\n */\n isAdvanced: T.bool,\n /**\n * Callback for editor click\n */\n onClick: T.func,\n /**\n * Callback for advanced config button click\n */\n onAdvancedConfigButtonClick: T.func,\n};\n\nAdvancedControlGroup.defaultProps = {\n isAdvanced: false,\n};\n\nexport default AdvancedControlGroup;\n","export const FLYOUT_PADDING = 21;\nexport const COLUMN_FLYOUT_PADDING = 16;\nexport const FLYOUT_WIDTH = 344;\n\nexport const VERTICAL_EDITOR_SPACING = 16;\n\nexport const DROPDOWN_MENU_WIDTH = 327;\n\nexport const editorStyle = { width: '100%' };\n","module.exports = require(\"@babel/runtime/helpers/defineProperty\");","module.exports = require(\"@splunk/react-icons/SlidersDoubleHorizontal\");","module.exports = require(\"@splunk/react-ui/Button\");","module.exports = require(\"@splunk/react-ui/ControlGroup\");","module.exports = require(\"@splunk/react-ui/Select\");","module.exports = require(\"@splunk/react-ui/Tooltip\");","module.exports = require(\"@splunk/themes\");","module.exports = require(\"@splunk/ui-utils/i18n\");","module.exports = require(\"lodash/omit\");","module.exports = require(\"prop-types\");","module.exports = require(\"react\");","module.exports = require(\"styled-components\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import React, { useCallback } from 'react';\nimport T from 'prop-types';\nimport Select from '@splunk/react-ui/Select';\nimport { hasTokens } from '../utils/token';\nimport { getOptions } from '../utils/EditorFunctions';\nimport { editorStyle } from '../shared/dimensionConstants';\nimport ControlGroup from '../shared/AdvancedControlGroup';\n\nconst SelectEditor = ({\n onChange,\n name,\n itemSchema,\n values,\n value,\n labelPosition,\n labelWidth,\n label,\n tooltip,\n isDisabled,\n isAdvanced,\n hideLabel,\n}) => {\n const options = getOptions(itemSchema, values);\n const disabled = hasTokens(value) || isDisabled;\n const handleChange = useCallback((event, { value: v }) => onChange(event, name, v), [onChange, name]);\n\n return (\n <ControlGroup\n label={label}\n labelPosition={labelPosition}\n labelWidth={labelWidth}\n tooltip={tooltip}\n isAdvanced={isAdvanced}\n hideLabel={hideLabel}\n >\n <Select\n data-test={name}\n onChange={handleChange}\n value={value}\n disabled={disabled}\n style={editorStyle}\n >\n {options.map(v => (\n <Select.Option\n key={v.value}\n value={v.value}\n label={v.label || v.value}\n icon={v.icon ? <v.icon /> : null}\n />\n ))}\n </Select>\n </ControlGroup>\n );\n};\n\nSelectEditor.propTypes = {\n /**\n * Callback when selecting an item from the menu\n *\n * @param {SyntheticEvent} event The React `SyntheticEvent`\n * @param {string} name The option name\n * @param {string|boolean} value The option value\n */\n onChange: T.func.isRequired,\n /**\n * The option name\n */\n name: T.string.isRequired,\n /**\n * The item JSON schema, it should contain `enum` property. Note this will only be used when `values` prop is undefined\n */\n itemSchema: T.object,\n /**\n * The option values that can be selected\n */\n values: T.arrayOf(\n T.shape({\n label: T.string,\n value: T.oneOfType([T.string, T.number]).isRequired,\n })\n ),\n /**\n * The option value\n */\n value: T.oneOfType([T.string, T.number]),\n /**\n * A human readable label for the option\n */\n label: T.string.isRequired,\n /**\n * Label position\n */\n labelPosition: T.oneOf(['left', 'top']),\n labelWidth: T.number,\n /**\n * Text to display in a tooltip next to the label\n */\n tooltip: T.string,\n /**\n * Disabled state of component\n */\n isDisabled: T.bool,\n /**\n * As advanced editor to show advanced config button\n */\n isAdvanced: T.bool,\n /**\n * Disable label of control group\n */\n hideLabel: T.bool,\n};\n\nSelectEditor.defaultProps = {\n labelPosition: 'top',\n isDisabled: false,\n};\n\nexport default SelectEditor;\n"],"names":["require","getOptions","itemSchema","values","Array","isArray","enum","map","item","value","Error","JSON","stringify","TokenRegExp","RegExp","source","hasTokens","test","ControlGroupContainer","variables","spacingMedium","StyledToolTip","StyledAdvancedConfigButton","contentColorActive","interactiveColorOverlayDrag","AdvancedConfigButton","label","onClick","content","_","icon","appearance","AdvancedControlGroup","dataTest","children","isAdvanced","hideLabel","labelPosition","labelWidth","tooltip","help","style","error","controlsLayout","onAdvancedConfigButtonClick","Children","toArray","filter","Boolean","child","cloneElement","flex","propTypes","T","object","bool","func","defaultProps","editorStyle","width","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","call","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","r","Symbol","toStringTag","SelectEditor","onChange","name","isDisabled","options","disabled","handleChange","useCallback","event","v","React","ControlGroup","Select","isRequired"],"sourceRoot":""}