@looker/run-it 0.9.36 → 0.9.37

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/lib/components/Collapser/CollapserCard.js +5 -2
  3. package/lib/components/Collapser/CollapserCard.js.map +1 -1
  4. package/lib/components/CopyLinkWrapper/CopyLinkWrapper.d.ts +7 -0
  5. package/lib/components/CopyLinkWrapper/CopyLinkWrapper.js +67 -0
  6. package/lib/components/CopyLinkWrapper/CopyLinkWrapper.js.map +1 -0
  7. package/lib/components/CopyLinkWrapper/index.d.ts +1 -0
  8. package/lib/components/CopyLinkWrapper/index.js +14 -0
  9. package/lib/components/CopyLinkWrapper/index.js.map +1 -0
  10. package/lib/components/RequestForm/formUtils.js +6 -19
  11. package/lib/components/RequestForm/formUtils.js.map +1 -1
  12. package/lib/components/ResponseExplorer/ResponseExplorer.js +28 -2
  13. package/lib/components/ResponseExplorer/ResponseExplorer.js.map +1 -1
  14. package/lib/components/index.d.ts +1 -0
  15. package/lib/components/index.js +13 -0
  16. package/lib/components/index.js.map +1 -1
  17. package/lib/esm/components/Collapser/CollapserCard.js +6 -3
  18. package/lib/esm/components/Collapser/CollapserCard.js.map +1 -1
  19. package/lib/esm/components/CopyLinkWrapper/CopyLinkWrapper.js +48 -0
  20. package/lib/esm/components/CopyLinkWrapper/CopyLinkWrapper.js.map +1 -0
  21. package/lib/esm/components/CopyLinkWrapper/index.js +2 -0
  22. package/lib/esm/components/CopyLinkWrapper/index.js.map +1 -0
  23. package/lib/esm/components/RequestForm/formUtils.js +7 -19
  24. package/lib/esm/components/RequestForm/formUtils.js.map +1 -1
  25. package/lib/esm/components/ResponseExplorer/ResponseExplorer.js +23 -3
  26. package/lib/esm/components/ResponseExplorer/ResponseExplorer.js.map +1 -1
  27. package/lib/esm/components/index.js +1 -0
  28. package/lib/esm/components/index.js.map +1 -1
  29. package/package.json +10 -11
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ### [0.9.37](https://www.github.com/looker-open-source/sdk-codegen/compare/run-it-v0.9.36...run-it-v0.9.37) (2022-09-21)
4
+
5
+
6
+ ### Features
7
+
8
+ * copy link button for search ([#1120](https://www.github.com/looker-open-source/sdk-codegen/issues/1120)) ([d6e0c37](https://www.github.com/looker-open-source/sdk-codegen/commit/d6e0c37ae36b1ff4129cf3bb30f8462f4aa49b0d))
9
+ * error document retrieval in API Explorer ([#1161](https://www.github.com/looker-open-source/sdk-codegen/issues/1161)) ([89a94e1](https://www.github.com/looker-open-source/sdk-codegen/commit/89a94e167b8a3e1aa662c0b5de7c585b3eac2f13))
10
+
11
+
12
+ ### Bug Fixes
13
+
14
+ * whitespace under CollapserCard child components ([#1162](https://www.github.com/looker-open-source/sdk-codegen/issues/1162)) ([89fbf29](https://www.github.com/looker-open-source/sdk-codegen/commit/89fbf2911701b598bf9d673cef00e790a1bc8207))
15
+
16
+
17
+ ### Dependencies
18
+
19
+ * The following workspace dependencies were updated
20
+ * dependencies
21
+ * @looker/code-editor bumped from ^0.1.23 to ^0.1.24
22
+ * @looker/extension-utils bumped from ^0.1.13 to ^0.1.14
23
+ * @looker/sdk bumped from ^22.10.1 to ^22.12.1
24
+ * @looker/sdk-codegen bumped from ^21.7.0 to ^21.7.1
25
+ * @looker/sdk-rtl bumped from ^21.3.4 to ^21.4.0
26
+
3
27
  ### [0.9.36](https://www.github.com/looker-open-source/sdk-codegen/compare/run-it-v0.9.35...run-it-v0.9.36) (2022-07-29)
4
28
 
5
29
 
@@ -527,4 +551,4 @@
527
551
  * @looker/sdk bumped from ^21.0.10 to ^21.4.0
528
552
  * @looker/sdk-codegen bumped from ^21.0.10 to ^21.0.11
529
553
  * @looker/sdk-codegen-utils bumped from ^21.0.10 to ^21.0.11
530
- * @looker/sdk-rtl bumped from ^21.0.10 to ^21.0.11
554
+ * @looker/sdk-rtl bumped from ^21.0.10 to ^21.0.11
@@ -30,7 +30,10 @@ var CollapserCard = _ref => {
30
30
  value,
31
31
  toggle
32
32
  } = (0, _components.useToggle)(defaultOpen);
33
- return _react.default.createElement(_react.default.Fragment, null, divider && _react.default.createElement(_components.Divider, {
33
+ return _react.default.createElement(_components.Box2, {
34
+ display: "flex",
35
+ flexDirection: "column"
36
+ }, divider && _react.default.createElement(_components.Divider, {
34
37
  appearance: "light"
35
38
  }), _react.default.createElement(_components.Accordion2, {
36
39
  id: id,
@@ -44,7 +47,7 @@ var CollapserCard = _ref => {
44
47
  label: _react.default.createElement(_common.RunItHeading, {
45
48
  as: level
46
49
  }, heading)
47
- }, _react.default.createElement(_components.Box, {
50
+ }, _react.default.createElement(_components.Box2, {
48
51
  pb: "xlarge"
49
52
  }, children)));
50
53
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Collapser/CollapserCard.tsx"],"names":["CollapserCard","id","heading","children","defaultOpen","divider","level","value","toggle","close","open"],"mappings":";;;;;;;AA0BA;;AACA;;AACA;;AACA;;AACA;;;;AAaO,IAAMA,aAAqC,GAAG,QAM/C;AAAA,MANgD;AACpDC,IAAAA,EADoD;AAEpDC,IAAAA,OAFoD;AAGpDC,IAAAA,QAHoD;AAIpDC,IAAAA,WAAW,GAAG,IAJsC;AAKpDC,IAAAA,OAAO,GAAG;AAL0C,GAMhD;AACJ,MAAMC,KAAK,GAAGD,OAAO,GAAG,IAAH,GAAU,IAA/B;AACA,MAAM;AAAEE,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAoB,2BAAUJ,WAAV,CAA1B;AAEA,SACE,4DACGC,OAAO,IAAI,6BAAC,mBAAD;AAAS,IAAA,UAAU,EAAC;AAApB,IADd,EAEE,6BAAC,sBAAD;AACE,IAAA,EAAE,EAAEJ,EADN;AAEE,IAAA,iBAAiB,EAAC,MAFpB;AAGE,IAAA,MAAM,EAAEM,KAHV;AAIE,IAAA,UAAU,EAAEC,MAJd;AAKE,IAAA,cAAc,EAAE;AAAEC,MAAAA,KAAK,EAAE,6BAAC,sBAAD,OAAT;AAAyBC,MAAAA,IAAI,EAAE,6BAAC,4BAAD;AAA/B,KALlB;AAME,IAAA,KAAK,EAAE,6BAAC,oBAAD;AAAc,MAAA,EAAE,EAAEJ;AAAlB,OAA0BJ,OAA1B;AANT,KAQE,6BAAC,eAAD;AAAK,IAAA,EAAE,EAAC;AAAR,KAAkBC,QAAlB,CARF,CAFF,CADF;AAeD,CAzBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { FC, ReactElement } from 'react'\nimport React from 'react'\nimport { useToggle, Accordion2, Divider, Box } from '@looker/components'\nimport { ArrowRight } from '@styled-icons/material/ArrowRight'\nimport { ArrowDropDown } from '@styled-icons/material/ArrowDropDown'\nimport { RunItHeading } from '../common'\n\ninterface CollapserCardProps {\n id?: string\n heading: string\n children: ReactElement\n defaultOpen?: boolean\n divider?: boolean\n}\n\n/**\n * Render a collapsable header and children\n */\nexport const CollapserCard: FC<CollapserCardProps> = ({\n id,\n heading,\n children,\n defaultOpen = true,\n divider = true,\n}) => {\n const level = divider ? 'h3' : 'h4'\n const { value, toggle } = useToggle(defaultOpen)\n\n return (\n <>\n {divider && <Divider appearance=\"light\" />}\n <Accordion2\n id={id}\n indicatorPosition=\"left\"\n isOpen={value}\n toggleOpen={toggle}\n indicatorIcons={{ close: <ArrowRight />, open: <ArrowDropDown /> }}\n label={<RunItHeading as={level}>{heading}</RunItHeading>}\n >\n <Box pb=\"xlarge\">{children}</Box>\n </Accordion2>\n </>\n )\n}\n"],"file":"CollapserCard.js"}
1
+ {"version":3,"sources":["../../../src/components/Collapser/CollapserCard.tsx"],"names":["CollapserCard","id","heading","children","defaultOpen","divider","level","value","toggle","close","open"],"mappings":";;;;;;;AA0BA;;AACA;;AACA;;AACA;;AAEA;;;;AAaO,IAAMA,aAAqC,GAAG,QAM/C;AAAA,MANgD;AACpDC,IAAAA,EADoD;AAEpDC,IAAAA,OAFoD;AAGpDC,IAAAA,QAHoD;AAIpDC,IAAAA,WAAW,GAAG,IAJsC;AAKpDC,IAAAA,OAAO,GAAG;AAL0C,GAMhD;AACJ,MAAMC,KAAK,GAAGD,OAAO,GAAG,IAAH,GAAU,IAA/B;AACA,MAAM;AAAEE,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAoB,2BAAUJ,WAAV,CAA1B;AAEA,SACE,6BAAC,gBAAD;AAAM,IAAA,OAAO,EAAC,MAAd;AAAqB,IAAA,aAAa,EAAC;AAAnC,KACGC,OAAO,IAAI,6BAAC,mBAAD;AAAS,IAAA,UAAU,EAAC;AAApB,IADd,EAEE,6BAAC,sBAAD;AACE,IAAA,EAAE,EAAEJ,EADN;AAEE,IAAA,iBAAiB,EAAC,MAFpB;AAGE,IAAA,MAAM,EAAEM,KAHV;AAIE,IAAA,UAAU,EAAEC,MAJd;AAKE,IAAA,cAAc,EAAE;AAAEC,MAAAA,KAAK,EAAE,6BAAC,sBAAD,OAAT;AAAyBC,MAAAA,IAAI,EAAE,6BAAC,4BAAD;AAA/B,KALlB;AAME,IAAA,KAAK,EAAE,6BAAC,oBAAD;AAAc,MAAA,EAAE,EAAEJ;AAAlB,OAA0BJ,OAA1B;AANT,KAQE,6BAAC,gBAAD;AAAM,IAAA,EAAE,EAAC;AAAT,KAAmBC,QAAnB,CARF,CAFF,CADF;AAeD,CAzBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { FC, ReactElement } from 'react'\nimport React from 'react'\nimport { useToggle, Accordion2, Divider, Box2 } from '@looker/components'\nimport { ArrowRight } from '@styled-icons/material/ArrowRight'\nimport { ArrowDropDown } from '@styled-icons/material/ArrowDropDown'\n\nimport { RunItHeading } from '../common'\n\ninterface CollapserCardProps {\n id?: string\n heading: string\n children: ReactElement\n defaultOpen?: boolean\n divider?: boolean\n}\n\n/**\n * Render a collapsable header and children\n */\nexport const CollapserCard: FC<CollapserCardProps> = ({\n id,\n heading,\n children,\n defaultOpen = true,\n divider = true,\n}) => {\n const level = divider ? 'h3' : 'h4'\n const { value, toggle } = useToggle(defaultOpen)\n\n return (\n <Box2 display=\"flex\" flexDirection=\"column\">\n {divider && <Divider appearance=\"light\" />}\n <Accordion2\n id={id}\n indicatorPosition=\"left\"\n isOpen={value}\n toggleOpen={toggle}\n indicatorIcons={{ close: <ArrowRight />, open: <ArrowDropDown /> }}\n label={<RunItHeading as={level}>{heading}</RunItHeading>}\n >\n <Box2 pb=\"xlarge\">{children}</Box2>\n </Accordion2>\n </Box2>\n )\n}\n"],"file":"CollapserCard.js"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode, ReactNodeArray } from 'react';
2
+ interface CopyLinkWrapperProps {
3
+ children: ReactNode | ReactNodeArray;
4
+ visible?: boolean;
5
+ }
6
+ export declare const CopyLinkWrapper: ({ children, visible, }: CopyLinkWrapperProps) => JSX.Element;
7
+ export {};
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CopyLinkWrapper = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _components = require("@looker/components");
11
+
12
+ var _Link = require("@styled-icons/material-outlined/Link");
13
+
14
+ var _extensionUtils = require("@looker/extension-utils");
15
+
16
+ var _reactRouterDom = require("react-router-dom");
17
+
18
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+
20
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
21
+
22
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
23
+
24
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
25
+
26
+ var COPY_TO_CLIPBOARD = 'Copy to clipboard';
27
+
28
+ var CopyLinkWrapper = _ref => {
29
+ var {
30
+ children,
31
+ visible = true
32
+ } = _ref;
33
+ var [tooltipContent, setTooltipContent] = (0, _react.useState)(COPY_TO_CLIPBOARD);
34
+ var [showCopyLinkButton, setShowCopyLinkButton] = (0, _react.useState)(false);
35
+ var location = (0, _reactRouterDom.useLocation)();
36
+
37
+ var handleCopyLink = function () {
38
+ var _ref2 = _asyncToGenerator(function* () {
39
+ yield (0, _extensionUtils.getEnvAdaptor)().copyToClipboard(location);
40
+ setTooltipContent('Copied to clipboard');
41
+ });
42
+
43
+ return function handleCopyLink() {
44
+ return _ref2.apply(this, arguments);
45
+ };
46
+ }();
47
+
48
+ var handleMouseLeave = () => {
49
+ setTooltipContent(COPY_TO_CLIPBOARD);
50
+ };
51
+
52
+ return _react.default.createElement(_components.Space, {
53
+ width: '100%',
54
+ onMouseEnter: () => setShowCopyLinkButton(true),
55
+ onMouseLeave: () => setShowCopyLinkButton(false)
56
+ }, children, showCopyLinkButton && visible && _react.default.createElement(_components.IconButton, {
57
+ onClick: handleCopyLink,
58
+ icon: _react.default.createElement(_Link.Link, null),
59
+ size: "small",
60
+ label: tooltipContent,
61
+ tooltipPlacement: "bottom",
62
+ onMouseLeave: handleMouseLeave
63
+ }));
64
+ };
65
+
66
+ exports.CopyLinkWrapper = CopyLinkWrapper;
67
+ //# sourceMappingURL=CopyLinkWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/CopyLinkWrapper/CopyLinkWrapper.tsx"],"names":["COPY_TO_CLIPBOARD","CopyLinkWrapper","children","visible","tooltipContent","setTooltipContent","showCopyLinkButton","setShowCopyLinkButton","location","handleCopyLink","copyToClipboard","handleMouseLeave"],"mappings":";;;;;;;AA0BA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;AAOA,IAAMA,iBAAiB,GAAG,mBAA1B;;AAQO,IAAMC,eAAe,GAAG,QAGH;AAAA,MAHI;AAC9BC,IAAAA,QAD8B;AAE9BC,IAAAA,OAAO,GAAG;AAFoB,GAGJ;AAC1B,MAAM,CAACC,cAAD,EAAiBC,iBAAjB,IAAsC,qBAASL,iBAAT,CAA5C;AACA,MAAM,CAACM,kBAAD,EAAqBC,qBAArB,IAA8C,qBAAS,KAAT,CAApD;AACA,MAAMC,QAAQ,GAAG,kCAAjB;;AACA,MAAMC,cAAc;AAAA,kCAAG,aAAY;AACjC,YAAM,qCAAgBC,eAAhB,CAAgCF,QAAhC,CAAN;AACAH,MAAAA,iBAAiB,CAAC,qBAAD,CAAjB;AACD,KAHmB;;AAAA,oBAAdI,cAAc;AAAA;AAAA;AAAA,KAApB;;AAIA,MAAME,gBAAgB,GAAG,MAAM;AAC7BN,IAAAA,iBAAiB,CAACL,iBAAD,CAAjB;AACD,GAFD;;AAGA,SACE,6BAAC,iBAAD;AACE,IAAA,KAAK,EAAE,MADT;AAEE,IAAA,YAAY,EAAE,MAAMO,qBAAqB,CAAC,IAAD,CAF3C;AAGE,IAAA,YAAY,EAAE,MAAMA,qBAAqB,CAAC,KAAD;AAH3C,KAKGL,QALH,EAMGI,kBAAkB,IAAIH,OAAtB,IACC,6BAAC,sBAAD;AACE,IAAA,OAAO,EAAEM,cADX;AAEE,IAAA,IAAI,EAAE,6BAAC,UAAD,OAFR;AAGE,IAAA,IAAI,EAAC,OAHP;AAIE,IAAA,KAAK,EAAEL,cAJT;AAKE,IAAA,gBAAgB,EAAC,QALnB;AAME,IAAA,YAAY,EAAEO;AANhB,IAPJ,CADF;AAmBD,CAjCM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { ReactNode, ReactNodeArray } from 'react'\nimport React, { useState } from 'react'\nimport { IconButton, Space } from '@looker/components'\nimport { Link } from '@styled-icons/material-outlined/Link'\nimport { getEnvAdaptor } from '@looker/extension-utils'\nimport { useLocation } from 'react-router-dom'\n\ninterface CopyLinkWrapperProps {\n children: ReactNode | ReactNodeArray\n visible?: boolean\n}\n\nconst COPY_TO_CLIPBOARD = 'Copy to clipboard'\n\n/**\n * Displays a copy link button on hover\n *\n * @param children component(s) which will render left of the button\n * @param visible boolean determining button visibility\n */\nexport const CopyLinkWrapper = ({\n children,\n visible = true,\n}: CopyLinkWrapperProps) => {\n const [tooltipContent, setTooltipContent] = useState(COPY_TO_CLIPBOARD)\n const [showCopyLinkButton, setShowCopyLinkButton] = useState(false)\n const location = useLocation()\n const handleCopyLink = async () => {\n await getEnvAdaptor().copyToClipboard(location)\n setTooltipContent('Copied to clipboard')\n }\n const handleMouseLeave = () => {\n setTooltipContent(COPY_TO_CLIPBOARD)\n }\n return (\n <Space\n width={'100%'}\n onMouseEnter={() => setShowCopyLinkButton(true)}\n onMouseLeave={() => setShowCopyLinkButton(false)}\n >\n {children}\n {showCopyLinkButton && visible && (\n <IconButton\n onClick={handleCopyLink}\n icon={<Link />}\n size=\"small\"\n label={tooltipContent}\n tooltipPlacement=\"bottom\"\n onMouseLeave={handleMouseLeave}\n />\n )}\n </Space>\n )\n}\n"],"file":"CopyLinkWrapper.js"}
@@ -0,0 +1 @@
1
+ export { CopyLinkWrapper } from './CopyLinkWrapper';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CopyLinkWrapper", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _CopyLinkWrapper.CopyLinkWrapper;
10
+ }
11
+ });
12
+
13
+ var _CopyLinkWrapper = require("./CopyLinkWrapper");
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/CopyLinkWrapper/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAyBA","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nexport { CopyLinkWrapper } from './CopyLinkWrapper'\n"],"file":"index.js"}
@@ -11,8 +11,6 @@ var _components = require("@looker/components");
11
11
 
12
12
  var _material = require("@styled-icons/material");
13
13
 
14
- var _componentsDate = require("@looker/components-date");
15
-
16
14
  var _codeEditor = require("@looker/code-editor");
17
15
 
18
16
  var _FormItem = require("./FormItem");
@@ -31,23 +29,12 @@ var createDateItem = (name, handleChange, requestContent) => _react.default.crea
31
29
  key: "".concat(name, "_fid"),
32
30
  id: name,
33
31
  label: name
34
- }, _react.default.createElement(_components.Popover, {
35
- key: "".concat(name, "_pop"),
36
- placement: "bottom-start",
37
- content: _react.default.createElement(_components.Box, {
38
- key: "".concat(name, "_popbox"),
39
- p: "u3"
40
- }, _react.default.createElement(_componentsDate.InputDate, {
41
- key: "datepick_".concat(name),
42
- defaultValue: name in requestContent ? requestContent[name] : undefined,
43
- onChange: handleChange.bind(null, name)
44
- }))
45
- }, _react.default.createElement(_components.ButtonOutline, {
46
- type: "button",
47
- key: "".concat(name, "_pop_button")
48
- }, name in requestContent ? _react.default.createElement(_componentsDate.DateFormat, {
49
- key: "".concat(name, "_dateformat")
50
- }, name in requestContent ? requestContent[name] : undefined) : 'Choose')));
32
+ }, _react.default.createElement(_components.InputDate, {
33
+ key: "datepick_".concat(name),
34
+ "data-testid": "datepick_".concat(name),
35
+ defaultValue: name in requestContent ? requestContent[name] : undefined,
36
+ onChange: handleChange.bind(null, name)
37
+ }));
51
38
 
52
39
  var createBoolItem = (name, description, handleChange, requestContent) => _react.default.createElement(_FormItem.FormItem, {
53
40
  key: "".concat(name, "_fib"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/RequestForm/formUtils.tsx"],"names":["createDateItem","name","handleChange","requestContent","undefined","bind","createBoolItem","description","inputTextType","type","createItem","required","placeholder","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","showDataChangeWarning","updateNullableProp","state","key","newValue","updatedState","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","size","Array","from","join"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react'\nimport React, { Fragment } from 'react'\nimport {\n ToggleSwitch,\n Label,\n FieldCheckbox,\n ButtonOutline,\n Box,\n Popover,\n InputText,\n Tooltip,\n Icon,\n Space,\n} from '@looker/components'\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material'\nimport { DateFormat, InputDate } from '@looker/components-date'\nimport { CodeEditor } from '@looker/code-editor'\nimport type { RunItInput, RunItValues } from '../../RunIt'\nimport { FormItem } from './FormItem'\n\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <Popover\n key={`${name}_pop`}\n placement=\"bottom-start\"\n content={\n <Box key={`${name}_popbox`} p=\"u3\">\n <InputDate\n key={`datepick_${name}`}\n defaultValue={\n name in requestContent ? requestContent[name] : undefined\n }\n onChange={handleChange.bind(null, name)}\n />\n </Box>\n }\n >\n <ButtonOutline type=\"button\" key={`${name}_pop_button`}>\n {name in requestContent ? (\n <DateFormat key={`${name}_dateformat`}>\n {name in requestContent ? requestContent[name] : undefined}\n </DateFormat>\n ) : (\n 'Choose'\n )}\n </ButtonOutline>\n </Popover>\n </FormItem>\n)\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n)\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number'\n case 'email':\n return 'email'\n case 'password':\n return 'password'\n default:\n return 'text'\n }\n}\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n)\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n )\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n )\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n )\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n )\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent)\n default:\n return <Fragment key={input.name}></Fragment>\n }\n}\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name]\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2)\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content=\"Empty values are automatically removed from the request.\">\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n )\n}\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n)\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state }\n if (key in state && !newValue) {\n delete updatedState[key]\n } else {\n updatedState[key] = newValue\n }\n return updatedState\n}\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = ''\n if (!body) return result\n const args = body.split('&')\n args.forEach((arg) => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i\n if (!formArg.test(arg)) {\n result += ` ${arg}`\n }\n })\n return result.trim()\n}\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed\n\n let result = ''\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body)\n } catch (e: any) {\n result = e.message\n }\n } else {\n result = validateEncodedValues(body)\n }\n if (result) {\n result = `Syntax error in the body: ${result}`\n }\n } else {\n parsed = body\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys)\n const keys = new Set<string>(Object.keys(parsed))\n const missing = new Set<string>([...required].filter((k) => !keys.has(k)))\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`\n }\n }\n return result\n}\n"],"file":"formUtils.js"}
1
+ {"version":3,"sources":["../../../src/components/RequestForm/formUtils.tsx"],"names":["createDateItem","name","handleChange","requestContent","undefined","bind","createBoolItem","description","inputTextType","type","createItem","required","placeholder","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","showDataChangeWarning","updateNullableProp","state","key","newValue","updatedState","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","size","Array","from","join"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react'\nimport React, { Fragment } from 'react'\nimport {\n ToggleSwitch,\n Label,\n FieldCheckbox,\n InputText,\n Tooltip,\n Icon,\n InputDate,\n Space,\n} from '@looker/components'\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material'\nimport { CodeEditor } from '@looker/code-editor'\nimport type { RunItInput, RunItValues } from '../../RunIt'\nimport { FormItem } from './FormItem'\n\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <InputDate\n key={`datepick_${name}`}\n data-testid={`datepick_${name}`}\n defaultValue={name in requestContent ? requestContent[name] : undefined}\n onChange={handleChange.bind(null, name)}\n />\n </FormItem>\n)\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n)\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number'\n case 'email':\n return 'email'\n case 'password':\n return 'password'\n default:\n return 'text'\n }\n}\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n)\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n )\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n )\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n )\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n )\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent)\n default:\n return <Fragment key={input.name}></Fragment>\n }\n}\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name]\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2)\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content=\"Empty values are automatically removed from the request.\">\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n )\n}\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n)\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state }\n if (key in state && !newValue) {\n delete updatedState[key]\n } else {\n updatedState[key] = newValue\n }\n return updatedState\n}\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = ''\n if (!body) return result\n const args = body.split('&')\n args.forEach((arg) => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i\n if (!formArg.test(arg)) {\n result += ` ${arg}`\n }\n })\n return result.trim()\n}\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed\n\n let result = ''\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body)\n } catch (e: any) {\n result = e.message\n }\n } else {\n result = validateEncodedValues(body)\n }\n if (result) {\n result = `Syntax error in the body: ${result}`\n }\n } else {\n parsed = body\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys)\n const keys = new Set<string>(Object.keys(parsed))\n const missing = new Set<string>([...required].filter((k) => !keys.has(k)))\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`\n }\n }\n return result\n}\n"],"file":"formUtils.js"}
@@ -5,12 +5,16 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ResponseExplorer = exports.ResponseHeaders = void 0;
7
7
 
8
- var _react = _interopRequireDefault(require("react"));
8
+ var _react = _interopRequireWildcard(require("react"));
9
9
 
10
10
  var _components = require("@looker/components");
11
11
 
12
12
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
 
14
+ var _Warning = require("@styled-icons/material/Warning");
15
+
16
+ var _extensionUtils = require("@looker/extension-utils");
17
+
14
18
  var _ShowResponse = require("../ShowResponse");
15
19
 
16
20
  var _Collapser = require("../Collapser");
@@ -19,6 +23,10 @@ var _common = require("../common");
19
23
 
20
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
25
 
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
22
30
  var getHeaders = response => {
23
31
  if (!(response !== null && response !== void 0 && response.headers)) return [];
24
32
  var result = [];
@@ -75,14 +83,32 @@ var ResponseExplorer = _ref4 => {
75
83
  verb,
76
84
  path
77
85
  } = _ref4;
86
+ var [isOpen, setIsOpen] = (0, _react.useState)(false);
87
+ var error = response && response.statusCode >= 400 && response.contentType === 'application/json' ? JSON.parse(response.body) : undefined;
78
88
  return _react.default.createElement(_react.default.Fragment, null, !response && _react.default.createElement(_common.DarkSpan, null, "No response was received"), response && _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_common.RunItHeading, {
79
89
  as: "h4"
80
- }, "".concat(verb || '', " ").concat(path || '', " (").concat(response.statusCode, ": ").concat(response.statusMessage, ")")), _react.default.createElement(_Collapser.CollapserCard, {
90
+ }, error && _react.default.createElement(_react.default.Fragment, null, _react.default.createElement(_extensionUtils.APIErrorDialog, {
91
+ error: error,
92
+ isOpen: isOpen,
93
+ setOpen: setIsOpen
94
+ }), _react.default.createElement(_components.IconButton, {
95
+ size: "small",
96
+ onClick: () => setIsOpen(true),
97
+ icon: _react.default.createElement(_Warning.Warning, null),
98
+ "aria-label": "API error",
99
+ label: "API Error"
100
+ })), "".concat(verb || '', " ").concat(path || '', " (").concat(response.statusCode, ": ").concat(response.statusMessage, ")")), _react.default.createElement(_Collapser.CollapserCard, {
81
101
  divider: false,
82
102
  heading: "Body (".concat(getBodySize(response), ")"),
83
103
  id: "body"
84
104
  }, _react.default.createElement(_ShowResponse.ShowResponse, {
85
105
  response: response
106
+ })), error && _react.default.createElement(_Collapser.CollapserCard, {
107
+ divider: false,
108
+ heading: 'Error information'
109
+ }, _react.default.createElement(_extensionUtils.APIErrorDisplay, {
110
+ error: error,
111
+ showDoc: true
86
112
  })), _react.default.createElement(ResponseHeaders, {
87
113
  response: response
88
114
  })));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"names":["getHeaders","response","headers","result","Object","entries","forEach","key","val","push","getBodySize","size","body","Blob","toString","length","NoWrap","Span","ResponseHeaders","rows","map","value","ResponseExplorer","verb","path","statusCode","statusMessage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React from 'react'\nimport {\n Table,\n TableBody,\n TableRow,\n TableDataCell,\n Span,\n TableHead,\n TableHeaderCell,\n} from '@looker/components'\nimport styled from 'styled-components'\nimport type { IRawResponse } from '@looker/sdk-rtl'\nimport { ShowResponse } from '../ShowResponse'\nimport { CollapserCard } from '../Collapser'\nimport { DarkSpan, RunItHeading } from '../common'\n\ntype HeaderTable = string[][]\nexport type ResponseContent = IRawResponse | undefined\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return []\n const result: HeaderTable = []\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n )\n return result\n}\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length\n\n return `${size} bytes`\n}\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`\n\ninterface ShowHeadersProps {\n response: ResponseContent\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response)\n if (rows.length === 0) return <></>\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n )\n}\n\ninterface ResponseExplorerProps {\n response: ResponseContent\n verb: string\n path: string\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n // TODO make a badge for the verb.\n // Once we are satisfied with the badge in the api-explorer package it should be moved here\n\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n })`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n )\n}\n"],"file":"ResponseExplorer.js"}
1
+ {"version":3,"sources":["../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"names":["getHeaders","response","headers","result","Object","entries","forEach","key","val","push","getBodySize","size","body","Blob","toString","length","NoWrap","Span","ResponseHeaders","rows","map","value","ResponseExplorer","verb","path","isOpen","setIsOpen","error","statusCode","contentType","JSON","parse","undefined","statusMessage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React, { useState } from 'react'\nimport {\n Table,\n TableBody,\n TableRow,\n TableDataCell,\n Span,\n TableHead,\n TableHeaderCell,\n IconButton,\n} from '@looker/components'\nimport styled from 'styled-components'\nimport type { IRawResponse, LookerSDKError } from '@looker/sdk-rtl'\nimport { Warning } from '@styled-icons/material/Warning'\nimport { APIErrorDialog, APIErrorDisplay } from '@looker/extension-utils'\nimport { ShowResponse } from '../ShowResponse'\nimport { CollapserCard } from '../Collapser'\nimport { DarkSpan, RunItHeading } from '../common'\n\ntype HeaderTable = string[][]\nexport type ResponseContent = IRawResponse | undefined\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return []\n const result: HeaderTable = []\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n )\n return result\n}\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length\n\n return `${size} bytes`\n}\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`\n\ninterface ShowHeadersProps {\n response: ResponseContent\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response)\n if (rows.length === 0) return <></>\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n )\n}\n\ninterface ResponseExplorerProps {\n response: ResponseContent\n verb: string\n path: string\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const error: LookerSDKError =\n response &&\n response.statusCode >= 400 &&\n response.contentType === 'application/json'\n ? JSON.parse(response.body)\n : undefined\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {error && (\n <>\n <APIErrorDialog\n error={error}\n isOpen={isOpen}\n setOpen={setIsOpen}\n />\n <IconButton\n size=\"small\"\n onClick={() => setIsOpen(true)}\n icon={<Warning />}\n aria-label=\"API error\"\n label=\"API Error\"\n />\n </>\n )}\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n })`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n {error && (\n <CollapserCard divider={false} heading={'Error information'}>\n <APIErrorDisplay error={error} showDoc={true} />\n </CollapserCard>\n )}\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n )\n}\n"],"file":"ResponseExplorer.js"}
@@ -1,6 +1,7 @@
1
1
  export * from './common';
2
2
  export * from './Collapser';
3
3
  export * from './ConfigForm';
4
+ export * from './CopyLinkWrapper';
4
5
  export * from './DocSdkCalls';
5
6
  export * from './DataGrid';
6
7
  export * from './LoginForm';
@@ -43,6 +43,19 @@ Object.keys(_ConfigForm).forEach(function (key) {
43
43
  });
44
44
  });
45
45
 
46
+ var _CopyLinkWrapper = require("./CopyLinkWrapper");
47
+
48
+ Object.keys(_CopyLinkWrapper).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (key in exports && exports[key] === _CopyLinkWrapper[key]) return;
51
+ Object.defineProperty(exports, key, {
52
+ enumerable: true,
53
+ get: function get() {
54
+ return _CopyLinkWrapper[key];
55
+ }
56
+ });
57
+ });
58
+
46
59
  var _DocSdkCalls = require("./DocSdkCalls");
47
60
 
48
61
  Object.keys(_DocSdkCalls).forEach(function (key) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/index.ts"],"names":[],"mappings":";;;;;;AA0BA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './common'\nexport * from './Collapser'\nexport * from './ConfigForm'\nexport * from './DocSdkCalls'\nexport * from './DataGrid'\nexport * from './LoginForm'\nexport * from './Loading'\nexport * from './MethodBadge'\nexport * from './PerfTracker'\nexport * from './RequestForm'\nexport * from './ResponseExplorer'\nexport * from './ShowResponse'\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../src/components/index.ts"],"names":[],"mappings":";;;;;;AA0BA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './common'\nexport * from './Collapser'\nexport * from './ConfigForm'\nexport * from './CopyLinkWrapper'\nexport * from './DocSdkCalls'\nexport * from './DataGrid'\nexport * from './LoginForm'\nexport * from './Loading'\nexport * from './MethodBadge'\nexport * from './PerfTracker'\nexport * from './RequestForm'\nexport * from './ResponseExplorer'\nexport * from './ShowResponse'\n"],"file":"index.js"}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { useToggle, Accordion2, Divider, Box } from '@looker/components';
2
+ import { useToggle, Accordion2, Divider, Box2 } from '@looker/components';
3
3
  import { ArrowRight } from '@styled-icons/material/ArrowRight';
4
4
  import { ArrowDropDown } from '@styled-icons/material/ArrowDropDown';
5
5
  import { RunItHeading } from '../common';
@@ -16,7 +16,10 @@ export var CollapserCard = _ref => {
16
16
  value,
17
17
  toggle
18
18
  } = useToggle(defaultOpen);
19
- return React.createElement(React.Fragment, null, divider && React.createElement(Divider, {
19
+ return React.createElement(Box2, {
20
+ display: "flex",
21
+ flexDirection: "column"
22
+ }, divider && React.createElement(Divider, {
20
23
  appearance: "light"
21
24
  }), React.createElement(Accordion2, {
22
25
  id: id,
@@ -30,7 +33,7 @@ export var CollapserCard = _ref => {
30
33
  label: React.createElement(RunItHeading, {
31
34
  as: level
32
35
  }, heading)
33
- }, React.createElement(Box, {
36
+ }, React.createElement(Box2, {
34
37
  pb: "xlarge"
35
38
  }, children)));
36
39
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Collapser/CollapserCard.tsx"],"names":["React","useToggle","Accordion2","Divider","Box","ArrowRight","ArrowDropDown","RunItHeading","CollapserCard","id","heading","children","defaultOpen","divider","level","value","toggle","close","open"],"mappings":"AA0BA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,EAAoBC,UAApB,EAAgCC,OAAhC,EAAyCC,GAAzC,QAAoD,oBAApD;AACA,SAASC,UAAT,QAA2B,mCAA3B;AACA,SAASC,aAAT,QAA8B,sCAA9B;AACA,SAASC,YAAT,QAA6B,WAA7B;AAaA,OAAO,IAAMC,aAAqC,GAAG,QAM/C;AAAA,MANgD;AACpDC,IAAAA,EADoD;AAEpDC,IAAAA,OAFoD;AAGpDC,IAAAA,QAHoD;AAIpDC,IAAAA,WAAW,GAAG,IAJsC;AAKpDC,IAAAA,OAAO,GAAG;AAL0C,GAMhD;AACJ,MAAMC,KAAK,GAAGD,OAAO,GAAG,IAAH,GAAU,IAA/B;AACA,MAAM;AAAEE,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAoBf,SAAS,CAACW,WAAD,CAAnC;AAEA,SACE,0CACGC,OAAO,IAAI,oBAAC,OAAD;AAAS,IAAA,UAAU,EAAC;AAApB,IADd,EAEE,oBAAC,UAAD;AACE,IAAA,EAAE,EAAEJ,EADN;AAEE,IAAA,iBAAiB,EAAC,MAFpB;AAGE,IAAA,MAAM,EAAEM,KAHV;AAIE,IAAA,UAAU,EAAEC,MAJd;AAKE,IAAA,cAAc,EAAE;AAAEC,MAAAA,KAAK,EAAE,oBAAC,UAAD,OAAT;AAAyBC,MAAAA,IAAI,EAAE,oBAAC,aAAD;AAA/B,KALlB;AAME,IAAA,KAAK,EAAE,oBAAC,YAAD;AAAc,MAAA,EAAE,EAAEJ;AAAlB,OAA0BJ,OAA1B;AANT,KAQE,oBAAC,GAAD;AAAK,IAAA,EAAE,EAAC;AAAR,KAAkBC,QAAlB,CARF,CAFF,CADF;AAeD,CAzBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { FC, ReactElement } from 'react'\nimport React from 'react'\nimport { useToggle, Accordion2, Divider, Box } from '@looker/components'\nimport { ArrowRight } from '@styled-icons/material/ArrowRight'\nimport { ArrowDropDown } from '@styled-icons/material/ArrowDropDown'\nimport { RunItHeading } from '../common'\n\ninterface CollapserCardProps {\n id?: string\n heading: string\n children: ReactElement\n defaultOpen?: boolean\n divider?: boolean\n}\n\n/**\n * Render a collapsable header and children\n */\nexport const CollapserCard: FC<CollapserCardProps> = ({\n id,\n heading,\n children,\n defaultOpen = true,\n divider = true,\n}) => {\n const level = divider ? 'h3' : 'h4'\n const { value, toggle } = useToggle(defaultOpen)\n\n return (\n <>\n {divider && <Divider appearance=\"light\" />}\n <Accordion2\n id={id}\n indicatorPosition=\"left\"\n isOpen={value}\n toggleOpen={toggle}\n indicatorIcons={{ close: <ArrowRight />, open: <ArrowDropDown /> }}\n label={<RunItHeading as={level}>{heading}</RunItHeading>}\n >\n <Box pb=\"xlarge\">{children}</Box>\n </Accordion2>\n </>\n )\n}\n"],"file":"CollapserCard.js"}
1
+ {"version":3,"sources":["../../../../src/components/Collapser/CollapserCard.tsx"],"names":["React","useToggle","Accordion2","Divider","Box2","ArrowRight","ArrowDropDown","RunItHeading","CollapserCard","id","heading","children","defaultOpen","divider","level","value","toggle","close","open"],"mappings":"AA0BA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,EAAoBC,UAApB,EAAgCC,OAAhC,EAAyCC,IAAzC,QAAqD,oBAArD;AACA,SAASC,UAAT,QAA2B,mCAA3B;AACA,SAASC,aAAT,QAA8B,sCAA9B;AAEA,SAASC,YAAT,QAA6B,WAA7B;AAaA,OAAO,IAAMC,aAAqC,GAAG,QAM/C;AAAA,MANgD;AACpDC,IAAAA,EADoD;AAEpDC,IAAAA,OAFoD;AAGpDC,IAAAA,QAHoD;AAIpDC,IAAAA,WAAW,GAAG,IAJsC;AAKpDC,IAAAA,OAAO,GAAG;AAL0C,GAMhD;AACJ,MAAMC,KAAK,GAAGD,OAAO,GAAG,IAAH,GAAU,IAA/B;AACA,MAAM;AAAEE,IAAAA,KAAF;AAASC,IAAAA;AAAT,MAAoBf,SAAS,CAACW,WAAD,CAAnC;AAEA,SACE,oBAAC,IAAD;AAAM,IAAA,OAAO,EAAC,MAAd;AAAqB,IAAA,aAAa,EAAC;AAAnC,KACGC,OAAO,IAAI,oBAAC,OAAD;AAAS,IAAA,UAAU,EAAC;AAApB,IADd,EAEE,oBAAC,UAAD;AACE,IAAA,EAAE,EAAEJ,EADN;AAEE,IAAA,iBAAiB,EAAC,MAFpB;AAGE,IAAA,MAAM,EAAEM,KAHV;AAIE,IAAA,UAAU,EAAEC,MAJd;AAKE,IAAA,cAAc,EAAE;AAAEC,MAAAA,KAAK,EAAE,oBAAC,UAAD,OAAT;AAAyBC,MAAAA,IAAI,EAAE,oBAAC,aAAD;AAA/B,KALlB;AAME,IAAA,KAAK,EAAE,oBAAC,YAAD;AAAc,MAAA,EAAE,EAAEJ;AAAlB,OAA0BJ,OAA1B;AANT,KAQE,oBAAC,IAAD;AAAM,IAAA,EAAE,EAAC;AAAT,KAAmBC,QAAnB,CARF,CAFF,CADF;AAeD,CAzBM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { FC, ReactElement } from 'react'\nimport React from 'react'\nimport { useToggle, Accordion2, Divider, Box2 } from '@looker/components'\nimport { ArrowRight } from '@styled-icons/material/ArrowRight'\nimport { ArrowDropDown } from '@styled-icons/material/ArrowDropDown'\n\nimport { RunItHeading } from '../common'\n\ninterface CollapserCardProps {\n id?: string\n heading: string\n children: ReactElement\n defaultOpen?: boolean\n divider?: boolean\n}\n\n/**\n * Render a collapsable header and children\n */\nexport const CollapserCard: FC<CollapserCardProps> = ({\n id,\n heading,\n children,\n defaultOpen = true,\n divider = true,\n}) => {\n const level = divider ? 'h3' : 'h4'\n const { value, toggle } = useToggle(defaultOpen)\n\n return (\n <Box2 display=\"flex\" flexDirection=\"column\">\n {divider && <Divider appearance=\"light\" />}\n <Accordion2\n id={id}\n indicatorPosition=\"left\"\n isOpen={value}\n toggleOpen={toggle}\n indicatorIcons={{ close: <ArrowRight />, open: <ArrowDropDown /> }}\n label={<RunItHeading as={level}>{heading}</RunItHeading>}\n >\n <Box2 pb=\"xlarge\">{children}</Box2>\n </Accordion2>\n </Box2>\n )\n}\n"],"file":"CollapserCard.js"}
@@ -0,0 +1,48 @@
1
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
2
+
3
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
4
+
5
+ import React, { useState } from 'react';
6
+ import { IconButton, Space } from '@looker/components';
7
+ import { Link } from '@styled-icons/material-outlined/Link';
8
+ import { getEnvAdaptor } from '@looker/extension-utils';
9
+ import { useLocation } from 'react-router-dom';
10
+ var COPY_TO_CLIPBOARD = 'Copy to clipboard';
11
+ export var CopyLinkWrapper = _ref => {
12
+ var {
13
+ children,
14
+ visible = true
15
+ } = _ref;
16
+ var [tooltipContent, setTooltipContent] = useState(COPY_TO_CLIPBOARD);
17
+ var [showCopyLinkButton, setShowCopyLinkButton] = useState(false);
18
+ var location = useLocation();
19
+
20
+ var handleCopyLink = function () {
21
+ var _ref2 = _asyncToGenerator(function* () {
22
+ yield getEnvAdaptor().copyToClipboard(location);
23
+ setTooltipContent('Copied to clipboard');
24
+ });
25
+
26
+ return function handleCopyLink() {
27
+ return _ref2.apply(this, arguments);
28
+ };
29
+ }();
30
+
31
+ var handleMouseLeave = () => {
32
+ setTooltipContent(COPY_TO_CLIPBOARD);
33
+ };
34
+
35
+ return React.createElement(Space, {
36
+ width: '100%',
37
+ onMouseEnter: () => setShowCopyLinkButton(true),
38
+ onMouseLeave: () => setShowCopyLinkButton(false)
39
+ }, children, showCopyLinkButton && visible && React.createElement(IconButton, {
40
+ onClick: handleCopyLink,
41
+ icon: React.createElement(Link, null),
42
+ size: "small",
43
+ label: tooltipContent,
44
+ tooltipPlacement: "bottom",
45
+ onMouseLeave: handleMouseLeave
46
+ }));
47
+ };
48
+ //# sourceMappingURL=CopyLinkWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/CopyLinkWrapper/CopyLinkWrapper.tsx"],"names":["React","useState","IconButton","Space","Link","getEnvAdaptor","useLocation","COPY_TO_CLIPBOARD","CopyLinkWrapper","children","visible","tooltipContent","setTooltipContent","showCopyLinkButton","setShowCopyLinkButton","location","handleCopyLink","copyToClipboard","handleMouseLeave"],"mappings":";;;;AA0BA,OAAOA,KAAP,IAAgBC,QAAhB,QAAgC,OAAhC;AACA,SAASC,UAAT,EAAqBC,KAArB,QAAkC,oBAAlC;AACA,SAASC,IAAT,QAAqB,sCAArB;AACA,SAASC,aAAT,QAA8B,yBAA9B;AACA,SAASC,WAAT,QAA4B,kBAA5B;AAOA,IAAMC,iBAAiB,GAAG,mBAA1B;AAQA,OAAO,IAAMC,eAAe,GAAG,QAGH;AAAA,MAHI;AAC9BC,IAAAA,QAD8B;AAE9BC,IAAAA,OAAO,GAAG;AAFoB,GAGJ;AAC1B,MAAM,CAACC,cAAD,EAAiBC,iBAAjB,IAAsCX,QAAQ,CAACM,iBAAD,CAApD;AACA,MAAM,CAACM,kBAAD,EAAqBC,qBAArB,IAA8Cb,QAAQ,CAAC,KAAD,CAA5D;AACA,MAAMc,QAAQ,GAAGT,WAAW,EAA5B;;AACA,MAAMU,cAAc;AAAA,kCAAG,aAAY;AACjC,YAAMX,aAAa,GAAGY,eAAhB,CAAgCF,QAAhC,CAAN;AACAH,MAAAA,iBAAiB,CAAC,qBAAD,CAAjB;AACD,KAHmB;;AAAA,oBAAdI,cAAc;AAAA;AAAA;AAAA,KAApB;;AAIA,MAAME,gBAAgB,GAAG,MAAM;AAC7BN,IAAAA,iBAAiB,CAACL,iBAAD,CAAjB;AACD,GAFD;;AAGA,SACE,oBAAC,KAAD;AACE,IAAA,KAAK,EAAE,MADT;AAEE,IAAA,YAAY,EAAE,MAAMO,qBAAqB,CAAC,IAAD,CAF3C;AAGE,IAAA,YAAY,EAAE,MAAMA,qBAAqB,CAAC,KAAD;AAH3C,KAKGL,QALH,EAMGI,kBAAkB,IAAIH,OAAtB,IACC,oBAAC,UAAD;AACE,IAAA,OAAO,EAAEM,cADX;AAEE,IAAA,IAAI,EAAE,oBAAC,IAAD,OAFR;AAGE,IAAA,IAAI,EAAC,OAHP;AAIE,IAAA,KAAK,EAAEL,cAJT;AAKE,IAAA,gBAAgB,EAAC,QALnB;AAME,IAAA,YAAY,EAAEO;AANhB,IAPJ,CADF;AAmBD,CAjCM","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nimport type { ReactNode, ReactNodeArray } from 'react'\nimport React, { useState } from 'react'\nimport { IconButton, Space } from '@looker/components'\nimport { Link } from '@styled-icons/material-outlined/Link'\nimport { getEnvAdaptor } from '@looker/extension-utils'\nimport { useLocation } from 'react-router-dom'\n\ninterface CopyLinkWrapperProps {\n children: ReactNode | ReactNodeArray\n visible?: boolean\n}\n\nconst COPY_TO_CLIPBOARD = 'Copy to clipboard'\n\n/**\n * Displays a copy link button on hover\n *\n * @param children component(s) which will render left of the button\n * @param visible boolean determining button visibility\n */\nexport const CopyLinkWrapper = ({\n children,\n visible = true,\n}: CopyLinkWrapperProps) => {\n const [tooltipContent, setTooltipContent] = useState(COPY_TO_CLIPBOARD)\n const [showCopyLinkButton, setShowCopyLinkButton] = useState(false)\n const location = useLocation()\n const handleCopyLink = async () => {\n await getEnvAdaptor().copyToClipboard(location)\n setTooltipContent('Copied to clipboard')\n }\n const handleMouseLeave = () => {\n setTooltipContent(COPY_TO_CLIPBOARD)\n }\n return (\n <Space\n width={'100%'}\n onMouseEnter={() => setShowCopyLinkButton(true)}\n onMouseLeave={() => setShowCopyLinkButton(false)}\n >\n {children}\n {showCopyLinkButton && visible && (\n <IconButton\n onClick={handleCopyLink}\n icon={<Link />}\n size=\"small\"\n label={tooltipContent}\n tooltipPlacement=\"bottom\"\n onMouseLeave={handleMouseLeave}\n />\n )}\n </Space>\n )\n}\n"],"file":"CopyLinkWrapper.js"}
@@ -0,0 +1,2 @@
1
+ export { CopyLinkWrapper } from './CopyLinkWrapper';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/CopyLinkWrapper/index.ts"],"names":["CopyLinkWrapper"],"mappings":"AAyBA,SAASA,eAAT,QAAgC,mBAAhC","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\nexport { CopyLinkWrapper } from './CopyLinkWrapper'\n"],"file":"index.js"}
@@ -5,9 +5,8 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
5
5
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
6
 
7
7
  import React, { Fragment } from 'react';
8
- import { ToggleSwitch, Label, FieldCheckbox, ButtonOutline, Box, Popover, InputText, Tooltip, Icon, Space } from '@looker/components';
8
+ import { ToggleSwitch, Label, FieldCheckbox, InputText, Tooltip, Icon, InputDate, Space } from '@looker/components';
9
9
  import { Info } from '@styled-icons/material';
10
- import { DateFormat, InputDate } from '@looker/components-date';
11
10
  import { CodeEditor } from '@looker/code-editor';
12
11
  import { FormItem } from './FormItem';
13
12
 
@@ -15,23 +14,12 @@ var createDateItem = (name, handleChange, requestContent) => React.createElement
15
14
  key: "".concat(name, "_fid"),
16
15
  id: name,
17
16
  label: name
18
- }, React.createElement(Popover, {
19
- key: "".concat(name, "_pop"),
20
- placement: "bottom-start",
21
- content: React.createElement(Box, {
22
- key: "".concat(name, "_popbox"),
23
- p: "u3"
24
- }, React.createElement(InputDate, {
25
- key: "datepick_".concat(name),
26
- defaultValue: name in requestContent ? requestContent[name] : undefined,
27
- onChange: handleChange.bind(null, name)
28
- }))
29
- }, React.createElement(ButtonOutline, {
30
- type: "button",
31
- key: "".concat(name, "_pop_button")
32
- }, name in requestContent ? React.createElement(DateFormat, {
33
- key: "".concat(name, "_dateformat")
34
- }, name in requestContent ? requestContent[name] : undefined) : 'Choose')));
17
+ }, React.createElement(InputDate, {
18
+ key: "datepick_".concat(name),
19
+ "data-testid": "datepick_".concat(name),
20
+ defaultValue: name in requestContent ? requestContent[name] : undefined,
21
+ onChange: handleChange.bind(null, name)
22
+ }));
35
23
 
36
24
  var createBoolItem = (name, description, handleChange, requestContent) => React.createElement(FormItem, {
37
25
  key: "".concat(name, "_fib"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/RequestForm/formUtils.tsx"],"names":["React","Fragment","ToggleSwitch","Label","FieldCheckbox","ButtonOutline","Box","Popover","InputText","Tooltip","Icon","Space","Info","DateFormat","InputDate","CodeEditor","FormItem","createDateItem","name","handleChange","requestContent","undefined","bind","createBoolItem","description","inputTextType","type","createItem","required","placeholder","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","showDataChangeWarning","updateNullableProp","state","key","newValue","updatedState","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","size","Array","from","join"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react'\nimport React, { Fragment } from 'react'\nimport {\n ToggleSwitch,\n Label,\n FieldCheckbox,\n ButtonOutline,\n Box,\n Popover,\n InputText,\n Tooltip,\n Icon,\n Space,\n} from '@looker/components'\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material'\nimport { DateFormat, InputDate } from '@looker/components-date'\nimport { CodeEditor } from '@looker/code-editor'\nimport type { RunItInput, RunItValues } from '../../RunIt'\nimport { FormItem } from './FormItem'\n\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <Popover\n key={`${name}_pop`}\n placement=\"bottom-start\"\n content={\n <Box key={`${name}_popbox`} p=\"u3\">\n <InputDate\n key={`datepick_${name}`}\n defaultValue={\n name in requestContent ? requestContent[name] : undefined\n }\n onChange={handleChange.bind(null, name)}\n />\n </Box>\n }\n >\n <ButtonOutline type=\"button\" key={`${name}_pop_button`}>\n {name in requestContent ? (\n <DateFormat key={`${name}_dateformat`}>\n {name in requestContent ? requestContent[name] : undefined}\n </DateFormat>\n ) : (\n 'Choose'\n )}\n </ButtonOutline>\n </Popover>\n </FormItem>\n)\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n)\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number'\n case 'email':\n return 'email'\n case 'password':\n return 'password'\n default:\n return 'text'\n }\n}\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n)\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n )\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n )\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n )\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n )\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent)\n default:\n return <Fragment key={input.name}></Fragment>\n }\n}\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name]\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2)\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content=\"Empty values are automatically removed from the request.\">\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n )\n}\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n)\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state }\n if (key in state && !newValue) {\n delete updatedState[key]\n } else {\n updatedState[key] = newValue\n }\n return updatedState\n}\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = ''\n if (!body) return result\n const args = body.split('&')\n args.forEach((arg) => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i\n if (!formArg.test(arg)) {\n result += ` ${arg}`\n }\n })\n return result.trim()\n}\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed\n\n let result = ''\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body)\n } catch (e: any) {\n result = e.message\n }\n } else {\n result = validateEncodedValues(body)\n }\n if (result) {\n result = `Syntax error in the body: ${result}`\n }\n } else {\n parsed = body\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys)\n const keys = new Set<string>(Object.keys(parsed))\n const missing = new Set<string>([...required].filter((k) => !keys.has(k)))\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`\n }\n }\n return result\n}\n"],"file":"formUtils.js"}
1
+ {"version":3,"sources":["../../../../src/components/RequestForm/formUtils.tsx"],"names":["React","Fragment","ToggleSwitch","Label","FieldCheckbox","InputText","Tooltip","Icon","InputDate","Space","Info","CodeEditor","FormItem","createDateItem","name","handleChange","requestContent","undefined","bind","createBoolItem","description","inputTextType","type","createItem","required","placeholder","createSimpleItem","input","handleNumberChange","handleBoolChange","handleDateChange","createComplexItem","handleComplexChange","content","code","JSON","stringify","showDataChangeWarning","updateNullableProp","state","key","newValue","updatedState","validateEncodedValues","body","result","args","split","forEach","arg","formArg","test","trim","validateBody","requiredKeys","parsed","parse","e","message","length","Set","keys","Object","missing","filter","k","has","size","Array","from","join"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { BaseSyntheticEvent } from 'react'\nimport React, { Fragment } from 'react'\nimport {\n ToggleSwitch,\n Label,\n FieldCheckbox,\n InputText,\n Tooltip,\n Icon,\n InputDate,\n Space,\n} from '@looker/components'\n// eslint-disable-next-line no-restricted-imports\nimport { Info } from '@styled-icons/material'\nimport { CodeEditor } from '@looker/code-editor'\nimport type { RunItInput, RunItValues } from '../../RunIt'\nimport { FormItem } from './FormItem'\n\n/**\n * Creates a datetime form item\n * @param name Form item's name\n * @param handleChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A datetime form item\n */\nconst createDateItem = (\n name: string,\n handleChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fid`} id={name} label={name}>\n <InputDate\n key={`datepick_${name}`}\n data-testid={`datepick_${name}`}\n defaultValue={name in requestContent ? requestContent[name] : undefined}\n onChange={handleChange.bind(null, name)}\n />\n </FormItem>\n)\n\n/**\n * Creates a boolean form item\n * @param name Form item's name\n * @param description Form item's description\n * @param handleChange A callback function that updates parent's component state when boolean item is clicked\n * @param requestContent A state object containing the values of all form items\n * @returns A boolean form item (a FieldToggleSwitch)\n */\nconst createBoolItem = (\n name: string,\n description: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fib`} id={name} label={name}>\n <>\n <ToggleSwitch\n key={name}\n id={name}\n name={name}\n onChange={handleChange}\n on={name in requestContent ? requestContent[name] : false}\n />\n {description && <Label>{description}</Label>}\n </>\n </FormItem>\n)\n\nconst inputTextType = (type: string) => {\n switch (type) {\n case 'number':\n return 'number'\n case 'email':\n return 'email'\n case 'password':\n return 'password'\n default:\n return 'text'\n }\n}\n\n/**\n * Create a field text input item based on definitions\n * @param name Form item's name\n * @param description Form item's description\n * @param required Form item's required flag\n * @param type Form item's type\n * @param placeholder Form item's placeholder\n * @param handleChange A callback function that updates parent's component state when form item value changes\n * @param requestContent A state object containing the values of all form items\n * @returns A form item\n */\nconst createItem = (\n name: string,\n description: string,\n required: boolean,\n type: string,\n placeholder: string,\n handleChange: (e: BaseSyntheticEvent) => void,\n requestContent: RunItValues\n) => (\n <FormItem key={`${name}_fi`} id={name} label={name}>\n <InputText\n key={name}\n id={name}\n name={name}\n required={required}\n placeholder={`${placeholder} ${description || name}`}\n type={inputTextType(type)}\n value={name in requestContent ? requestContent[name] : ''}\n onChange={handleChange}\n />\n </FormItem>\n)\n\n/**\n * Creates a simple form item\n * @param input An object describing the form item\n * @param handleChange A callback function for updating the parent component's requestContent state with\n * text/email/password item changes\n * @param handleNumberChange A callback function for updating the parent component's requestContent state with number\n * item changes\n * @param handleBoolChange A callback function for updating the parent\n * component's requestContent state with bool item changes\n * @param handleDateChange A callback function for updating the parent\n * component's requestContent state with date item changes\n * @param requestContent A state object containing the values of all form items\n * @returns A simple form item\n */\nexport const createSimpleItem = (\n input: RunItInput,\n handleChange: (e: BaseSyntheticEvent) => void,\n handleNumberChange: (e: BaseSyntheticEvent) => void,\n handleBoolChange: (e: BaseSyntheticEvent) => void,\n handleDateChange: (name: string, date?: Date) => void,\n requestContent: RunItValues\n) => {\n switch (input.type) {\n case 'boolean':\n return createBoolItem(\n input.name,\n input.description,\n handleBoolChange,\n requestContent\n )\n case 'int64':\n case 'integer':\n case 'float':\n case 'double':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'number',\n '(number)',\n handleNumberChange,\n requestContent\n )\n case 'string':\n case 'hostname':\n case 'uuid':\n case 'uri':\n case 'ipv4':\n case 'ipv6':\n return createItem(\n input.name,\n input.description,\n input.required,\n 'string',\n '(string)',\n handleChange,\n requestContent\n )\n case 'email':\n case 'password':\n return createItem(\n input.name,\n input.description,\n input.required,\n input.type,\n '(string)',\n handleChange,\n requestContent\n )\n case 'datetime':\n return createDateItem(input.name, handleDateChange, requestContent)\n default:\n return <Fragment key={input.name}></Fragment>\n }\n}\n\n/**\n * Creates a complex item\n * @param input An object describing the form item\n * @param handleComplexChange A callback function for updating the parent\n * component's requestContent state\n * @param requestContent A state object containing the values of all form items\n * @returns A complex form item\n */\nexport const createComplexItem = (\n input: RunItInput,\n handleComplexChange: (value: string, name: string) => void,\n requestContent: RunItValues\n) => {\n const content = requestContent[input.name]\n const code =\n typeof content === 'string' ? content : JSON.stringify(content, null, 2)\n\n return (\n <FormItem\n key={`${input.name}_fic`}\n id={input.name}\n label={\n <Space>\n {input.name}\n <Tooltip content=\"Empty values are automatically removed from the request.\">\n <Icon\n data-testid=\"body-param-tooltip\"\n icon={<Info />}\n size=\"xsmall\"\n ml=\"xsmall\"\n />\n </Tooltip>\n </Space>\n }\n >\n <CodeEditor\n key={`code_${input.name}`}\n language=\"json\"\n code={code}\n lineNumbers={false}\n onChange={handleComplexChange.bind(null, input.name)}\n transparent={true}\n />\n </FormItem>\n )\n}\n\n/**\n * Creates a required checkbox form item\n */\nexport const showDataChangeWarning = () => (\n <FormItem key=\"warningfi\" id=\"change_warning\">\n <FieldCheckbox\n name=\"warning\"\n key=\"warning\"\n required\n label=\"I understand that this API endpoint will change data.\"\n />\n </FormItem>\n)\n\n/**\n * Updates a given state with a key/value pair, taking into consideration\n * indeterminate values.\n * @param state A collection to update\n * @param key Property to update\n * @param newValue? New value corresponding to given key\n */\nexport const updateNullableProp = (\n state: RunItValues,\n key: string,\n newValue?: any\n) => {\n const updatedState = { ...state }\n if (key in state && !newValue) {\n delete updatedState[key]\n } else {\n updatedState[key] = newValue\n }\n return updatedState\n}\n\n/**\n * If the body isn't empty, it must be valid form encoded syntax\n *\n * This may not be perfect validation but it should be good enough to tolerate variances\n *\n * @param body to validate\n */\nexport const validateEncodedValues = (body: string) => {\n let result = ''\n if (!body) return result\n const args = body.split('&')\n args.forEach((arg) => {\n const formArg = /[\\w-_.]+(\\[])?=.*/i\n if (!formArg.test(arg)) {\n result += ` ${arg}`\n }\n })\n return result.trim()\n}\n\n/**\n * Returns an error message if the body is not JSON or valid form url encoding\n *\n * @param body string to validate\n * @param requiredKeys keys that are required in the body parameter\n */\nexport const validateBody = (\n body: string | Record<string, any>,\n requiredKeys: string[]\n) => {\n let parsed\n\n let result = ''\n if (body) {\n if (typeof body === 'string') {\n if (/^[[{}\"]/.test(body)) {\n // most likely JSON\n try {\n parsed = JSON.parse(body)\n } catch (e: any) {\n result = e.message\n }\n } else {\n result = validateEncodedValues(body)\n }\n if (result) {\n result = `Syntax error in the body: ${result}`\n }\n } else {\n parsed = body\n }\n }\n\n if (parsed && requiredKeys && requiredKeys.length > 0) {\n const required = new Set<string>(requiredKeys)\n const keys = new Set<string>(Object.keys(parsed))\n const missing = new Set<string>([...required].filter((k) => !keys.has(k)))\n if (missing.size > 0) {\n result = `Error: Required properties \"${Array.from(missing).join(\n ', '\n )}\" must be provided in the body`\n }\n }\n return result\n}\n"],"file":"formUtils.js"}
@@ -1,6 +1,8 @@
1
- import React from 'react';
2
- import { Table, TableBody, TableRow, TableDataCell, Span, TableHead, TableHeaderCell } from '@looker/components';
1
+ import React, { useState } from 'react';
2
+ import { Table, TableBody, TableRow, TableDataCell, Span, TableHead, TableHeaderCell, IconButton } from '@looker/components';
3
3
  import styled from 'styled-components';
4
+ import { Warning } from '@styled-icons/material/Warning';
5
+ import { APIErrorDialog, APIErrorDisplay } from '@looker/extension-utils';
4
6
  import { ShowResponse } from '../ShowResponse';
5
7
  import { CollapserCard } from '../Collapser';
6
8
  import { DarkSpan, RunItHeading } from '../common';
@@ -57,14 +59,32 @@ export var ResponseExplorer = _ref4 => {
57
59
  verb,
58
60
  path
59
61
  } = _ref4;
62
+ var [isOpen, setIsOpen] = useState(false);
63
+ var error = response && response.statusCode >= 400 && response.contentType === 'application/json' ? JSON.parse(response.body) : undefined;
60
64
  return React.createElement(React.Fragment, null, !response && React.createElement(DarkSpan, null, "No response was received"), response && React.createElement(React.Fragment, null, React.createElement(RunItHeading, {
61
65
  as: "h4"
62
- }, "".concat(verb || '', " ").concat(path || '', " (").concat(response.statusCode, ": ").concat(response.statusMessage, ")")), React.createElement(CollapserCard, {
66
+ }, error && React.createElement(React.Fragment, null, React.createElement(APIErrorDialog, {
67
+ error: error,
68
+ isOpen: isOpen,
69
+ setOpen: setIsOpen
70
+ }), React.createElement(IconButton, {
71
+ size: "small",
72
+ onClick: () => setIsOpen(true),
73
+ icon: React.createElement(Warning, null),
74
+ "aria-label": "API error",
75
+ label: "API Error"
76
+ })), "".concat(verb || '', " ").concat(path || '', " (").concat(response.statusCode, ": ").concat(response.statusMessage, ")")), React.createElement(CollapserCard, {
63
77
  divider: false,
64
78
  heading: "Body (".concat(getBodySize(response), ")"),
65
79
  id: "body"
66
80
  }, React.createElement(ShowResponse, {
67
81
  response: response
82
+ })), error && React.createElement(CollapserCard, {
83
+ divider: false,
84
+ heading: 'Error information'
85
+ }, React.createElement(APIErrorDisplay, {
86
+ error: error,
87
+ showDoc: true
68
88
  })), React.createElement(ResponseHeaders, {
69
89
  response: response
70
90
  })));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"names":["React","Table","TableBody","TableRow","TableDataCell","Span","TableHead","TableHeaderCell","styled","ShowResponse","CollapserCard","DarkSpan","RunItHeading","getHeaders","response","headers","result","Object","entries","forEach","key","val","push","getBodySize","size","body","Blob","toString","length","NoWrap","ResponseHeaders","rows","map","value","ResponseExplorer","verb","path","statusCode","statusMessage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React from 'react'\nimport {\n Table,\n TableBody,\n TableRow,\n TableDataCell,\n Span,\n TableHead,\n TableHeaderCell,\n} from '@looker/components'\nimport styled from 'styled-components'\nimport type { IRawResponse } from '@looker/sdk-rtl'\nimport { ShowResponse } from '../ShowResponse'\nimport { CollapserCard } from '../Collapser'\nimport { DarkSpan, RunItHeading } from '../common'\n\ntype HeaderTable = string[][]\nexport type ResponseContent = IRawResponse | undefined\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return []\n const result: HeaderTable = []\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n )\n return result\n}\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length\n\n return `${size} bytes`\n}\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`\n\ninterface ShowHeadersProps {\n response: ResponseContent\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response)\n if (rows.length === 0) return <></>\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n )\n}\n\ninterface ResponseExplorerProps {\n response: ResponseContent\n verb: string\n path: string\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n // TODO make a badge for the verb.\n // Once we are satisfied with the badge in the api-explorer package it should be moved here\n\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n })`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n )\n}\n"],"file":"ResponseExplorer.js"}
1
+ {"version":3,"sources":["../../../../src/components/ResponseExplorer/ResponseExplorer.tsx"],"names":["React","useState","Table","TableBody","TableRow","TableDataCell","Span","TableHead","TableHeaderCell","IconButton","styled","Warning","APIErrorDialog","APIErrorDisplay","ShowResponse","CollapserCard","DarkSpan","RunItHeading","getHeaders","response","headers","result","Object","entries","forEach","key","val","push","getBodySize","size","body","Blob","toString","length","NoWrap","ResponseHeaders","rows","map","value","ResponseExplorer","verb","path","isOpen","setIsOpen","error","statusCode","contentType","JSON","parse","undefined","statusMessage"],"mappings":"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","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nimport type { FC } from 'react'\nimport React, { useState } from 'react'\nimport {\n Table,\n TableBody,\n TableRow,\n TableDataCell,\n Span,\n TableHead,\n TableHeaderCell,\n IconButton,\n} from '@looker/components'\nimport styled from 'styled-components'\nimport type { IRawResponse, LookerSDKError } from '@looker/sdk-rtl'\nimport { Warning } from '@styled-icons/material/Warning'\nimport { APIErrorDialog, APIErrorDisplay } from '@looker/extension-utils'\nimport { ShowResponse } from '../ShowResponse'\nimport { CollapserCard } from '../Collapser'\nimport { DarkSpan, RunItHeading } from '../common'\n\ntype HeaderTable = string[][]\nexport type ResponseContent = IRawResponse | undefined\n\nconst getHeaders = (response: ResponseContent): HeaderTable => {\n if (!response?.headers) return []\n const result: HeaderTable = []\n Object.entries(response.headers).forEach(([key, val]) =>\n result.push([key, val])\n )\n return result\n}\n\nconst getBodySize = (response: ResponseContent): string => {\n const size =\n !response || !response.body\n ? 0\n : response?.body instanceof Blob\n ? response?.body.size\n : response?.body.toString().length\n\n return `${size} bytes`\n}\n\nconst NoWrap = styled(Span)`\n display: inline-block;\n direction: rtl;\n white-space: nowrap;\n overflow: hidden;\n`\n\ninterface ShowHeadersProps {\n response: ResponseContent\n}\n\n/**\n * Display response headers in a table\n * @param response to display\n * @constructor\n */\nexport const ResponseHeaders: FC<ShowHeadersProps> = ({ response }) => {\n const rows = getHeaders(response)\n if (rows.length === 0) return <></>\n return (\n <CollapserCard\n key=\"headers\"\n heading={`Headers (${rows.length})`}\n id=\"headers\"\n defaultOpen={false}\n divider={false}\n >\n <>\n <Table>\n <TableHead>\n <TableRow>\n <TableHeaderCell p=\"xsmall\">Name</TableHeaderCell>\n <TableHeaderCell p=\"xsmall\">Value</TableHeaderCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {rows.map(([key, value]) => (\n <TableRow key={key}>\n <TableDataCell p=\"xsmall\">\n <NoWrap>\n <strong>{key}</strong>\n </NoWrap>\n </TableDataCell>\n <TableDataCell p=\"xsmall\">\n <Span>{value}</Span>\n </TableDataCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </>\n </CollapserCard>\n )\n}\n\ninterface ResponseExplorerProps {\n response: ResponseContent\n verb: string\n path: string\n}\n\n/**\n * Explore the raw response from an HTTP request\n * @param response IRawResponse values\n * @param verb HTTP method\n * @param path Path of request\n * @constructor\n */\nexport const ResponseExplorer: FC<ResponseExplorerProps> = ({\n response,\n verb,\n path,\n}) => {\n const [isOpen, setIsOpen] = useState(false)\n const error: LookerSDKError =\n response &&\n response.statusCode >= 400 &&\n response.contentType === 'application/json'\n ? JSON.parse(response.body)\n : undefined\n return (\n <>\n {!response && <DarkSpan>No response was received</DarkSpan>}\n {response && (\n <>\n <RunItHeading as=\"h4\">\n {error && (\n <>\n <APIErrorDialog\n error={error}\n isOpen={isOpen}\n setOpen={setIsOpen}\n />\n <IconButton\n size=\"small\"\n onClick={() => setIsOpen(true)}\n icon={<Warning />}\n aria-label=\"API error\"\n label=\"API Error\"\n />\n </>\n )}\n {`${verb || ''} ${path || ''} (${response.statusCode}: ${\n response.statusMessage\n })`}\n </RunItHeading>\n <CollapserCard\n divider={false}\n heading={`Body (${getBodySize(response)})`}\n id=\"body\"\n >\n <ShowResponse response={response} />\n </CollapserCard>\n {error && (\n <CollapserCard divider={false} heading={'Error information'}>\n <APIErrorDisplay error={error} showDoc={true} />\n </CollapserCard>\n )}\n <ResponseHeaders response={response} />\n </>\n )}\n </>\n )\n}\n"],"file":"ResponseExplorer.js"}
@@ -1,6 +1,7 @@
1
1
  export * from './common';
2
2
  export * from './Collapser';
3
3
  export * from './ConfigForm';
4
+ export * from './CopyLinkWrapper';
4
5
  export * from './DocSdkCalls';
5
6
  export * from './DataGrid';
6
7
  export * from './LoginForm';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/index.ts"],"names":[],"mappings":"AA0BA,cAAc,UAAd;AACA,cAAc,aAAd;AACA,cAAc,cAAd;AACA,cAAc,eAAd;AACA,cAAc,YAAd;AACA,cAAc,aAAd;AACA,cAAc,WAAd;AACA,cAAc,eAAd;AACA,cAAc,eAAd;AACA,cAAc,eAAd;AACA,cAAc,oBAAd;AACA,cAAc,gBAAd","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './common'\nexport * from './Collapser'\nexport * from './ConfigForm'\nexport * from './DocSdkCalls'\nexport * from './DataGrid'\nexport * from './LoginForm'\nexport * from './Loading'\nexport * from './MethodBadge'\nexport * from './PerfTracker'\nexport * from './RequestForm'\nexport * from './ResponseExplorer'\nexport * from './ShowResponse'\n"],"file":"index.js"}
1
+ {"version":3,"sources":["../../../src/components/index.ts"],"names":[],"mappings":"AA0BA,cAAc,UAAd;AACA,cAAc,aAAd;AACA,cAAc,cAAd;AACA,cAAc,mBAAd;AACA,cAAc,eAAd;AACA,cAAc,YAAd;AACA,cAAc,aAAd;AACA,cAAc,WAAd;AACA,cAAc,eAAd;AACA,cAAc,eAAd;AACA,cAAc,eAAd;AACA,cAAc,oBAAd;AACA,cAAc,gBAAd","sourcesContent":["/*\n\n MIT License\n\n Copyright (c) 2021 Looker Data Sciences, Inc.\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n */\n\nexport * from './common'\nexport * from './Collapser'\nexport * from './ConfigForm'\nexport * from './CopyLinkWrapper'\nexport * from './DocSdkCalls'\nexport * from './DataGrid'\nexport * from './LoginForm'\nexport * from './Loading'\nexport * from './MethodBadge'\nexport * from './PerfTracker'\nexport * from './RequestForm'\nexport * from './ResponseExplorer'\nexport * from './ShowResponse'\n"],"file":"index.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@looker/run-it",
3
- "version": "0.9.36",
3
+ "version": "0.9.37",
4
4
  "description": "A dynamic REST request input form and response visualizer",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",
@@ -30,7 +30,7 @@
30
30
  "watch": "yarn lerna exec --scope @looker/run-it --stream 'BABEL_ENV=build babel src --root-mode upward --out-dir lib/esm --source-maps --extensions .ts,.tsx --no-comments --watch'"
31
31
  },
32
32
  "devDependencies": {
33
- "@looker/components-test-utils": "^1.5.5",
33
+ "@looker/components-test-utils": "^1.5.26",
34
34
  "@testing-library/jest-dom": "^5.11.6",
35
35
  "@testing-library/react": "^11.2.2",
36
36
  "@testing-library/user-event": "^12.6.0",
@@ -51,16 +51,15 @@
51
51
  "webpack-dev-server": "^3.11.2"
52
52
  },
53
53
  "dependencies": {
54
- "@looker/code-editor": "^0.1.23",
55
- "@looker/components": "^2.8.1",
56
- "@looker/components-date": "^2.4.1",
57
- "@looker/design-tokens": "^2.7.1",
58
- "@looker/extension-utils": "^0.1.13",
54
+ "@looker/code-editor": "^0.1.24",
55
+ "@looker/components": "^3.0.8",
56
+ "@looker/design-tokens": "^2.7.21",
57
+ "@looker/extension-utils": "^0.1.14",
59
58
  "@looker/icons": "^1.5.3",
60
- "@looker/sdk": "^22.10.1",
61
- "@looker/sdk-codegen": "^21.7.0",
59
+ "@looker/sdk": "^22.12.1",
60
+ "@looker/sdk-codegen": "^21.7.1",
62
61
  "@looker/sdk-codegen-utils": "^21.0.11",
63
- "@looker/sdk-rtl": "^21.3.4",
62
+ "@looker/sdk-rtl": "^21.4.0",
64
63
  "@styled-icons/material": "^10.28.0",
65
64
  "@styled-icons/material-outlined": "^10.28.0",
66
65
  "@styled-icons/material-rounded": "^10.28.0",
@@ -73,5 +72,5 @@
73
72
  "react-is": "^16.13.1",
74
73
  "styled-components": "^5.2.1"
75
74
  },
76
- "gitHead": "a3eb0fd43de195627b1723faae1eba7c70fd43fb"
75
+ "gitHead": "028fb6cd1f84c23fd10d42041f3d572f4f724195"
77
76
  }