react-iframe-bridge 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,10 @@ export interface HomeProps {
17
17
  * Default path the iframe should load, if no path is found in local storage
18
18
  */
19
19
  defaultPath?: string;
20
+ /**
21
+ * List of possible page paths. Used for autocomplete in the path input.
22
+ */
23
+ pages?: string[];
20
24
  /**
21
25
  * Opt out of selecting a sample / selecting no sample before loading the iframe.
22
26
  * The sample selection UI will be hidden and the iframe will automatically load without a selected sample.
@@ -1 +1 @@
1
- {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/components/home/home.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CAWpC"}
1
+ {"version":3,"file":"home.d.ts","sourceRoot":"","sources":["../../../src/components/home/home.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,2CAgBpC"}
@@ -6,31 +6,32 @@ import HomeIframe from './home_iframe.js';
6
6
  import HomeNoSample from './home_no_sample.js';
7
7
  import HomeSamples from './home_samples.js';
8
8
  export function Home(props) {
9
- const { baseUrl, noSampleSelection, rocUrl, database, defaultPath } = props;
10
- return (_jsx(HomeContextProvider, { rocUrl: rocUrl, database: database, defaultPath: defaultPath, children: _jsx(HomeInternal, { noSampleSelection: noSampleSelection, baseUrl: baseUrl }) }));
9
+ const { baseUrl, noSampleSelection, rocUrl, database, defaultPath, pages } = props;
10
+ return (_jsx(HomeContextProvider, { rocUrl: rocUrl, database: database, defaultPath: defaultPath, children: _jsx(HomeInternal, { noSampleSelection: noSampleSelection, baseUrl: baseUrl, pages: pages }) }));
11
11
  }
12
12
  function HomeInternal(props) {
13
+ const { noSampleSelection, baseUrl, pages } = props;
13
14
  const homeDispatch = useHomeDispatchContext();
14
15
  useEffect(() => {
15
- if (props.noSampleSelection) {
16
+ if (noSampleSelection) {
16
17
  homeDispatch({
17
18
  type: 'OPEN_NO_SAMPLE',
18
19
  });
19
20
  }
20
- }, [props.noSampleSelection, homeDispatch]);
21
+ }, [noSampleSelection, homeDispatch]);
21
22
  return (_jsxs("div", { style: {
22
23
  display: 'flex',
23
24
  flexDirection: 'column',
24
25
  width: '100vw',
25
26
  height: '100vh',
26
- }, children: [_jsx(HomeHeader, {}), _jsxs("div", { style: {
27
+ }, children: [_jsx(HomeHeader, { pages: pages }), _jsxs("div", { style: {
27
28
  marginTop: '0.5rem',
28
29
  display: 'flex',
29
30
  minHeight: 0,
30
31
  flex: 1,
31
32
  flexDirection: 'row',
32
33
  borderTop: '1px solid #d1d5dc',
33
- }, children: [!props.noSampleSelection && (_jsxs("div", { style: {
34
+ }, children: [!noSampleSelection && (_jsxs("div", { style: {
34
35
  display: 'flex',
35
36
  width: '12rem',
36
37
  flexDirection: 'column',
@@ -39,6 +40,6 @@ function HomeInternal(props) {
39
40
  borderRight: '1px solid #d1d5dc',
40
41
  paddingInline: '0.5rem',
41
42
  paddingTop: '1rem',
42
- }, children: [_jsx(HomeNoSample, {}), _jsx(HomeSamples, {})] })), _jsx(HomeIframe, { baseUrl: props.baseUrl })] })] }));
43
+ }, children: [_jsx(HomeNoSample, {}), _jsx(HomeSamples, {})] })), _jsx(HomeIframe, { baseUrl: baseUrl })] })] }));
43
44
  }
44
45
  //# sourceMappingURL=home.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/components/home/home.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AA4B5C,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC5E,OAAO,CACL,KAAC,mBAAmB,IAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,YAExB,KAAC,YAAY,IAAC,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,GAAI,GACpD,CACvB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAuD;IAC3E,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,YAAY,CAAC;gBACX,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IAC5C,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO;SAChB,aAED,KAAC,UAAU,KAAG,EACd,eACE,KAAK,EAAE;oBACL,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,MAAM;oBACf,SAAS,EAAE,CAAC;oBACZ,IAAI,EAAE,CAAC;oBACP,aAAa,EAAE,KAAK;oBACpB,SAAS,EAAE,mBAAmB;iBAC/B,aAEA,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAC3B,eACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,KAAK,EAAE,OAAO;4BACd,aAAa,EAAE,QAAQ;4BACvB,GAAG,EAAE,SAAS;4BACd,QAAQ,EAAE,MAAM;4BAChB,WAAW,EAAE,mBAAmB;4BAChC,aAAa,EAAE,QAAQ;4BACvB,UAAU,EAAE,MAAM;yBACnB,aAED,KAAC,YAAY,KAAG,EAChB,KAAC,WAAW,KAAG,IACX,CACP,EACD,KAAC,UAAU,IAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAI,IAClC,IACF,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/components/home/home.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,YAAY,MAAM,qBAAqB,CAAC;AAC/C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAgC5C,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,GACxE,KAAK,CAAC;IACR,OAAO,CACL,KAAC,mBAAmB,IAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,YAExB,KAAC,YAAY,IACX,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,GACZ,GACkB,CACvB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,KAAiE;IAEjE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IACpD,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,EAAE,CAAC;YACtB,YAAY,CAAC;gBACX,IAAI,EAAE,gBAAgB;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IACtC,OAAO,CACL,eACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,OAAO;SAChB,aAED,KAAC,UAAU,IAAC,KAAK,EAAE,KAAK,GAAI,EAC5B,eACE,KAAK,EAAE;oBACL,SAAS,EAAE,QAAQ;oBACnB,OAAO,EAAE,MAAM;oBACf,SAAS,EAAE,CAAC;oBACZ,IAAI,EAAE,CAAC;oBACP,aAAa,EAAE,KAAK;oBACpB,SAAS,EAAE,mBAAmB;iBAC/B,aAEA,CAAC,iBAAiB,IAAI,CACrB,eACE,KAAK,EAAE;4BACL,OAAO,EAAE,MAAM;4BACf,KAAK,EAAE,OAAO;4BACd,aAAa,EAAE,QAAQ;4BACvB,GAAG,EAAE,SAAS;4BACd,QAAQ,EAAE,MAAM;4BAChB,WAAW,EAAE,mBAAmB;4BAChC,aAAa,EAAE,QAAQ;4BACvB,UAAU,EAAE,MAAM;yBACnB,aAED,KAAC,YAAY,KAAG,EAChB,KAAC,WAAW,KAAG,IACX,CACP,EACD,KAAC,UAAU,IAAC,OAAO,EAAE,OAAO,GAAI,IAC5B,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -1,2 +1,6 @@
1
- export default function HomeHeader(): import("react/jsx-runtime").JSX.Element;
1
+ interface HomeHeaderProps {
2
+ pages?: string[];
3
+ }
4
+ export default function HomeHeader(props: HomeHeaderProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
2
6
  //# sourceMappingURL=home_header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"home_header.d.ts","sourceRoot":"","sources":["../../../src/components/home/home_header.tsx"],"names":[],"mappings":"AAIA,MAAM,CAAC,OAAO,UAAU,UAAU,4CAwBjC"}
1
+ {"version":3,"file":"home_header.d.ts","sourceRoot":"","sources":["../../../src/components/home/home_header.tsx"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAK,EAAE,eAAe,2CAgCxD"}
@@ -1,9 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useId } from 'react';
2
3
  import Input from '../input.js';
3
4
  import { useHomeContext, useHomeDispatchContext } from './home_context.js';
4
- export default function HomeHeader() {
5
+ export default function HomeHeader(props) {
6
+ const { pages = [] } = props;
5
7
  const { rocUrl, database, iframePath } = useHomeContext();
6
8
  const dispatch = useHomeDispatchContext();
9
+ const pageListId = useId();
7
10
  return (_jsxs("header", { style: {
8
11
  display: 'flex',
9
12
  flexDirection: 'row',
@@ -11,6 +14,6 @@ export default function HomeHeader() {
11
14
  padding: '0.5rem',
12
15
  }, children: [_jsx(Input, { name: "rocUrl", style: { flex: 1 }, value: rocUrl, readOnly: true }), _jsx(Input, { name: "database", value: database, readOnly: true }), _jsx(Input, { name: "iframe-page", value: iframePath, style: { flex: 1 }, onChange: (event) => {
13
16
  dispatch({ type: 'SET_IFRAME_PAGE', payload: event.target.value });
14
- } })] }));
17
+ }, list: pageListId }), _jsx("datalist", { id: pageListId, children: pages.map((page) => (_jsx("option", { value: page }, page))) })] }));
15
18
  }
16
19
  //# sourceMappingURL=home_header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"home_header.js","sourceRoot":"","sources":["../../../src/components/home/home_header.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3E,MAAM,CAAC,OAAO,UAAU,UAAU;IAChC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,OAAO,CACL,kBACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,KAAK;YACpB,GAAG,EAAE,MAAM;YACX,OAAO,EAAE,QAAQ;SAClB,aAED,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAG,EACnE,KAAC,KAAK,IAAC,IAAI,EAAC,UAAU,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,SAAG,EACnD,KAAC,KAAK,IACJ,IAAI,EAAC,aAAa,EAClB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC,GACD,IACK,CACV,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"home_header.js","sourceRoot":"","sources":["../../../src/components/home/home_header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,KAAK,MAAM,aAAa,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAM3E,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,KAAsB;IACvD,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,sBAAsB,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC;IAC3B,OAAO,CACL,kBACE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,KAAK;YACpB,GAAG,EAAE,MAAM;YACX,OAAO,EAAE,QAAQ;SAClB,aAED,KAAC,KAAK,IAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAG,EACnE,KAAC,KAAK,IAAC,IAAI,EAAC,UAAU,EAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,SAAG,EACnD,KAAC,KAAK,IACJ,IAAI,EAAC,aAAa,EAClB,KAAK,EAAE,UAAU,EACjB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,QAAQ,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACrE,CAAC,EACD,IAAI,EAAE,UAAU,GAChB,EACF,mBAAU,EAAE,EAAE,UAAU,YACrB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,iBAAmB,KAAK,EAAE,IAAI,IAAjB,IAAI,CAAiB,CACnC,CAAC,GACO,IACJ,CACV,CAAC;AACJ,CAAC"}
@@ -5,6 +5,7 @@ interface InputProps {
5
5
  value: string;
6
6
  readOnly?: boolean;
7
7
  onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
8
+ list?: string;
8
9
  }
9
10
  export default function Input(props: InputProps): import("react/jsx-runtime").JSX.Element;
10
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAExD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC3D;AAED,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAK,EAAE,UAAU,2CAoB9C"}
1
+ {"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAExD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAK,EAAE,UAAU,2CAkB9C"}
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  export default function Input(props) {
3
- return (_jsx("input", { name: props.name, type: "text", style: {
3
+ const { style, ...otherProps } = props;
4
+ return (_jsx("input", { type: "text", style: {
4
5
  appearance: 'none',
5
6
  border: '1px solid #4a5565',
6
7
  backgroundColor: 'white',
@@ -8,7 +9,7 @@ export default function Input(props) {
8
9
  paddingBlock: '0.5rem',
9
10
  fontSize: '1rem',
10
11
  lineHeight: 1,
11
- ...props.style,
12
- }, value: props.value, readOnly: props.readOnly, onChange: props.onChange }));
12
+ ...style,
13
+ }, ...otherProps }));
13
14
  }
14
15
  //# sourceMappingURL=input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":";AAUA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,OAAO,CACL,gBACE,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,IAAI,EAAC,MAAM,EACX,KAAK,EAAE;YACL,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,mBAAmB;YAC3B,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,SAAS;YACxB,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,CAAC;YACb,GAAG,KAAK,CAAC,KAAK;SACf,EACD,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ,GACxB,CACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/components/input.tsx"],"names":[],"mappings":";AAWA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,KAAiB;IAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,GAAG,KAAK,CAAC;IACvC,OAAO,CACL,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE;YACL,UAAU,EAAE,MAAM;YAClB,MAAM,EAAE,mBAAmB;YAC3B,eAAe,EAAE,OAAO;YACxB,aAAa,EAAE,SAAS;YACxB,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,CAAC;YACb,GAAG,KAAK;SACT,KACG,UAAU,GACd,CACH,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-iframe-bridge",
3
- "version": "2.0.2",
3
+ "version": "2.1.0",
4
4
  "description": "React hooks and components to work with iframe-bridge.",
5
5
  "type": "module",
6
6
  "exports": "./lib/index.js",
@@ -25,6 +25,10 @@ export interface HomeProps {
25
25
  * Default path the iframe should load, if no path is found in local storage
26
26
  */
27
27
  defaultPath?: string;
28
+ /**
29
+ * List of possible page paths. Used for autocomplete in the path input.
30
+ */
31
+ pages?: string[];
28
32
  /**
29
33
  * Opt out of selecting a sample / selecting no sample before loading the iframe.
30
34
  * The sample selection UI will be hidden and the iframe will automatically load without a selected sample.
@@ -33,27 +37,35 @@ export interface HomeProps {
33
37
  }
34
38
 
35
39
  export function Home(props: HomeProps) {
36
- const { baseUrl, noSampleSelection, rocUrl, database, defaultPath } = props;
40
+ const { baseUrl, noSampleSelection, rocUrl, database, defaultPath, pages } =
41
+ props;
37
42
  return (
38
43
  <HomeContextProvider
39
44
  rocUrl={rocUrl}
40
45
  database={database}
41
46
  defaultPath={defaultPath}
42
47
  >
43
- <HomeInternal noSampleSelection={noSampleSelection} baseUrl={baseUrl} />
48
+ <HomeInternal
49
+ noSampleSelection={noSampleSelection}
50
+ baseUrl={baseUrl}
51
+ pages={pages}
52
+ />
44
53
  </HomeContextProvider>
45
54
  );
46
55
  }
47
56
 
48
- function HomeInternal(props: Pick<HomeProps, 'baseUrl' | 'noSampleSelection'>) {
57
+ function HomeInternal(
58
+ props: Pick<HomeProps, 'baseUrl' | 'noSampleSelection' | 'pages'>,
59
+ ) {
60
+ const { noSampleSelection, baseUrl, pages } = props;
49
61
  const homeDispatch = useHomeDispatchContext();
50
62
  useEffect(() => {
51
- if (props.noSampleSelection) {
63
+ if (noSampleSelection) {
52
64
  homeDispatch({
53
65
  type: 'OPEN_NO_SAMPLE',
54
66
  });
55
67
  }
56
- }, [props.noSampleSelection, homeDispatch]);
68
+ }, [noSampleSelection, homeDispatch]);
57
69
  return (
58
70
  <div
59
71
  style={{
@@ -63,7 +75,7 @@ function HomeInternal(props: Pick<HomeProps, 'baseUrl' | 'noSampleSelection'>) {
63
75
  height: '100vh',
64
76
  }}
65
77
  >
66
- <HomeHeader />
78
+ <HomeHeader pages={pages} />
67
79
  <div
68
80
  style={{
69
81
  marginTop: '0.5rem',
@@ -74,7 +86,7 @@ function HomeInternal(props: Pick<HomeProps, 'baseUrl' | 'noSampleSelection'>) {
74
86
  borderTop: '1px solid #d1d5dc',
75
87
  }}
76
88
  >
77
- {!props.noSampleSelection && (
89
+ {!noSampleSelection && (
78
90
  <div
79
91
  style={{
80
92
  display: 'flex',
@@ -91,7 +103,7 @@ function HomeInternal(props: Pick<HomeProps, 'baseUrl' | 'noSampleSelection'>) {
91
103
  <HomeSamples />
92
104
  </div>
93
105
  )}
94
- <HomeIframe baseUrl={props.baseUrl} />
106
+ <HomeIframe baseUrl={baseUrl} />
95
107
  </div>
96
108
  </div>
97
109
  );
@@ -1,10 +1,18 @@
1
+ import { useId } from 'react';
2
+
1
3
  import Input from '../input.js';
2
4
 
3
5
  import { useHomeContext, useHomeDispatchContext } from './home_context.js';
4
6
 
5
- export default function HomeHeader() {
7
+ interface HomeHeaderProps {
8
+ pages?: string[];
9
+ }
10
+
11
+ export default function HomeHeader(props: HomeHeaderProps) {
12
+ const { pages = [] } = props;
6
13
  const { rocUrl, database, iframePath } = useHomeContext();
7
14
  const dispatch = useHomeDispatchContext();
15
+ const pageListId = useId();
8
16
  return (
9
17
  <header
10
18
  style={{
@@ -23,7 +31,13 @@ export default function HomeHeader() {
23
31
  onChange={(event) => {
24
32
  dispatch({ type: 'SET_IFRAME_PAGE', payload: event.target.value });
25
33
  }}
34
+ list={pageListId}
26
35
  />
36
+ <datalist id={pageListId}>
37
+ {pages.map((page) => (
38
+ <option key={page} value={page} />
39
+ ))}
40
+ </datalist>
27
41
  </header>
28
42
  );
29
43
  }
@@ -6,12 +6,13 @@ interface InputProps {
6
6
  value: string;
7
7
  readOnly?: boolean;
8
8
  onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
9
+ list?: string;
9
10
  }
10
11
 
11
12
  export default function Input(props: InputProps) {
13
+ const { style, ...otherProps } = props;
12
14
  return (
13
15
  <input
14
- name={props.name}
15
16
  type="text"
16
17
  style={{
17
18
  appearance: 'none',
@@ -21,11 +22,9 @@ export default function Input(props: InputProps) {
21
22
  paddingBlock: '0.5rem',
22
23
  fontSize: '1rem',
23
24
  lineHeight: 1,
24
- ...props.style,
25
+ ...style,
25
26
  }}
26
- value={props.value}
27
- readOnly={props.readOnly}
28
- onChange={props.onChange}
27
+ {...otherProps}
29
28
  />
30
29
  );
31
30
  }