@telia-ace/widget-types-grid 1.0.22 → 1.0.23

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.
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
- Copyright © 2021, Telia Company AB. All rights reserved.
2
-
3
- THIS PACKAGE AND CONTAINING SOFTWARE IS PART OF
4
- THE HUMANY SERVICE. BY USING THIS SOFTWARE YOU
5
- AGREE TO THE FOLLOWING TERMS AND CONDITIONS:
1
+ Copyright © 2021, Telia Company AB. All rights reserved.
2
+
3
+ THIS PACKAGE AND CONTAINING SOFTWARE IS PART OF
4
+ THE HUMANY SERVICE. BY USING THIS SOFTWARE YOU
5
+ AGREE TO THE FOLLOWING TERMS AND CONDITIONS:
6
6
  http://www.humany.com/legal
package/README.md CHANGED
@@ -1,3 +1,3 @@
1
- # `@telia-ace/widget-types-grid`
2
-
3
- The type definition for ACE One Widget (exported as `GridWidget`).
1
+ # `@telia-ace/widget-types-grid`
2
+
3
+ The type definition for ACE One Widget (exported as `GridWidget`).
@@ -1,13 +1,13 @@
1
- import { ChangesetOptions, ChangesetProvider, ComponentNodeSettings, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';
2
- import { StorageWriter } from '@telia-ace/widget-services';
3
- import { Container, Widget } from '@webprovisions/platform';
4
- export declare class LocalStorageChangesetProvider implements ChangesetProvider {
5
- private container;
6
- private storageWriter;
7
- constructor(container: Container, storageWriter: StorageWriter);
8
- static create(container: Container): Promise<LocalStorageChangesetProvider>;
9
- write(key: string, target: ComponentQuery, attributes: Partial<ComponentNodeSettings>, options: ChangesetOptions): Promise<any>;
10
- remove(key: string): Promise<any>;
11
- load(platform: ComponentPlatform): Promise<any>;
12
- }
13
- export declare const createPlatform: (widget: Widget) => Promise<ComponentPlatform>;
1
+ import { ChangesetOptions, ChangesetProvider, ComponentNodeSettings, ComponentPlatform, ComponentQuery } from '@telia-ace/widget-core';
2
+ import { StorageWriter } from '@telia-ace/widget-services';
3
+ import { Container, Widget } from '@webprovisions/platform';
4
+ export declare class LocalStorageChangesetProvider implements ChangesetProvider {
5
+ private container;
6
+ private storageWriter;
7
+ constructor(container: Container, storageWriter: StorageWriter);
8
+ static create(container: Container): Promise<LocalStorageChangesetProvider>;
9
+ write(key: string, target: ComponentQuery, attributes: Partial<ComponentNodeSettings>, options: ChangesetOptions): Promise<any>;
10
+ remove(key: string): Promise<any>;
11
+ load(platform: ComponentPlatform): Promise<any>;
12
+ }
13
+ export declare const createPlatform: (widget: Widget) => Promise<ComponentPlatform>;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export { default as Component } from './ui/component';
2
- export { default as DetachedComponent } from './ui/detached-component';
3
- export { default as NotFound } from './ui/not-found';
4
- export { styling as genericComponentStyling } from './ui/styles';
5
- export { default as GridWidget, default as Widget } from './widget';
1
+ export { default as Component } from './ui/component';
2
+ export { default as DetachedComponent } from './ui/detached-component';
3
+ export { default as NotFound } from './ui/not-found';
4
+ export { styling as genericComponentStyling } from './ui/styles';
5
+ export { default as GridWidget, default as Widget } from './widget';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/ui/determine-slide-direction.ts","../src/ui/switch.tsx","../src/ui/animated-view.tsx","../src/ui/view.tsx","../src/ui/styles.ts","../src/ui/resolvable-component.tsx","../src/ui/use-component-node-properties.ts","../src/ui/component.tsx","../src/ui/detached-component.tsx","../src/ui/not-found.tsx","../src/ui/html-element-handlers.ts","../src/ui/prepare-dom.ts","../src/ui/view-outlet.ts","../src/component-platform-factory.ts","../src/site-provider.ts","../src/services.ts","../src/widget.ts"],"sourcesContent":["export enum SlideDirection {\n back = 'back',\n forth = 'forth',\n}\n\nexport interface RouteStructure {\n name: string;\n children: RouteStructure[];\n}\n\n/**\n * Recursively find the parents of a nested route\n * @param routeName Name of route to find\n * @param routes Routes to look in\n * @param trail Trail of parents\n * @param level Level of the array currently looking in\n */\nexport const findParentRoutes = (\n routeName: string,\n routes: RouteStructure[],\n trail: string[] = [],\n level: number = 0\n): string[] | null => {\n let found: any = null;\n\n routes.forEach((route, index) => {\n if (!found) {\n if (route.name === routeName) {\n found = route;\n } else {\n trail[level] = route.name;\n found = findParentRoutes(routeName, route.children, trail, level + 1);\n }\n }\n });\n\n if (!found) {\n return null;\n }\n\n return trail;\n};\n\n/**\n * Determine if the sliding animation should back or forth\n * @param currentRouteName Name of current route\n * @param nextRouteName Name of route to transition to\n * @param routeRanking Hierarchical route ranking for the widget\n */\nexport const determineSlideDirection = (\n currentRouteName: string,\n nextRouteName: string,\n routeRanking: RouteRanking\n): SlideDirection => {\n if (\n typeof routeRanking[currentRouteName] === 'number' &&\n typeof routeRanking[nextRouteName] === 'number' &&\n routeRanking[currentRouteName] > routeRanking[nextRouteName]\n ) {\n return SlideDirection.back;\n }\n return SlideDirection.forth;\n};\n\nexport type RouteRanking = { [key: string]: number };\n","import { ViewDefinition } from '@telia-ace/widget-core';\nimport React from 'react';\nimport { Route, Switch as RouteSwitch } from 'react-router';\n\ntype Props = {\n location?: any;\n views: { [key: string]: ViewDefinition };\n render: (viewName: string) => JSX.Element | null;\n};\n\nconst Switch: React.FC<Props> = ({ views, location, render }) => {\n return (\n <RouteSwitch\n location={\n location\n ? {\n ...location,\n pathname: location.pathname.split('?')[0],\n }\n : location\n }\n >\n {[\n ...Object.keys(views).filter((key) => !!views[key].path),\n ...Object.keys(views).filter((key) => !views[key].path),\n ].map((name) => {\n const { path } = views[name];\n\n if (!path) {\n return <Route key={name} render={() => render(name)} />;\n }\n\n if (Array.isArray(path)) {\n return path.map((path: string) => (\n <Route key={name} exact path={path} render={() => render(name)} />\n ));\n }\n return <Route key={name} exact path={path} render={() => render(name)} />;\n })}\n </RouteSwitch>\n );\n};\n\nexport default Switch;\n","import { WidgetSettings } from '@telia-ace/widget-core';\nimport {\n Grid,\n transitionComposer,\n useComponentNode,\n useContainer,\n useContext,\n useProperties,\n useRouteData,\n useRouter,\n useScroll,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { useState } from 'react';\nimport { Transition, TransitionGroup } from 'react-transition-group';\nimport { TransitionStatus } from 'react-transition-group/Transition';\nimport styled from 'styled-components';\nimport Component from './component';\nimport { determineSlideDirection, RouteRanking, SlideDirection } from './determine-slide-direction';\nimport Switch from './switch';\n\ntype Props = {\n className?: string;\n};\n\nconst StyledViewContainer = styled.div`\n position: relative;\n width: 100%;\n flex: 1;\n`;\n\nconst StyledView = styled(Grid)<{ scrollableCss?: any; animationCss?: any }>`\n position: absolute;\n left: 0;\n right: 0;\n ${(p) => !!p.animationCss && p.animationCss}\n ${(p) => !!p.scrollableCss && p.scrollableCss}\n`;\n\nconst routeHierarchy: RouteRanking = {\n index: 1,\n search: 2,\n browse: 3,\n guide: 4,\n contact: 5,\n 'contact-method': 6,\n conversation: 7,\n};\n\nconst AnimatedView: React.FC<Props> = ({ className = '', ...other }) => {\n const [routeName, setRouteName] = useState('index');\n const [transitionDirection, setTransitionDirection] = useState(SlideDirection.forth);\n const nextRoute = useRouteData();\n const router = useRouter();\n\n const properties = useProperties();\n const context = useContext();\n const container = useContainer();\n const node = useComponentNode();\n\n const { gap = '0' } = context;\n const { columns = 1, animation = 'none', scrollable = false, ...areaProperties } = properties;\n\n const [scrollableCss, elem] = useScroll(scrollable);\n\n if (!node || !router) {\n return null;\n }\n\n const { location } = router;\n\n if (nextRoute.name !== routeName && nextRoute.name !== '' && animation) {\n setTransitionDirection(determineSlideDirection(routeName, nextRoute.name, routeHierarchy));\n setRouteName(nextRoute.name);\n }\n\n const { views }: WidgetSettings = container.get('$settings');\n\n if (!Object.keys(views).length) {\n return null;\n }\n\n const renderView = (name: string, transitionState?: any, direction?: SlideDirection) => {\n const animationStyles = getAnimation(transitionState, direction);\n const childNode = node.getChildren(name)[0];\n\n return (\n <StyledView\n {...other}\n {...areaProperties}\n scrollableCss={scrollableCss}\n ref={elem}\n columns={columns}\n gap={gap}\n {...animationStyles}\n className={appendClassNames(className, 'humany-view')}\n >\n <Component id={childNode.id} branch=\"default\" />\n </StyledView>\n );\n };\n\n const getAnimation = (transitionState?: any, direction?: SlideDirection) => {\n if (animation === 'slide' || animation === 'fade') {\n return {\n animationCss: transitionComposer.composeViewTransition(\n transitionState,\n animation,\n direction\n ),\n ['data-state']: transitionState,\n };\n }\n return;\n };\n\n return (\n <StyledViewContainer className=\"humany-animated-view\">\n <TransitionGroup\n component={null}\n childFactory={(child) =>\n React.cloneElement(child, { direction: transitionDirection })\n }\n >\n <Transition\n key={routeName}\n timeout={{ enter: 500, exit: 500 }}\n onEnter={(node: HTMLElement) => node?.clientHeight}\n unmountOnExit={true}\n direction={SlideDirection.forth}\n >\n {(state: TransitionStatus, { direction }: { direction: SlideDirection }) => (\n <Switch\n views={views}\n location={location}\n render={(name) => renderView(name, state, direction)}\n />\n )}\n </Transition>\n </TransitionGroup>\n </StyledViewContainer>\n );\n};\n\nexport default AnimatedView;\n","import { WidgetSettings } from '@telia-ace/widget-core';\nimport {\n Grid,\n useComponentNode,\n useContainer,\n useContext,\n useProperties,\n useScroll,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React from 'react';\nimport styled from 'styled-components';\nimport Component from './component';\nimport Switch from './switch';\n\ntype Props = {\n className?: string;\n};\n\nconst StyledView = styled(Grid)<{ scrollableCss?: string }>`\n ${(p) => !!p.scrollableCss && p.scrollableCss}\n`;\n\nconst View: React.FC<Props> = ({ className = '', ...other }) => {\n const properties = useProperties();\n const context = useContext();\n const container = useContainer();\n const node = useComponentNode();\n\n const { views }: WidgetSettings = container.get('$settings');\n\n const { gap = '0' } = context;\n const { columns = 1, animation = 'none', scrollable = false, ...areaProperties } = properties;\n\n const [scrollableCss, elem] = useScroll(scrollable);\n\n if (!node) {\n return null;\n }\n\n return (\n <StyledView\n {...other}\n {...areaProperties}\n scrollableCss={scrollableCss}\n ref={elem}\n columns={columns}\n gap={gap}\n className={appendClassNames(className, 'humany-view')}\n >\n <Switch\n views={views}\n render={(name) => {\n const childNode = node.getChildren(name)[0];\n return <Component id={childNode.id} node={childNode} branch=\"default\" />;\n }}\n />\n </StyledView>\n );\n};\n\nexport default View;\n","import { paddedBorderTabStyle } from '@telia-ace/widget-ui';\nimport styled, { css } from 'styled-components';\nimport AnimatedView from './animated-view';\nimport View from './view';\n\nexport const styling = css<{\n 'data-width': number;\n 'data-indent': number;\n}>`\n outline: none;\n box-sizing: border-box;\n * {\n ${(p) => !p.theme.accessibility?.isTabbing && 'outline: none;'}\n box-sizing: border-box;\n }\n\n grid-column: ${(p) =>\n p['data-indent']\n ? `${p['data-indent'] + 1} / ${p['data-indent'] + p['data-width'] + 1}`\n : `span ${p['data-width']}`};\n\n ${(p) =>\n p.theme.fonts?.type &&\n `\n font-family: ${p.theme.fonts.type};\n\n input, textarea {\n font-family: ${p.theme.fonts.type};\n }\n `}\n\n ${(p) =>\n p.theme.fonts?.base &&\n `\n font-size: ${p.theme.fonts.base};\n `}\n\n &:focus {\n ${(p: any) => p.theme.accessibility?.isTabbing && paddedBorderTabStyle};\n }\n`;\n\nexport const StyledView = styled(View)`\n ${styling}\n`;\n\nexport const StyledAnimatedView = styled(AnimatedView)`\n ${styling}\n`;\n","import {\n filterCssPropsStyle,\n Typography,\n useComponent,\n useComponentDescriptor,\n} from '@telia-ace/widget-ui';\nimport { appendClassNames } from '@telia-ace/widget-utilities';\nimport React, { forwardRef, Suspense, useMemo } from 'react';\nimport styled, { css } from 'styled-components';\nimport { styling } from './styles';\n\ntype Props = {\n role?: string;\n className?: string;\n};\n\nconst NonResolvedComponentWrapper = styled.div<any>`\n text-align: center;\n ${(p) =>\n typeof p.theme.colors?.warning !== 'undefined' &&\n css`\n color: ${p.theme.colors?.warning};\n border: 2px dashed ${p.theme.colors?.warning};\n `}\n ${(p) =>\n typeof p.theme.borderRadius !== 'undefined' && `border-radius: ${p.theme.borderRadius};`}\n ${styling}\n`;\n\nconst ResolvableComponent = forwardRef<HTMLElement, Props>(\n ({ className = '', children, ...other }, ref) => {\n const ResolvedComponent = useComponent();\n const { name, type, id } = useComponentDescriptor();\n\n const StyledResolvableComponent = useMemo(() => {\n if (ResolvedComponent) {\n return styled(ResolvedComponent)<any>`\n ${styling}\n ${filterCssPropsStyle}\n `;\n }\n return null;\n }, [ResolvedComponent]);\n\n if (typeof ResolvedComponent === 'undefined') {\n return null;\n }\n\n if (ResolvedComponent === null || StyledResolvableComponent === null) {\n if (process.env.NODE_ENV !== 'production') {\n return (\n <NonResolvedComponentWrapper\n {...other}\n title={`type: ${type}, definition-id: ${name}, instance-id: ${id}`}\n className={appendClassNames(className, 'humany-non-resolved-component')}\n >\n <Typography variant=\"h5\">Non Resolved Component Type</Typography>\n </NonResolvedComponentWrapper>\n );\n }\n return null;\n }\n\n return (\n <Suspense fallback={null}>\n <StyledResolvableComponent\n ref={ref}\n {...other}\n className={appendClassNames(\n className,\n 'humany-component',\n `humany-component-${name}`\n )}\n >\n {children}\n </StyledResolvableComponent>\n </Suspense>\n );\n }\n);\n\nexport default ResolvableComponent;\n","import { ComponentNodeProperties } from '@telia-ace/widget-core';\nimport { useComponentNode, useComponentPlatform, useIsMounted } from '@telia-ace/widget-ui';\nimport { useEffect, useState } from 'react';\n\nexport default (id: string) => {\n const node = useComponentNode(id);\n const components = useComponentPlatform();\n const [properties, setProperties] = useState<ComponentNodeProperties>({});\n const isMounted = useIsMounted();\n\n useEffect(() => {\n if (node && isMounted.current) {\n setProperties(node.attributes.properties);\n }\n }, [node, id, isMounted]);\n\n useEffect(() => {\n if (components) {\n const unsubscribe = components.events.subscribe(\n 'components:properties-changed',\n (event, data) => {\n if (node === data.node && isMounted.current) {\n setProperties(data.node.attributes.properties);\n }\n }\n );\n\n return () => {\n unsubscribe();\n };\n }\n }, [components, isMounted, id, node]);\n\n return properties;\n};\n","import { asDescriptor, ComponentDescriptor, ComponentNode, Size } from '@telia-ace/widget-core';\nimport {\n ComponentNodeContext,\n ComponentPropertyContext,\n filterCssProps,\n useColumns,\n useComponentPlatform,\n useContainer,\n useContext,\n useLayout,\n} from '@telia-ace/widget-ui';\nimport React, { forwardRef, useEffect, useState } from 'react';\nimport { DefaultTheme, ThemeContext, ThemeProvider } from 'styled-components';\nimport ResolvableComponent from './resolvable-component';\nimport { StyledAnimatedView, StyledView } from './styles';\nimport useComponentNodeProperties from './use-component-node-properties';\n\ntype Props = {\n className?: string;\n isTabbing?: boolean;\n id: string;\n branch: string;\n node?: ComponentNode;\n ariaLabel?: string;\n tabIndex?: number;\n context?: { [key: string]: any };\n};\n\nconst isVisible = (size: Size, node?: ComponentNode) => {\n if (node) {\n return true;\n }\n if (typeof size === 'string') {\n return size === 'full';\n }\n return size > 0;\n};\n\nconst Component = forwardRef<HTMLElement, Props>(\n (\n {\n className = '',\n isTabbing = false,\n id,\n branch,\n node,\n ariaLabel,\n tabIndex,\n context: extraContext,\n ...other\n },\n ref\n ) => {\n const components = useComponentPlatform();\n const container = useContainer();\n const [descriptor, setDescriptor] = useState<ComponentDescriptor>();\n\n const themeContext = React.useContext(ThemeContext) || {};\n const columns = useColumns();\n const context = useContext(id);\n const properties = useComponentNodeProperties(id);\n const { size = 'none', indent = 0 } = useLayout(id);\n const visible = isVisible(size, node);\n\n useEffect(() => {\n if (components) {\n if (id && !node) {\n const componentNode = components.nodes.get(id);\n if (componentNode) {\n setDescriptor(asDescriptor(componentNode, branch));\n\n if (visible) {\n const unmount = componentNode.mount(container);\n return () => {\n unmount();\n };\n }\n }\n } else if (node) {\n setDescriptor(asDescriptor(node, branch));\n const unmount = node.mount(container);\n return () => {\n unmount();\n };\n }\n }\n }, [components, id, node, visible]);\n\n if (!descriptor || !visible) {\n return null;\n }\n\n const mergedContexts = { ...context, ...(extraContext || {}) };\n const {\n cardinal,\n fonts: contextFonts = {},\n accessibility = {},\n ...restContext\n } = mergedContexts;\n\n const fonts = {\n type: contextFonts.type,\n base: contextFonts.base || '16px',\n small: contextFonts.small || '0.8em',\n normal: contextFonts.normal || '1em',\n medium: contextFonts.medium || '1.2em',\n large: contextFonts.large || '1.6em',\n huge: contextFonts.huge || '2.5em',\n };\n\n const theme: DefaultTheme = {\n ...restContext,\n fonts,\n accessibility: {\n ...accessibility,\n isTabbing: themeContext.accessibility?.isTabbing || isTabbing,\n },\n };\n\n if (typeof cardinal === 'number') {\n theme.sizes = {\n cardinal,\n small: `${cardinal}px`,\n normal: `${cardinal * 3}px`,\n medium: `${cardinal * 5}px`,\n large: `${cardinal * 8}px`,\n };\n }\n\n return (\n <ThemeProvider theme={theme}>\n <ComponentNodeContext.Provider value={descriptor}>\n <ComponentPropertyContext.Provider value={properties}>\n {(() => {\n const props = {\n 'data-width':\n size === 'full' ? columns : Math.min(size as number, columns),\n 'data-indent': indent,\n 'data-name': descriptor.name,\n 'data-node-id': descriptor.id,\n 'data-component-type': descriptor.type,\n 'aria-label': ariaLabel,\n tabIndex: tabIndex,\n id: descriptor.id,\n role: properties && properties.role,\n ...other,\n };\n switch (descriptor.type) {\n case 'view': {\n return typeof properties.animation === 'string' &&\n properties.animation !== 'none' ? (\n <StyledAnimatedView {...props} className={className} />\n ) : (\n <StyledView {...props} className={className} />\n );\n }\n default: {\n const cssProps = filterCssProps(properties);\n\n return (\n <ResolvableComponent\n ref={ref}\n {...props}\n {...cssProps}\n className={className}\n />\n );\n }\n }\n })()}\n </ComponentPropertyContext.Provider>\n </ComponentNodeContext.Provider>\n </ThemeProvider>\n );\n }\n);\n\nexport default Component;\n","import { ComponentNode, ComponentPlatform } from '@telia-ace/widget-core';\nimport { useContainer } from '@telia-ace/widget-ui';\nimport React, { useEffect, useState } from 'react';\nimport Component from './component';\n\ntype Props = {\n builder: (components: ComponentPlatform) => Promise<ComponentNode>;\n};\nconst DetachedComponent: React.FC<Props> = ({ builder }) => {\n const container = useContainer();\n const [node, setNode] = useState<ComponentNode | null>(null);\n\n useEffect(() => {\n container.getAsync('components').then((components: ComponentPlatform) => {\n return builder(components).then((createdNode) => {\n setNode(createdNode);\n });\n });\n }, []);\n\n useEffect(() => {\n return () => {\n if (node) {\n container.getAsync('components').then((components: ComponentPlatform) => {\n components.nodes.detached = components.nodes.detached.filter(\n (n) => n.id !== node.id\n );\n });\n }\n };\n }, [node]);\n\n if (!node) {\n return null;\n }\n\n return <Component id={node.id} node={node} branch=\"default\" />;\n};\n\nexport default DetachedComponent;\n","import { ComponentPlatform } from '@telia-ace/widget-core';\nimport { useContainer } from '@telia-ace/widget-ui';\nimport React, { useContext } from 'react';\nimport { ThemeContext } from 'styled-components';\n\nconst DetachedComponent = React.lazy(() => import('./detached-component'));\n\ntype Props = {\n showSearch?: boolean;\n};\nconst NotFound: React.FC<Props> = ({ showSearch = false }) => {\n const themeContext = useContext(ThemeContext);\n const container = useContainer();\n\n return (\n <React.Suspense fallback={null}>\n <DetachedComponent\n builder={(components: ComponentPlatform) => {\n return container.get('settings').then((settings: any) => {\n const { properties, context } = Object.keys(settings.components).reduce<{\n properties: any;\n context: any;\n }>(\n (acc, key) => {\n if (settings.components[key].type === 'not-found') {\n acc.properties = settings.components[key].properties;\n acc.context = settings.components[key].context;\n }\n\n return acc;\n },\n { properties: {}, context: {} }\n );\n\n properties.showSearch = showSearch;\n const node = components.createNode('area', { detached: true });\n node.name = 'not-found-area';\n node.writeLayout({\n size: 'full',\n });\n\n if (showSearch) {\n const searchComponentProps = Object.keys(settings.components).reduce(\n (acc, key) => {\n if (settings.components[key].type === 'search') {\n return settings.components[key].properties;\n }\n\n return acc;\n },\n {}\n );\n const searchNode = components.createNode('search', { detached: true });\n searchNode.writeLayout({ size: 'full' });\n searchNode.writeProperties({\n 'css-margin-bottom': themeContext?.sizes?.normal || '15px',\n ...searchComponentProps,\n });\n node.appendChild(searchNode);\n }\n\n const notFoundNode = components.createNode('not-found', { detached: true });\n notFoundNode.writeLayout({ size: 'full' });\n notFoundNode.writeProperties(properties);\n notFoundNode.writeContext(context);\n node.appendChild(notFoundNode);\n\n return node;\n });\n }}\n />\n </React.Suspense>\n );\n};\n\nexport default NotFound;\n","// tslint:disable max-line-length\nexport const renderSymbol = (symbol?: { type: string; content: string }) => {\n if (symbol) {\n const { type, content } = symbol;\n switch (type) {\n case 'FontAwesome':\n return `<i class=\"humany-icon fa fa-${content}\"></i>`;\n case 'Uri':\n return `<i class=\"humany-icon humany-custom-icon\" style=\"background: url(${content}) no-repeat center center;background-size: contain;\"></i>`;\n default:\n return '';\n }\n }\n};\n\nconst triggerTabHandler = (triggerDOMElement: HTMLElement) => {\n const toggleTabbing = (element: HTMLElement, tabbing: boolean) => {\n if (!element) {\n return;\n }\n\n if (tabbing) {\n element.classList.add('humany-tabbing');\n } else {\n element.classList.remove('humany-tabbing');\n }\n };\n\n const handleKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Tab') {\n toggleTabbing(triggerDOMElement, true);\n } else if (\n !(\n e.key === 'Enter' &&\n document.activeElement &&\n document.activeElement.classList.contains('humany-trigger')\n )\n ) {\n toggleTabbing(triggerDOMElement, false);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n if (\n document.activeElement &&\n document.activeElement.classList.contains('humany-trigger') &&\n document.activeElement.classList.contains('humany-tabbing')\n ) {\n return;\n }\n toggleTabbing(triggerDOMElement, false);\n };\n\n document.addEventListener('keydown', handleKeydown);\n document.addEventListener('click', handleClick);\n\n return () => {\n document.removeEventListener('keydown', handleKeydown);\n document.removeEventListener('click', handleClick);\n };\n};\n\nexport type TriggerElementOptions = {\n symbol?: { type: string; content: string };\n widgetName: string;\n label?: string;\n ariaLabel?: string;\n tooltip?: string;\n};\n\nexport function createTriggerElement(element: HTMLElement, options: TriggerElementOptions) {\n const { symbol, widgetName, label = '', ariaLabel = '', tooltip = '' } = options;\n\n element.classList.add('humany-trigger');\n element.classList.add(`humany_${widgetName}`);\n\n if (label.length) {\n element.classList.add('humany-has-text');\n }\n\n if (ariaLabel.length && !element.getAttribute('aria-label')) {\n element.setAttribute('aria-label', ariaLabel);\n }\n\n if (ariaLabel.length && !element.getAttribute('tabindex')) {\n element.setAttribute('tabindex', '0');\n }\n\n if (tooltip.length && !element.getAttribute('title')) {\n element.setAttribute('title', tooltip);\n }\n\n const symbolHtml = renderSymbol(symbol) || '';\n element.innerHTML = `${symbolHtml}\n <span class=\"humany-close\">\n <svg width=\"18\" height=\"9\" viewBox=\"0 0 18 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M9 9C8.81794 9.00045 8.63759 8.96634 8.46939 8.89965C8.3012 8.83295 8.14851 8.735 8.02015 8.61145L0.194523 1.12367C0.068294 0.99862 -0.00155266 0.831133 2.61958e-05 0.657285C0.00160506 0.483436 0.0744832 0.317136 0.202964 0.194202C0.331445 0.0712675 0.505249 0.00153576 0.686941 2.50649e-05C0.868634 -0.00148563 1.04368 0.0653456 1.17437 0.186125L9 7.6739L16.8256 0.186125C16.9563 0.0653456 17.1314 -0.00148563 17.3131 2.50649e-05C17.4948 0.00153576 17.6686 0.0712675 17.797 0.194202C17.9255 0.317136 17.9984 0.483436 18 0.657285C18.0016 0.831133 17.9317 0.99862 17.8055 1.12367L9.97985 8.61145C9.85149 8.735 9.6988 8.83295 9.53061 8.89965C9.36241 8.96634 9.18206 9.00045 9 9Z\" fill=\"white\"/>\n </svg>\n </span>\n <span class=\"humany-loader\">\n <svg viewBox=\"25 25 50 50\">\n <circle\n cx=\"50\"\n cy=\"50\"\n r=\"20\"\n fill=\"none\"\n stroke=\"#000\"\n stroke-width=\"2\"\n stroke-miterlimit=\"10\" />\n </svg>\n </span>\n ${label.length ? `<span>${label}</span>` : ''}`;\n\n setTimeout(() => element && (element as HTMLElement).classList.add('humany-rendered'));\n\n return triggerTabHandler(element);\n}\n\nexport function setInactive(elements: HTMLElement | HTMLElement[], title?: string) {\n if (elements instanceof HTMLElement) {\n if (title) {\n elements.setAttribute('title', title);\n }\n elements.classList.remove('humany-active');\n elements.classList.remove('humany-loading');\n } else if (elements instanceof Array) {\n elements.forEach((e) => {\n if (title) {\n e.setAttribute('title', title);\n }\n e.classList.remove('humany-active');\n e.classList.remove('humany-loading');\n });\n }\n}\nexport function setLoading(elements: HTMLElement | HTMLElement[]) {\n if (elements instanceof HTMLElement) {\n elements.classList.remove('humany-active');\n elements.classList.add('humany-loading');\n } else if (elements instanceof Array) {\n elements.forEach((e) => {\n e.classList.remove('humany-active');\n e.classList.add('humany-loading');\n });\n }\n}\nexport function setActive(elements: HTMLElement | HTMLElement[], title?: string) {\n if (elements instanceof HTMLElement) {\n if (title) {\n elements.setAttribute('title', title);\n }\n elements.classList.add('humany-active');\n elements.classList.remove('humany-loading');\n } else if (elements instanceof Array) {\n elements.forEach((e) => {\n if (title) {\n e.setAttribute('title', title);\n }\n e.classList.add('humany-active');\n e.classList.remove('humany-loading');\n });\n }\n}\n","import { ViewOutletOptions } from './view-outlet';\n\nenum ProvidedElements {\n None = 'none',\n WidgetDOM = 'widgetDOM',\n TriggerDOM = 'triggerDOM',\n Both = 'both',\n}\n\nexport enum TriggerType {\n Inline = 'inline',\n Link = 'link',\n Badge = 'badge',\n Unsupported = 'unsupported',\n}\n\nexport const determineProvidedElements = (\n widgetDOMElement?: HTMLElement,\n triggerDOMElement?: HTMLElement\n): ProvidedElements => {\n if (widgetDOMElement && triggerDOMElement) {\n return ProvidedElements.Both;\n }\n if (widgetDOMElement) {\n return ProvidedElements.WidgetDOM;\n }\n if (triggerDOMElement) {\n return ProvidedElements.TriggerDOM;\n }\n return ProvidedElements.None;\n};\n\nexport const determineTriggerType = (triggerDefinition?: any) => {\n if (!triggerDefinition) {\n return TriggerType.Inline;\n }\n if (typeof triggerDefinition === 'boolean' && triggerDefinition) {\n return TriggerType.Link;\n }\n if (typeof triggerDefinition === 'object' && !Array.isArray(triggerDefinition)) {\n return TriggerType.Badge;\n }\n return TriggerType.Unsupported;\n};\n\ntype PrepareDOMElementsOutput = ViewOutletOptions & {\n callback?: () => void;\n};\n\nexport const prepareDOMElements = (\n name: string,\n providedWidgetElement?: HTMLElement,\n providedTriggerElement?: HTMLElement,\n triggerDefinition?: any,\n waitWithReplace: boolean = false\n): PrepareDOMElementsOutput => {\n const providedElements = determineProvidedElements(\n providedWidgetElement,\n providedTriggerElement\n );\n const triggerType = determineTriggerType(triggerDefinition);\n\n const cachedOriginals = {\n widgetDOMElement: providedWidgetElement ? providedWidgetElement.cloneNode(true) : undefined,\n triggerDOMElement: providedTriggerElement\n ? providedTriggerElement.cloneNode(true)\n : undefined,\n };\n\n const output: PrepareDOMElementsOutput = {\n triggerType,\n cachedOriginals,\n widgetDOMElement: document.createElement('div'),\n };\n\n switch (providedElements) {\n case ProvidedElements.Both: {\n output.widgetDOMElement = providedWidgetElement || document.createElement('div');\n if (triggerType !== TriggerType.Inline) {\n output.triggerDOMElement = providedTriggerElement;\n }\n break;\n }\n case ProvidedElements.WidgetDOM: {\n output.widgetDOMElement = providedWidgetElement || document.createElement('div');\n if (triggerType !== TriggerType.Inline) {\n const triggerElement = document.body.appendChild(document.createElement('a'));\n if (triggerType === TriggerType.Link) {\n triggerElement.innerText = name;\n }\n output.triggerDOMElement = triggerElement;\n }\n break;\n }\n case ProvidedElements.TriggerDOM: {\n const widgetElement = document.createElement('div');\n output.widgetDOMElement = widgetElement;\n if (triggerType === TriggerType.Inline) {\n // replace with widgetDOMElement in the DOM\n widgetElement.id = providedTriggerElement?.id || '';\n if (waitWithReplace) {\n widgetElement.style.display = 'none';\n providedTriggerElement?.parentNode?.appendChild(widgetElement);\n\n output.callback = () => {\n providedTriggerElement?.parentNode?.replaceChild(\n widgetElement,\n providedTriggerElement\n );\n widgetElement.style.display =\n providedTriggerElement?.style.display || 'block';\n };\n } else {\n providedTriggerElement?.parentNode?.replaceChild(\n widgetElement,\n providedTriggerElement\n );\n }\n output.cachedOriginals.widgetDOMElement = providedTriggerElement;\n output.cachedOriginals.triggerDOMElement = undefined;\n } else {\n output.widgetDOMElement = document.body.appendChild(widgetElement);\n output.triggerDOMElement = providedTriggerElement;\n }\n break;\n }\n case ProvidedElements.None: {\n const widgetElement = document.body.appendChild(document.createElement('div'));\n output.widgetDOMElement = widgetElement;\n if (triggerType !== TriggerType.Inline) {\n const triggerElement = document.body.appendChild(document.createElement('a'));\n if (triggerType === TriggerType.Link) {\n triggerElement.innerText = name;\n }\n output.triggerDOMElement = triggerElement;\n }\n break;\n }\n }\n\n return output;\n};\n","import { readStorage, StorageMedium } from '@telia-ace/widget-services';\nimport { Symbol } from '@telia-ace/widget-ui';\nimport { notifyDataLoaded } from '@telia-ace/widget-utilities';\nimport { Container, Widget } from '@webprovisions/platform';\nimport { createTriggerElement, setActive, setLoading } from './html-element-handlers';\nimport { TriggerType } from './prepare-dom';\n\nconst MODALS_STORAGE_KEY = 'modals';\n\nexport type BadgeOptions = {\n symbol?: Symbol;\n label?: string;\n ariaLabel?: string;\n openTooltip?: string;\n closedTooltip?: string;\n};\n\nexport type ViewOutletOptions = {\n widgetDOMElement: HTMLElement;\n triggerDOMElement?: HTMLElement;\n triggerOptions?: BadgeOptions | boolean;\n triggerType: TriggerType;\n cachedOriginals: {\n widgetDOMElement?: Node;\n triggerDOMElement?: Node;\n };\n};\n\ntype Modals = {\n name: string;\n ref?: HTMLElement;\n selector?: string;\n};\n\nexport class ViewOutlet {\n container: Container;\n private unsubscribe: (() => void)[] = [];\n\n constructor(container: Container, public options: ViewOutletOptions) {\n this.container = container.createChild(this);\n this.container.register('widgetDOMElement', this.options.widgetDOMElement);\n this.container.register('triggerDOMElement', this.options.triggerDOMElement);\n\n const widget: Widget = this.container.get('$widget');\n this.options.widgetDOMElement.classList.add('humany-widget');\n this.options.widgetDOMElement.classList.add(`humany_${widget.name}`);\n\n const widgetDOMElements = container.get('widgetDOMElements') || [];\n container.register('widgetDOMElements', [\n ...widgetDOMElements,\n this.options.widgetDOMElement,\n ]);\n }\n\n /**\n * Renders the view outlet to the DOM.\n */\n render() {\n const { widgetDOMElement, triggerDOMElement } = this.options;\n\n const widget: Widget = this.container.get('$widget');\n\n if (widgetDOMElement.getAttribute('data-rendered') === 'true') {\n return Promise.resolve();\n }\n\n if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {\n setLoading(triggerDOMElement);\n }\n\n return import('./render')\n .then((module) => module.default(this.container, widgetDOMElement))\n .then(() => {\n widgetDOMElement.setAttribute('data-rendered', 'true');\n\n if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {\n const tooltip = (this.options.triggerOptions as BadgeOptions).openTooltip;\n setActive(triggerDOMElement, tooltip);\n }\n notifyDataLoaded(this.container, widgetDOMElement);\n\n const widgets = this.container.get('$environment').widgets.all();\n\n readStorage<Modals[]>(\n this.container,\n MODALS_STORAGE_KEY,\n StorageMedium.Session\n ).then((modals) => {\n if (modals) {\n modals.forEach((modal) => {\n if (\n widgets.find(\n (w: Widget) => w.name === modal.name && w.state === 'activated'\n )\n ) {\n widget.events.dispatch('widget:modal-opened', modal);\n }\n });\n }\n });\n });\n }\n\n renderBadge(options: BadgeOptions) {\n const { triggerDOMElement } = this.options;\n\n if (!triggerDOMElement) {\n return;\n }\n\n if (!triggerDOMElement.getAttribute('role')) {\n triggerDOMElement.setAttribute('role', 'button');\n }\n\n const { name }: Widget = this.container.get('$widget');\n\n const { label, symbol, ariaLabel, closedTooltip, openTooltip } = options;\n\n const triggerOptions = { closedTooltip, openTooltip };\n this.options.triggerOptions = triggerOptions;\n\n const removeTriggerListeners = createTriggerElement(triggerDOMElement, {\n label,\n symbol,\n ariaLabel,\n widgetName: name,\n tooltip: closedTooltip,\n });\n this.unsubscribe.push(removeTriggerListeners);\n }\n\n dispose() {\n return import('./unmount').then((module) => {\n const { triggerDOMElement, widgetDOMElement } = this.options;\n module.default(widgetDOMElement);\n\n if (this.options.cachedOriginals.widgetDOMElement) {\n if (widgetDOMElement) {\n widgetDOMElement.parentNode?.replaceChild(\n this.options.cachedOriginals.widgetDOMElement,\n widgetDOMElement\n );\n }\n }\n if (this.options.cachedOriginals.triggerDOMElement) {\n if (triggerDOMElement) {\n triggerDOMElement.parentNode?.replaceChild(\n this.options.cachedOriginals.triggerDOMElement,\n triggerDOMElement\n );\n }\n }\n\n this.unsubscribe.forEach((unsubscribe) => {\n unsubscribe();\n });\n\n widgetDOMElement.parentNode?.removeChild(widgetDOMElement);\n triggerDOMElement?.parentNode?.removeChild(triggerDOMElement);\n });\n }\n}\n","import {\n ChangesetOptions,\n ChangesetProvider,\n ComponentNodeAttributes,\n ComponentNodeSettings,\n ComponentPlatform,\n ComponentQuery,\n ComponentQueryRule,\n createComponentModel,\n WidgetSettings,\n} from '@telia-ace/widget-core';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageWriter,\n} from '@telia-ace/widget-services';\nimport { lock } from '@telia-ace/widget-utilities';\nimport { Container, Widget, WidgetState } from '@webprovisions/platform';\n\nconst STORAGE_KEY = 'changesets';\n\ntype ChangesetItem = {\n rules: ComponentQueryRule[];\n attributes: Partial<ComponentNodeAttributes>;\n options: ChangesetOptions;\n};\n\ntype ChangesetItemBag = {\n items?: { [key: string]: ChangesetItem };\n keys?: string[];\n};\n\nconst convertSettingsToAttributes = (\n settings: Partial<ComponentNodeSettings>\n): Partial<ComponentNodeAttributes> => {\n const attributes: Partial<ComponentNodeAttributes> = { tags: settings.tags };\n if (settings.context && typeof settings.context !== 'function') {\n attributes.context = settings.context;\n }\n if (settings.properties && typeof settings.properties !== 'function') {\n attributes.properties = settings.properties;\n }\n if (settings.layout && typeof settings.layout !== 'function') {\n attributes.layout = settings.layout;\n }\n\n return attributes;\n};\n\nexport class LocalStorageChangesetProvider implements ChangesetProvider {\n constructor(private container: Container, private storageWriter: StorageWriter) {}\n\n static create(container: Container): Promise<LocalStorageChangesetProvider> {\n return createStorageWriter(container, STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }).then((storageWriter) => new LocalStorageChangesetProvider(container, storageWriter));\n }\n\n write(\n key: string,\n target: ComponentQuery,\n attributes: Partial<ComponentNodeSettings>,\n options: ChangesetOptions\n ): Promise<any> {\n return lock(this)(() => {\n return readStorage<ChangesetItemBag>(\n this.container,\n STORAGE_KEY,\n StorageMedium.Local\n ).then((bag = {}) => {\n const { keys = [], items = {} } = bag;\n const existingIndex = keys.indexOf(key);\n if (existingIndex > -1) {\n keys.splice(existingIndex, 1);\n }\n keys.push(key);\n items[key] = {\n options,\n attributes: convertSettingsToAttributes(attributes),\n rules: target.rules,\n };\n return this.storageWriter({ keys, items });\n });\n });\n }\n\n remove(key: string): Promise<any> {\n return lock(this)(() => {\n return readStorage<ChangesetItemBag>(\n this.container,\n STORAGE_KEY,\n StorageMedium.Local\n ).then((bag = {}) => {\n const { keys = [], items = {} } = bag;\n const indexToRemove = keys.indexOf(key);\n if (indexToRemove > -1) {\n keys.splice(indexToRemove, 1);\n delete items[key];\n return this.storageWriter(bag);\n }\n });\n });\n }\n\n load(platform: ComponentPlatform): Promise<any> {\n return lock(this)(() => {\n return readStorage<ChangesetItemBag>(\n this.container,\n STORAGE_KEY,\n StorageMedium.Local\n ).then((bag = {}) => {\n const { keys = [], items = {} } = bag;\n keys.forEach((key) => {\n const item = items[key];\n if (item) {\n const { rules, attributes, options } = item;\n platform.write({\n attributes,\n options,\n target: new ComponentQuery(platform, rules),\n });\n }\n });\n });\n });\n }\n}\n\nexport const createPlatform = (widget: Widget): Promise<ComponentPlatform> => {\n const { container } = widget;\n return LocalStorageChangesetProvider.create(container).then((localStorage) => {\n const settings: WidgetSettings = container.get('$settings');\n const providers = { localStorage };\n const platform = new ComponentPlatform(widget, providers);\n const destructComponentModel = createComponentModel(platform, settings);\n\n widget.events.subscribe('widget:state-change', (event, data: { state: WidgetState }) => {\n if (data.state === WidgetState.Deactivating) {\n destructComponentModel();\n }\n });\n\n return platform;\n });\n};\n","export type SiteLocation = {\n host: string;\n pathname: string;\n};\n\nexport const createSiteProvider = (\n site: 'current' | 'referrer',\n forceHttps: boolean\n): (() => string) => {\n return () => {\n const parseLocation = (href: string): SiteLocation => {\n const link = document.createElement('a');\n link.href = href;\n return link;\n };\n\n let location: SiteLocation = window.location;\n if (site === 'referrer' && document.referrer) {\n location = parseLocation(document.referrer);\n }\n return [forceHttps ? 'https:' : '', '//', location.host, location.pathname].join('');\n };\n};\n","import { WidgetSettings } from '@telia-ace/widget-core';\nimport { Container, Widget } from '@webprovisions/platform';\nimport { createPlatform } from './component-platform-factory';\nimport { createSiteProvider } from './site-provider';\n\nexport const createRoutingService = (container: Container) => {\n return import('@telia-ace/widget-routing').then(({ RoutingService, HistoryMode }) => {\n return container.get('settings').then((settings: WidgetSettings) => {\n const {\n routing: { initialPath = '/', mode = HistoryMode.scopedHash, basePath },\n views,\n } = settings;\n\n const routingService = new RoutingService(container, {\n initialPath,\n mode,\n routes: Object.keys(views).map((name) => ({\n name,\n path: views[name].path,\n })),\n basePath,\n });\n return routingService;\n });\n });\n};\n\nexport const createStorageService = (container: Container) => {\n return import('@telia-ace/widget-services').then(({ StorageProvider }) => {\n return new StorageProvider();\n });\n};\n\nexport const createServiceClient = (container: Container) => {\n return import('@telia-ace/knowledge-serviceclient').then(({ ServiceClient, ServiceProxy }) => {\n return container.get('settings').then((settings: WidgetSettings) => {\n const { name, events }: Widget = container.get('$widget');\n const {\n data: { projection = '', site = 'current', forceHttps = false },\n } = settings;\n\n const proxy = new ServiceProxy(projection, { credentials: 'same-origin' });\n\n // Replacing '_contact' & '_contact-method' while\n // still using the shadow widget concept\n const client = new ServiceClient(\n proxy,\n {\n funnel: name.replace('_contact-method', '').replace('_contact', ''),\n site: createSiteProvider(site, forceHttps),\n },\n null,\n container\n );\n\n events.subscribe('widget:settings-updated', (event, { data }: WidgetSettings) => {\n if (data && data.projection !== projection) {\n client.proxy.setBaseUrl(data.projection);\n }\n });\n\n return client;\n });\n });\n};\n\nexport const createActionResolver = (container: Container) => {\n return import('@telia-ace/widget-core').then(({ ActionResolver }) => {\n return new ActionResolver(container);\n });\n};\n\nexport const createComponentResolver = (container: Container) => {\n return import('@telia-ace/widget-core').then(({ ComponentResolver }) => {\n return new ComponentResolver(container);\n });\n};\n\nexport const createComponentPlatform = (container: Container) => {\n return import('@telia-ace/widget-core').then(({ ComponentPlatform, createComponentModel }) => {\n return createPlatform(container.get('$widget'));\n });\n};\n","import {\n ActionResolver,\n ComponentPlatform,\n WidgetRenderState,\n WidgetSettings,\n} from '@telia-ace/widget-core';\nimport { onWidgetUrl, RouteData, RoutingService } from '@telia-ace/widget-routing';\nimport {\n createStorageWriter,\n readStorage,\n StorageCategory,\n StorageMedium,\n StorageScope,\n} from '@telia-ace/widget-services';\nimport { removeNullAndUndefinedValues, uuid } from '@telia-ace/widget-utilities';\nimport { BootstrappingActivationData, supportBootstrapping } from '@webprovisions/bootstrapping';\nimport { Container, EventSubscriptionCancellation, WidgetType } from '@webprovisions/platform';\nimport { BadgeOptions, ViewOutlet, ViewOutletOptions } from '././ui/view-outlet';\nimport {\n createActionResolver,\n createComponentPlatform,\n createComponentResolver,\n createRoutingService,\n createServiceClient,\n createStorageService,\n} from './services';\nimport { setActive, setInactive } from './ui/html-element-handlers';\nimport { determineTriggerType, prepareDOMElements, TriggerType } from './ui/prepare-dom';\n\nconst SETTINGS_STORAGE_KEY = '$settings';\nconst OPEN_STORAGE_KEY = 'open';\nconst STICKY_WIDGET_STORAGE_KEY = 'activeStickyWidget';\n\nexport enum InitialRenderState {\n Open = 'open',\n Closed = 'closed',\n Hidden = 'hidden',\n Storage = 'storage',\n}\n\nexport type RenderData = {\n widgetDOMElement?: HTMLElement;\n triggerDOMElement?: HTMLElement;\n key?: string;\n open?: boolean;\n withRenderState?: InitialRenderState;\n};\n\nexport type AttachData = {\n widgetDOMElement?: HTMLElement;\n triggerDOMElement?: HTMLElement;\n key?: string;\n withRenderState?: InitialRenderState;\n};\n\nexport default class Widget extends WidgetType {\n outlets = new Map<string, ViewOutlet>();\n activated: Promise<void> | undefined = undefined;\n subs: EventSubscriptionCancellation[] = [];\n\n constructor(container: Container) {\n super(container);\n\n this.container.registerAsync('storage', () => createStorageService(this.container));\n\n this.container.registerFactory('settings', () => {\n return readStorage<Partial<WidgetSettings>>(\n this.container,\n SETTINGS_STORAGE_KEY,\n StorageMedium.Local\n ).then((settings = {}) => {\n return {\n ...this.container.get('$settings'),\n ...settings,\n };\n });\n });\n\n supportBootstrapping(this as any, 'load', this.handleBootstrapping);\n\n this.container.registerAsync('componentResolver', () =>\n createComponentResolver(this.container)\n );\n this.container.registerAsync('matchingClient', () => createServiceClient(this.container));\n this.container.registerAsync('router', () => createRoutingService(this.container));\n this.container.registerAsync('actionResolver', () => createActionResolver(this.container));\n this.container.register('matchMedia', window.matchMedia);\n this.container.registerAsync('components', () => createComponentPlatform(this.container));\n }\n\n handleBootstrapping = (activationData: BootstrappingActivationData) => {\n const options = {\n triggerDOMElement: activationData.sourceDOMElement,\n withRenderState: InitialRenderState.Storage,\n };\n\n this.container.get('settings').then((settings: any) => {\n const { activate } = settings;\n const shouldActivate =\n typeof activate === 'undefined' || activate === null || activate === true;\n\n if (shouldActivate) {\n this.activated = (this.activated || this.widget.activate()).then(() =>\n this.attach(options)\n );\n }\n });\n };\n\n initialize() {\n const promises = this.container.getManyAsync(\n 'actionResolver',\n 'router',\n 'components'\n ) as Promise<{\n actionResolver: ActionResolver;\n router: RoutingService;\n components: ComponentPlatform;\n }>;\n\n return Promise.all([promises, this.container.get('settings')]).then(\n ([{ actionResolver, router, components }, settings]) => {\n actionResolver.subscribe(this.widget.name, (origin, action, value) =>\n this.onAction(action, value)\n );\n\n const switchViewNodes = (routeName: string) => {\n components.nodes.query({ type: 'view' }).forEach((viewNode) => {\n components.setSwitch(viewNode, routeName);\n });\n };\n\n const initialRoute = router.getInitialRoute()?.name || 'index';\n switchViewNodes(initialRoute);\n\n this.events.subscribe('widget:data-loaded', (e, { element }) => {\n if (this.widget.container.get('seoConfiguration')) {\n this.events.dispatch('widget:preloaded-replaced', {\n element,\n });\n }\n });\n\n this.events.subscribe(\n 'router:change',\n (e, { previous = { routeData: {} }, next = { routeData: {} } }) => {\n const { routeData: prevData }: { routeData: RouteData } = previous;\n const { routeData: nextData }: { routeData: RouteData } = next;\n\n const notFoundView = Object.keys(settings.views).reduce((acc, key) => {\n const view = settings.views[key];\n if (typeof view.path === 'undefined') {\n return key;\n }\n return acc;\n }, '');\n\n // route not found\n if (!nextData.name && notFoundView) {\n switchViewNodes(notFoundView);\n } else {\n switchViewNodes(nextData.name);\n }\n\n removeNullAndUndefinedValues(prevData && prevData.params);\n removeNullAndUndefinedValues(nextData && nextData.params);\n\n this.container\n .getAsync('actionResolver')\n .then((actionResolver: ActionResolver) => {\n actionResolver.action(this.widget.name, 'routeChange', {\n next: nextData,\n previous: prevData,\n });\n });\n }\n );\n\n return router.initialize();\n }\n );\n }\n\n attach(attachData: AttachData = {}) {\n return this.container.get('settings').then(({ trigger }: WidgetSettings) => {\n const {\n widgetDOMElement,\n key = uuid(),\n triggerDOMElement,\n withRenderState,\n } = attachData;\n\n const triggerType = determineTriggerType(trigger);\n\n // This could probably be defined already when bootstrapping occurs,\n // Webprovisions knows when a widget is prerendered,\n // see \"queryPrerenderedTargets in @webprovisions/bootstrapping\"\n const waitWithReplace =\n triggerType === TriggerType.Inline &&\n (triggerDOMElement?.childElementCount || 0) > 0;\n\n const outletOptions = prepareDOMElements(\n this.widget.name,\n widgetDOMElement,\n triggerDOMElement,\n trigger,\n waitWithReplace\n );\n\n if (this.outlets.size < 1 && !withRenderState) {\n this.setRenderState('unset');\n }\n\n const swap = () => {\n const isReady = () =>\n widgetDOMElement.querySelectorAll('[data-loading=true]').length === 0;\n const [widgetDOMElement] = this.widget.container.get('widgetDOMElements');\n\n const watcher = (mutations: MutationRecord[], observer: MutationObserver) => {\n if (isReady()) {\n if (outletOptions.callback) {\n outletOptions.callback();\n }\n observer.disconnect();\n }\n };\n const options = {\n attributes: true,\n subtree: true,\n childList: true\n };\n\n if (isReady()) {\n outletOptions.callback && outletOptions.callback();\n }\n const observer = new MutationObserver(watcher);\n\n observer.observe(widgetDOMElement, options);\n };\n\n if (waitWithReplace) {\n this.widget.container.getAsync('dataClient').then(({ events }: any) => {\n events.subscribe('data-client:fetched', (event: any, data: any) => {\n if (data.unresolvedQueries === 0) {\n swap();\n }\n });\n });\n }\n\n const outlet = this.getOrCreateViewOutlet(key, outletOptions);\n this.outlets.set(key, outlet);\n this.widget.events.dispatch('widget:attached', {}, { bubbles: true });\n\n if (outletOptions.triggerType === TriggerType.Badge && trigger) {\n outletOptions.triggerDOMElement?.setAttribute('aria-expanded', 'false');\n outlet?.renderBadge(trigger);\n }\n\n if (outletOptions.triggerType !== TriggerType.Inline) {\n outletOptions.triggerDOMElement?.addEventListener('click', (event: any) => {\n event.preventDefault();\n this.container\n .get('settings')\n .then(({ trigger: updatedTrigger }: WidgetSettings) => {\n outlet\n .render()\n .then(() => this.renderState())\n .then((renderState) => {\n if (\n updatedTrigger &&\n updatedTrigger.action &&\n updatedTrigger.action === 'hide'\n ) {\n return renderState === WidgetRenderState.open\n ? this.hide()\n : this.open();\n }\n return renderState === WidgetRenderState.open\n ? this.close()\n : this.open();\n });\n });\n });\n }\n\n if (this.outlets.size > 1) {\n return this.renderState().then((state: WidgetRenderState) => {\n // new outlets should have the same state as existing ones\n this.triggerStateIfApplicable(state);\n });\n }\n\n if (withRenderState) {\n if (withRenderState === InitialRenderState.Storage) {\n return this.renderState().then((state: WidgetRenderState) => {\n if (outletOptions.triggerType === TriggerType.Inline) {\n this.triggerStateIfApplicable('open');\n return;\n }\n this.triggerStateIfApplicable(state);\n });\n }\n return this.triggerStateIfApplicable(withRenderState);\n }\n });\n }\n\n detach(key?: string) {\n if (key) {\n if (this.outlets.has(key)) {\n const outlet = this.outlets.get(key);\n outlet?.dispose();\n this.outlets.delete(key);\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`detach(): Could not find View Outlet with key ${key}`);\n }\n return;\n }\n this.outlets.forEach((outlet) => {\n outlet.dispose();\n });\n this.outlets.clear();\n }\n\n private triggerStateIfApplicable(input: string) {\n return this.container.getAsync('router').then((router) => {\n switch (input) {\n case 'closed':\n this.close();\n break;\n case 'open':\n this.open();\n break;\n case 'hidden':\n this.hide();\n router.start();\n break;\n default:\n return;\n }\n });\n }\n\n private getOrCreateViewOutlet(key: string, options: ViewOutletOptions): ViewOutlet {\n return (\n this.outlets.has(key) ? this.outlets.get(key) : new ViewOutlet(this.container, options)\n )!;\n }\n\n render(renderData: RenderData = {}) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('widget.render() is deprecated. Use widget.attach() instead.');\n }\n if (renderData.open) {\n const options: AttachData = {\n ...renderData,\n withRenderState: InitialRenderState.Open,\n };\n return this.attach(options);\n }\n return this.attach(renderData);\n }\n\n activate(data?: any) {\n if (data?.override) {\n this.setSettings(() => data.override);\n }\n // TODO: this is considered a hack, remove apiNotificationPriorityBy\n // when there is a better way to get notifications from backend\n if (data?.apiNotificationPriorityBy) {\n this.container.register('apiNotificationPriorityBy', data.apiNotificationPriorityBy);\n }\n }\n\n setSettings(\n fn: (settings: WidgetSettings) => Promise<Partial<WidgetSettings>>\n ): Promise<WidgetSettings> {\n return Promise.all([\n this.container.get('settings'),\n createStorageWriter(this.container, SETTINGS_STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n }),\n ]).then(([settings, write]) => {\n return Promise.resolve(fn(settings)).then((override) => {\n return write(override).then(() => {\n const updated = { ...settings, ...override };\n this.widget.events.dispatch('widget:settings-updated', updated);\n return updated;\n });\n });\n });\n }\n\n clearSettings(): Promise<void> {\n return createStorageWriter(\n this.container,\n SETTINGS_STORAGE_KEY,\n StorageCategory.Necessary,\n { medium: StorageMedium.Local }\n )\n .then((write) => write())\n .then(() => this.container.get('settings'))\n .then((settings) => {\n this.widget.events.dispatch('widget:settings-updated', settings);\n });\n }\n\n action({ action, value }: { action: string; value?: any }) {\n return this.container.getAsync('actionResolver').then((actionResolver: ActionResolver) => {\n actionResolver.action(this.widget.name, action, value);\n });\n }\n\n renderState(): Promise<WidgetRenderState> {\n if (onWidgetUrl(this.container)) {\n return Promise.resolve(WidgetRenderState.open);\n }\n const readSessionOpen = () =>\n readStorage<WidgetRenderState>(\n this.container,\n OPEN_STORAGE_KEY,\n StorageMedium.Session\n ).then((value = WidgetRenderState.closed) => value);\n\n const readLocalOpen = () =>\n readStorage<WidgetRenderState>(\n this.container,\n OPEN_STORAGE_KEY,\n StorageMedium.Session\n ).then((value = WidgetRenderState.closed) => value);\n\n return this.container.getAsync('router').then((routing: RoutingService) => {\n if (routing.isSticky()) {\n return readLocalOpen().then((localOpen) => {\n return localOpen === WidgetRenderState.open ? localOpen : readSessionOpen();\n });\n }\n return readSessionOpen();\n });\n }\n\n hide(): Promise<void> {\n if (this.outlets.size < 1) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'hide(): No-op as no view outlets are registered. Invoke the attach() command first.'\n );\n }\n return Promise.resolve();\n }\n this.outlets.forEach((outlet) => outlet.render());\n return this.action({ action: 'hide' }).then(() => {\n this.setTriggerState(false);\n });\n }\n\n open(): Promise<void> {\n if (this.outlets.size < 1) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'open(): No-op as no view outlets are registered. Invoke the attach() command first.'\n );\n }\n return Promise.resolve();\n }\n this.outlets.forEach((outlet) => outlet.render());\n return this.action({ action: 'open' }).then(() => {\n this.widget.events.dispatch('tracking:widget-rendered', {});\n return this.onOpen();\n });\n }\n\n close(): Promise<void> {\n if (this.outlets.size < 1) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'close(): No-op as no view outlets are registered. Invoke the attach() command first.'\n );\n }\n return Promise.resolve();\n }\n return this.action({ action: 'close' }).then(() => this.onClose());\n }\n\n show(): Promise<void> {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'show(): Command is deprecated and will be removed in the future. Use open() instead.'\n );\n }\n return this.open();\n }\n\n private onAction(action: string, value: any) {\n switch (action) {\n case 'close':\n case 'open':\n case 'hide':\n const newState =\n action === 'open'\n ? WidgetRenderState.open\n : action === 'close'\n ? WidgetRenderState.closed\n : WidgetRenderState.hidden;\n\n return this.setRenderState(newState).then(() => {\n this.setTriggerState(newState === WidgetRenderState.open);\n if (newState !== WidgetRenderState.hidden) {\n newState === WidgetRenderState.open ? this.onOpen() : this.onClose();\n } else {\n this.outlets.forEach((outlet) =>\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'false')\n );\n }\n });\n }\n }\n\n private setRenderState(newState: string): Promise<void> {\n const { invoke, events } = this.container.get('$widget');\n return Promise.all([\n createStorageWriter(this.container, OPEN_STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Session,\n }),\n createStorageWriter(this.container, OPEN_STORAGE_KEY, StorageCategory.Necessary, {\n medium: StorageMedium.Local,\n duration: { minutes: 5 },\n }),\n this.container.getAsync('router'),\n invoke('renderState'),\n ]).then(([writeSessionOpen, writeLocalOpen, routing, previousRenderState]) => {\n if (newState === 'unset' || !newState) {\n writeLocalOpen();\n writeSessionOpen();\n } else {\n if (routing.isSticky()) {\n writeLocalOpen(newState);\n }\n writeSessionOpen(newState);\n }\n events.dispatch('widget:render-state-changed', {\n previous: previousRenderState,\n next: newState,\n });\n });\n }\n\n private onOpen(): Promise<void> {\n return this.container.getAsync('router').then((router: RoutingService) => {\n this.outlets.forEach((outlet) =>\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'true')\n );\n return router.start();\n });\n }\n\n private onClose(): Promise<void> {\n const services = this.container.getManyAsync('router', 'components') as Promise<{\n router: RoutingService;\n components: ComponentPlatform;\n }>;\n\n const resetActivateProp = () => {\n return this.container.get('settings').then((widgetSettings: WidgetSettings) => {\n const { activate } = this.container.get('$settings');\n if (widgetSettings.activate !== activate) {\n return this.setSettings(() => Promise.resolve({ activate }));\n }\n return Promise.resolve();\n });\n };\n\n return resetActivateProp()\n .then(() => {\n return services;\n })\n .then(\n ({\n router,\n components,\n }: {\n router: RoutingService;\n components: ComponentPlatform;\n }) => {\n const visibleNodes = components.nodes.visible;\n this.outlets.forEach((outlet) =>\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'false')\n );\n\n if (\n visibleNodes.filter(\n (c) =>\n c.attributes.properties.animation &&\n c.attributes.properties.animation !== 'none'\n ).length\n ) {\n return new Promise<RoutingService>((resolve) => {\n setTimeout(() => {\n resolve(router);\n }, 200);\n });\n }\n\n return Promise.resolve(router);\n }\n )\n .then((router: RoutingService) => router.stop());\n }\n\n private setTriggerState(open: boolean) {\n this.outlets.forEach((outlet) => {\n const {\n options: { triggerDOMElement, triggerOptions },\n } = outlet;\n const { openTooltip, closedTooltip } = (triggerOptions as BadgeOptions) || {};\n if (triggerDOMElement) {\n open\n ? setActive(triggerDOMElement, openTooltip)\n : setInactive(triggerDOMElement, closedTooltip);\n }\n });\n }\n\n deactivate() {\n this.subs.forEach((s) => s());\n\n const promises: Promise<void>[] = [];\n this.outlets.forEach((outlet) => promises.push(outlet.dispose()));\n\n return readStorage<string>(\n this.container,\n STICKY_WIDGET_STORAGE_KEY,\n StorageMedium.Local\n ).then((value) => {\n /**\n * Remove stored sticky widget from implementation's localStorage if applicable\n */\n if (value === this.widget.name) {\n return createStorageWriter(\n this.container,\n STICKY_WIDGET_STORAGE_KEY,\n StorageCategory.Necessary,\n {\n medium: StorageMedium.Local,\n scope: StorageScope.Implementation,\n }\n )\n .then((write) => write())\n .then(() => Promise.all(promises));\n }\n return Promise.all(promises);\n });\n }\n}\n"],"names":["RouteSwitch","StyledView","DetachedComponent","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/ui/determine-slide-direction.ts","../src/ui/switch.tsx","../src/ui/animated-view.tsx","../src/ui/view.tsx","../src/ui/styles.ts","../src/ui/resolvable-component.tsx","../src/ui/use-component-node-properties.ts","../src/ui/component.tsx","../src/ui/detached-component.tsx","../src/ui/not-found.tsx","../src/ui/html-element-handlers.ts","../src/ui/prepare-dom.ts","../src/ui/view-outlet.ts","../src/component-platform-factory.ts","../src/site-provider.ts","../src/services.ts","../src/widget.ts"],"sourcesContent":["export enum SlideDirection {\r\n back = 'back',\r\n forth = 'forth',\r\n}\r\n\r\nexport interface RouteStructure {\r\n name: string;\r\n children: RouteStructure[];\r\n}\r\n\r\n/**\r\n * Recursively find the parents of a nested route\r\n * @param routeName Name of route to find\r\n * @param routes Routes to look in\r\n * @param trail Trail of parents\r\n * @param level Level of the array currently looking in\r\n */\r\nexport const findParentRoutes = (\r\n routeName: string,\r\n routes: RouteStructure[],\r\n trail: string[] = [],\r\n level: number = 0\r\n): string[] | null => {\r\n let found: any = null;\r\n\r\n routes.forEach((route, index) => {\r\n if (!found) {\r\n if (route.name === routeName) {\r\n found = route;\r\n } else {\r\n trail[level] = route.name;\r\n found = findParentRoutes(routeName, route.children, trail, level + 1);\r\n }\r\n }\r\n });\r\n\r\n if (!found) {\r\n return null;\r\n }\r\n\r\n return trail;\r\n};\r\n\r\n/**\r\n * Determine if the sliding animation should back or forth\r\n * @param currentRouteName Name of current route\r\n * @param nextRouteName Name of route to transition to\r\n * @param routeRanking Hierarchical route ranking for the widget\r\n */\r\nexport const determineSlideDirection = (\r\n currentRouteName: string,\r\n nextRouteName: string,\r\n routeRanking: RouteRanking\r\n): SlideDirection => {\r\n if (\r\n typeof routeRanking[currentRouteName] === 'number' &&\r\n typeof routeRanking[nextRouteName] === 'number' &&\r\n routeRanking[currentRouteName] > routeRanking[nextRouteName]\r\n ) {\r\n return SlideDirection.back;\r\n }\r\n return SlideDirection.forth;\r\n};\r\n\r\nexport type RouteRanking = { [key: string]: number };\r\n","import { ViewDefinition } from '@telia-ace/widget-core';\r\nimport React from 'react';\r\nimport { Route, Switch as RouteSwitch } from 'react-router';\r\n\r\ntype Props = {\r\n location?: any;\r\n views: { [key: string]: ViewDefinition };\r\n render: (viewName: string) => JSX.Element | null;\r\n};\r\n\r\nconst Switch: React.FC<Props> = ({ views, location, render }) => {\r\n return (\r\n <RouteSwitch\r\n location={\r\n location\r\n ? {\r\n ...location,\r\n pathname: location.pathname.split('?')[0],\r\n }\r\n : location\r\n }\r\n >\r\n {[\r\n ...Object.keys(views).filter((key) => !!views[key].path),\r\n ...Object.keys(views).filter((key) => !views[key].path),\r\n ].map((name) => {\r\n const { path } = views[name];\r\n\r\n if (!path) {\r\n return <Route key={name} render={() => render(name)} />;\r\n }\r\n\r\n if (Array.isArray(path)) {\r\n return path.map((path: string) => (\r\n <Route key={name} exact path={path} render={() => render(name)} />\r\n ));\r\n }\r\n return <Route key={name} exact path={path} render={() => render(name)} />;\r\n })}\r\n </RouteSwitch>\r\n );\r\n};\r\n\r\nexport default Switch;\r\n","import { WidgetSettings } from '@telia-ace/widget-core';\r\nimport {\r\n Grid,\r\n transitionComposer,\r\n useComponentNode,\r\n useContainer,\r\n useContext,\r\n useProperties,\r\n useRouteData,\r\n useRouter,\r\n useScroll,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { useState } from 'react';\r\nimport { Transition, TransitionGroup } from 'react-transition-group';\r\nimport { TransitionStatus } from 'react-transition-group/Transition';\r\nimport styled from 'styled-components';\r\nimport Component from './component';\r\nimport { determineSlideDirection, RouteRanking, SlideDirection } from './determine-slide-direction';\r\nimport Switch from './switch';\r\n\r\ntype Props = {\r\n className?: string;\r\n};\r\n\r\nconst StyledViewContainer = styled.div`\r\n position: relative;\r\n width: 100%;\r\n flex: 1;\r\n`;\r\n\r\nconst StyledView = styled(Grid)<{ scrollableCss?: any; animationCss?: any }>`\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n ${(p) => !!p.animationCss && p.animationCss}\r\n ${(p) => !!p.scrollableCss && p.scrollableCss}\r\n`;\r\n\r\nconst routeHierarchy: RouteRanking = {\r\n index: 1,\r\n search: 2,\r\n browse: 3,\r\n guide: 4,\r\n contact: 5,\r\n 'contact-method': 6,\r\n conversation: 7,\r\n};\r\n\r\nconst AnimatedView: React.FC<Props> = ({ className = '', ...other }) => {\r\n const [routeName, setRouteName] = useState('index');\r\n const [transitionDirection, setTransitionDirection] = useState(SlideDirection.forth);\r\n const nextRoute = useRouteData();\r\n const router = useRouter();\r\n\r\n const properties = useProperties();\r\n const context = useContext();\r\n const container = useContainer();\r\n const node = useComponentNode();\r\n\r\n const { gap = '0' } = context;\r\n const { columns = 1, animation = 'none', scrollable = false, ...areaProperties } = properties;\r\n\r\n const [scrollableCss, elem] = useScroll(scrollable);\r\n\r\n if (!node || !router) {\r\n return null;\r\n }\r\n\r\n const { location } = router;\r\n\r\n if (nextRoute.name !== routeName && nextRoute.name !== '' && animation) {\r\n setTransitionDirection(determineSlideDirection(routeName, nextRoute.name, routeHierarchy));\r\n setRouteName(nextRoute.name);\r\n }\r\n\r\n const { views }: WidgetSettings = container.get('$settings');\r\n\r\n if (!Object.keys(views).length) {\r\n return null;\r\n }\r\n\r\n const renderView = (name: string, transitionState?: any, direction?: SlideDirection) => {\r\n const animationStyles = getAnimation(transitionState, direction);\r\n const childNode = node.getChildren(name)[0];\r\n\r\n return (\r\n <StyledView\r\n {...other}\r\n {...areaProperties}\r\n scrollableCss={scrollableCss}\r\n ref={elem}\r\n columns={columns}\r\n gap={gap}\r\n {...animationStyles}\r\n className={appendClassNames(className, 'humany-view')}\r\n >\r\n <Component id={childNode.id} branch=\"default\" />\r\n </StyledView>\r\n );\r\n };\r\n\r\n const getAnimation = (transitionState?: any, direction?: SlideDirection) => {\r\n if (animation === 'slide' || animation === 'fade') {\r\n return {\r\n animationCss: transitionComposer.composeViewTransition(\r\n transitionState,\r\n animation,\r\n direction\r\n ),\r\n ['data-state']: transitionState,\r\n };\r\n }\r\n return;\r\n };\r\n\r\n return (\r\n <StyledViewContainer className=\"humany-animated-view\">\r\n <TransitionGroup\r\n component={null}\r\n childFactory={(child) =>\r\n React.cloneElement(child, { direction: transitionDirection })\r\n }\r\n >\r\n <Transition\r\n key={routeName}\r\n timeout={{ enter: 500, exit: 500 }}\r\n onEnter={(node: HTMLElement) => node?.clientHeight}\r\n unmountOnExit={true}\r\n direction={SlideDirection.forth}\r\n >\r\n {(state: TransitionStatus, { direction }: { direction: SlideDirection }) => (\r\n <Switch\r\n views={views}\r\n location={location}\r\n render={(name) => renderView(name, state, direction)}\r\n />\r\n )}\r\n </Transition>\r\n </TransitionGroup>\r\n </StyledViewContainer>\r\n );\r\n};\r\n\r\nexport default AnimatedView;\r\n","import { WidgetSettings } from '@telia-ace/widget-core';\r\nimport {\r\n Grid,\r\n useComponentNode,\r\n useContainer,\r\n useContext,\r\n useProperties,\r\n useScroll,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React from 'react';\r\nimport styled from 'styled-components';\r\nimport Component from './component';\r\nimport Switch from './switch';\r\n\r\ntype Props = {\r\n className?: string;\r\n};\r\n\r\nconst StyledView = styled(Grid)<{ scrollableCss?: string }>`\r\n ${(p) => !!p.scrollableCss && p.scrollableCss}\r\n`;\r\n\r\nconst View: React.FC<Props> = ({ className = '', ...other }) => {\r\n const properties = useProperties();\r\n const context = useContext();\r\n const container = useContainer();\r\n const node = useComponentNode();\r\n\r\n const { views }: WidgetSettings = container.get('$settings');\r\n\r\n const { gap = '0' } = context;\r\n const { columns = 1, animation = 'none', scrollable = false, ...areaProperties } = properties;\r\n\r\n const [scrollableCss, elem] = useScroll(scrollable);\r\n\r\n if (!node) {\r\n return null;\r\n }\r\n\r\n return (\r\n <StyledView\r\n {...other}\r\n {...areaProperties}\r\n scrollableCss={scrollableCss}\r\n ref={elem}\r\n columns={columns}\r\n gap={gap}\r\n className={appendClassNames(className, 'humany-view')}\r\n >\r\n <Switch\r\n views={views}\r\n render={(name) => {\r\n const childNode = node.getChildren(name)[0];\r\n return <Component id={childNode.id} node={childNode} branch=\"default\" />;\r\n }}\r\n />\r\n </StyledView>\r\n );\r\n};\r\n\r\nexport default View;\r\n","import { paddedBorderTabStyle } from '@telia-ace/widget-ui';\r\nimport styled, { css } from 'styled-components';\r\nimport AnimatedView from './animated-view';\r\nimport View from './view';\r\n\r\nexport const styling = css<{\r\n 'data-width': number;\r\n 'data-indent': number;\r\n}>`\r\n outline: none;\r\n box-sizing: border-box;\r\n * {\r\n ${(p) => !p.theme.accessibility?.isTabbing && 'outline: none;'}\r\n box-sizing: border-box;\r\n }\r\n\r\n grid-column: ${(p) =>\r\n p['data-indent']\r\n ? `${p['data-indent'] + 1} / ${p['data-indent'] + p['data-width'] + 1}`\r\n : `span ${p['data-width']}`};\r\n\r\n ${(p) =>\r\n p.theme.fonts?.type &&\r\n `\r\n font-family: ${p.theme.fonts.type};\r\n\r\n input, textarea {\r\n font-family: ${p.theme.fonts.type};\r\n }\r\n `}\r\n\r\n ${(p) =>\r\n p.theme.fonts?.base &&\r\n `\r\n font-size: ${p.theme.fonts.base};\r\n `}\r\n\r\n &:focus {\r\n ${(p: any) => p.theme.accessibility?.isTabbing && paddedBorderTabStyle};\r\n }\r\n`;\r\n\r\nexport const StyledView = styled(View)`\r\n ${styling}\r\n`;\r\n\r\nexport const StyledAnimatedView = styled(AnimatedView)`\r\n ${styling}\r\n`;\r\n","import {\r\n filterCssPropsStyle,\r\n Typography,\r\n useComponent,\r\n useComponentDescriptor,\r\n} from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport React, { forwardRef, Suspense, useMemo } from 'react';\r\nimport styled, { css } from 'styled-components';\r\nimport { styling } from './styles';\r\n\r\ntype Props = {\r\n role?: string;\r\n className?: string;\r\n};\r\n\r\nconst NonResolvedComponentWrapper = styled.div<any>`\r\n text-align: center;\r\n ${(p) =>\r\n typeof p.theme.colors?.warning !== 'undefined' &&\r\n css`\r\n color: ${p.theme.colors?.warning};\r\n border: 2px dashed ${p.theme.colors?.warning};\r\n `}\r\n ${(p) =>\r\n typeof p.theme.borderRadius !== 'undefined' && `border-radius: ${p.theme.borderRadius};`}\r\n ${styling}\r\n`;\r\n\r\nconst ResolvableComponent = forwardRef<HTMLElement, Props>(\r\n ({ className = '', children, ...other }, ref) => {\r\n const ResolvedComponent = useComponent();\r\n const { name, type, id } = useComponentDescriptor();\r\n\r\n const StyledResolvableComponent = useMemo(() => {\r\n if (ResolvedComponent) {\r\n return styled(ResolvedComponent)<any>`\r\n ${styling}\r\n ${filterCssPropsStyle}\r\n `;\r\n }\r\n return null;\r\n }, [ResolvedComponent]);\r\n\r\n if (typeof ResolvedComponent === 'undefined') {\r\n return null;\r\n }\r\n\r\n if (ResolvedComponent === null || StyledResolvableComponent === null) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n return (\r\n <NonResolvedComponentWrapper\r\n {...other}\r\n title={`type: ${type}, definition-id: ${name}, instance-id: ${id}`}\r\n className={appendClassNames(className, 'humany-non-resolved-component')}\r\n >\r\n <Typography variant=\"h5\">Non Resolved Component Type</Typography>\r\n </NonResolvedComponentWrapper>\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n <StyledResolvableComponent\r\n ref={ref}\r\n {...other}\r\n className={appendClassNames(\r\n className,\r\n 'humany-component',\r\n `humany-component-${name}`\r\n )}\r\n >\r\n {children}\r\n </StyledResolvableComponent>\r\n </Suspense>\r\n );\r\n }\r\n);\r\n\r\nexport default ResolvableComponent;\r\n","import { ComponentNodeProperties } from '@telia-ace/widget-core';\r\nimport { useComponentNode, useComponentPlatform, useIsMounted } from '@telia-ace/widget-ui';\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport default (id: string) => {\r\n const node = useComponentNode(id);\r\n const components = useComponentPlatform();\r\n const [properties, setProperties] = useState<ComponentNodeProperties>({});\r\n const isMounted = useIsMounted();\r\n\r\n useEffect(() => {\r\n if (node && isMounted.current) {\r\n setProperties(node.attributes.properties);\r\n }\r\n }, [node, id, isMounted]);\r\n\r\n useEffect(() => {\r\n if (components) {\r\n const unsubscribe = components.events.subscribe(\r\n 'components:properties-changed',\r\n (event, data) => {\r\n if (node === data.node && isMounted.current) {\r\n setProperties(data.node.attributes.properties);\r\n }\r\n }\r\n );\r\n\r\n return () => {\r\n unsubscribe();\r\n };\r\n }\r\n }, [components, isMounted, id, node]);\r\n\r\n return properties;\r\n};\r\n","import { asDescriptor, ComponentDescriptor, ComponentNode, Size } from '@telia-ace/widget-core';\r\nimport {\r\n ComponentNodeContext,\r\n ComponentPropertyContext,\r\n filterCssProps,\r\n useColumns,\r\n useComponentPlatform,\r\n useContainer,\r\n useContext,\r\n useLayout,\r\n} from '@telia-ace/widget-ui';\r\nimport React, { forwardRef, useEffect, useState } from 'react';\r\nimport { DefaultTheme, ThemeContext, ThemeProvider } from 'styled-components';\r\nimport ResolvableComponent from './resolvable-component';\r\nimport { StyledAnimatedView, StyledView } from './styles';\r\nimport useComponentNodeProperties from './use-component-node-properties';\r\n\r\ntype Props = {\r\n className?: string;\r\n isTabbing?: boolean;\r\n id: string;\r\n branch: string;\r\n node?: ComponentNode;\r\n ariaLabel?: string;\r\n tabIndex?: number;\r\n context?: { [key: string]: any };\r\n};\r\n\r\nconst isVisible = (size: Size, node?: ComponentNode) => {\r\n if (node) {\r\n return true;\r\n }\r\n if (typeof size === 'string') {\r\n return size === 'full';\r\n }\r\n return size > 0;\r\n};\r\n\r\nconst Component = forwardRef<HTMLElement, Props>(\r\n (\r\n {\r\n className = '',\r\n isTabbing = false,\r\n id,\r\n branch,\r\n node,\r\n ariaLabel,\r\n tabIndex,\r\n context: extraContext,\r\n ...other\r\n },\r\n ref\r\n ) => {\r\n const components = useComponentPlatform();\r\n const container = useContainer();\r\n const [descriptor, setDescriptor] = useState<ComponentDescriptor>();\r\n\r\n const themeContext = React.useContext(ThemeContext) || {};\r\n const columns = useColumns();\r\n const context = useContext(id);\r\n const properties = useComponentNodeProperties(id);\r\n const { size = 'none', indent = 0 } = useLayout(id);\r\n const visible = isVisible(size, node);\r\n\r\n useEffect(() => {\r\n if (components) {\r\n if (id && !node) {\r\n const componentNode = components.nodes.get(id);\r\n if (componentNode) {\r\n setDescriptor(asDescriptor(componentNode, branch));\r\n\r\n if (visible) {\r\n const unmount = componentNode.mount(container);\r\n return () => {\r\n unmount();\r\n };\r\n }\r\n }\r\n } else if (node) {\r\n setDescriptor(asDescriptor(node, branch));\r\n const unmount = node.mount(container);\r\n return () => {\r\n unmount();\r\n };\r\n }\r\n }\r\n }, [components, id, node, visible]);\r\n\r\n if (!descriptor || !visible) {\r\n return null;\r\n }\r\n\r\n const mergedContexts = { ...context, ...(extraContext || {}) };\r\n const {\r\n cardinal,\r\n fonts: contextFonts = {},\r\n accessibility = {},\r\n ...restContext\r\n } = mergedContexts;\r\n\r\n const fonts = {\r\n type: contextFonts.type,\r\n base: contextFonts.base || '16px',\r\n small: contextFonts.small || '0.8em',\r\n normal: contextFonts.normal || '1em',\r\n medium: contextFonts.medium || '1.2em',\r\n large: contextFonts.large || '1.6em',\r\n huge: contextFonts.huge || '2.5em',\r\n };\r\n\r\n const theme: DefaultTheme = {\r\n ...restContext,\r\n fonts,\r\n accessibility: {\r\n ...accessibility,\r\n isTabbing: themeContext.accessibility?.isTabbing || isTabbing,\r\n },\r\n };\r\n\r\n if (typeof cardinal === 'number') {\r\n theme.sizes = {\r\n cardinal,\r\n small: `${cardinal}px`,\r\n normal: `${cardinal * 3}px`,\r\n medium: `${cardinal * 5}px`,\r\n large: `${cardinal * 8}px`,\r\n };\r\n }\r\n\r\n return (\r\n <ThemeProvider theme={theme}>\r\n <ComponentNodeContext.Provider value={descriptor}>\r\n <ComponentPropertyContext.Provider value={properties}>\r\n {(() => {\r\n const props = {\r\n 'data-width':\r\n size === 'full' ? columns : Math.min(size as number, columns),\r\n 'data-indent': indent,\r\n 'data-name': descriptor.name,\r\n 'data-node-id': descriptor.id,\r\n 'data-component-type': descriptor.type,\r\n 'aria-label': ariaLabel,\r\n tabIndex: tabIndex,\r\n id: descriptor.id,\r\n role: properties && properties.role,\r\n ...other,\r\n };\r\n switch (descriptor.type) {\r\n case 'view': {\r\n return typeof properties.animation === 'string' &&\r\n properties.animation !== 'none' ? (\r\n <StyledAnimatedView {...props} className={className} />\r\n ) : (\r\n <StyledView {...props} className={className} />\r\n );\r\n }\r\n default: {\r\n const cssProps = filterCssProps(properties);\r\n\r\n return (\r\n <ResolvableComponent\r\n ref={ref}\r\n {...props}\r\n {...cssProps}\r\n className={className}\r\n />\r\n );\r\n }\r\n }\r\n })()}\r\n </ComponentPropertyContext.Provider>\r\n </ComponentNodeContext.Provider>\r\n </ThemeProvider>\r\n );\r\n }\r\n);\r\n\r\nexport default Component;\r\n","import { ComponentNode, ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { useContainer } from '@telia-ace/widget-ui';\r\nimport React, { useEffect, useState } from 'react';\r\nimport Component from './component';\r\n\r\ntype Props = {\r\n builder: (components: ComponentPlatform) => Promise<ComponentNode>;\r\n};\r\nconst DetachedComponent: React.FC<Props> = ({ builder }) => {\r\n const container = useContainer();\r\n const [node, setNode] = useState<ComponentNode | null>(null);\r\n\r\n useEffect(() => {\r\n container.getAsync('components').then((components: ComponentPlatform) => {\r\n return builder(components).then((createdNode) => {\r\n setNode(createdNode);\r\n });\r\n });\r\n }, []);\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (node) {\r\n container.getAsync('components').then((components: ComponentPlatform) => {\r\n components.nodes.detached = components.nodes.detached.filter(\r\n (n) => n.id !== node.id\r\n );\r\n });\r\n }\r\n };\r\n }, [node]);\r\n\r\n if (!node) {\r\n return null;\r\n }\r\n\r\n return <Component id={node.id} node={node} branch=\"default\" />;\r\n};\r\n\r\nexport default DetachedComponent;\r\n","import { ComponentPlatform } from '@telia-ace/widget-core';\r\nimport { useContainer } from '@telia-ace/widget-ui';\r\nimport React, { useContext } from 'react';\r\nimport { ThemeContext } from 'styled-components';\r\n\r\nconst DetachedComponent = React.lazy(() => import('./detached-component'));\r\n\r\ntype Props = {\r\n showSearch?: boolean;\r\n};\r\nconst NotFound: React.FC<Props> = ({ showSearch = false }) => {\r\n const themeContext = useContext(ThemeContext);\r\n const container = useContainer();\r\n\r\n return (\r\n <React.Suspense fallback={null}>\r\n <DetachedComponent\r\n builder={(components: ComponentPlatform) => {\r\n return container.get('settings').then((settings: any) => {\r\n const { properties, context } = Object.keys(settings.components).reduce<{\r\n properties: any;\r\n context: any;\r\n }>(\r\n (acc, key) => {\r\n if (settings.components[key].type === 'not-found') {\r\n acc.properties = settings.components[key].properties;\r\n acc.context = settings.components[key].context;\r\n }\r\n\r\n return acc;\r\n },\r\n { properties: {}, context: {} }\r\n );\r\n\r\n properties.showSearch = showSearch;\r\n const node = components.createNode('area', { detached: true });\r\n node.name = 'not-found-area';\r\n node.writeLayout({\r\n size: 'full',\r\n });\r\n\r\n if (showSearch) {\r\n const searchComponentProps = Object.keys(settings.components).reduce(\r\n (acc, key) => {\r\n if (settings.components[key].type === 'search') {\r\n return settings.components[key].properties;\r\n }\r\n\r\n return acc;\r\n },\r\n {}\r\n );\r\n const searchNode = components.createNode('search', { detached: true });\r\n searchNode.writeLayout({ size: 'full' });\r\n searchNode.writeProperties({\r\n 'css-margin-bottom': themeContext?.sizes?.normal || '15px',\r\n ...searchComponentProps,\r\n });\r\n node.appendChild(searchNode);\r\n }\r\n\r\n const notFoundNode = components.createNode('not-found', { detached: true });\r\n notFoundNode.writeLayout({ size: 'full' });\r\n notFoundNode.writeProperties(properties);\r\n notFoundNode.writeContext(context);\r\n node.appendChild(notFoundNode);\r\n\r\n return node;\r\n });\r\n }}\r\n />\r\n </React.Suspense>\r\n );\r\n};\r\n\r\nexport default NotFound;\r\n","// tslint:disable max-line-length\r\nexport const renderSymbol = (symbol?: { type: string; content: string }) => {\r\n if (symbol) {\r\n const { type, content } = symbol;\r\n switch (type) {\r\n case 'FontAwesome':\r\n return `<i class=\"humany-icon fa fa-${content}\"></i>`;\r\n case 'Uri':\r\n return `<i class=\"humany-icon humany-custom-icon\" style=\"background: url(${content}) no-repeat center center;background-size: contain;\"></i>`;\r\n default:\r\n return '';\r\n }\r\n }\r\n};\r\n\r\nconst triggerTabHandler = (triggerDOMElement: HTMLElement) => {\r\n const toggleTabbing = (element: HTMLElement, tabbing: boolean) => {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n if (tabbing) {\r\n element.classList.add('humany-tabbing');\r\n } else {\r\n element.classList.remove('humany-tabbing');\r\n }\r\n };\r\n\r\n const handleKeydown = (e: KeyboardEvent) => {\r\n if (e.key === 'Tab') {\r\n toggleTabbing(triggerDOMElement, true);\r\n } else if (\r\n !(\r\n e.key === 'Enter' &&\r\n document.activeElement &&\r\n document.activeElement.classList.contains('humany-trigger')\r\n )\r\n ) {\r\n toggleTabbing(triggerDOMElement, false);\r\n }\r\n };\r\n\r\n const handleClick = (e: MouseEvent) => {\r\n if (\r\n document.activeElement &&\r\n document.activeElement.classList.contains('humany-trigger') &&\r\n document.activeElement.classList.contains('humany-tabbing')\r\n ) {\r\n return;\r\n }\r\n toggleTabbing(triggerDOMElement, false);\r\n };\r\n\r\n document.addEventListener('keydown', handleKeydown);\r\n document.addEventListener('click', handleClick);\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleKeydown);\r\n document.removeEventListener('click', handleClick);\r\n };\r\n};\r\n\r\nexport type TriggerElementOptions = {\r\n symbol?: { type: string; content: string };\r\n widgetName: string;\r\n label?: string;\r\n ariaLabel?: string;\r\n tooltip?: string;\r\n};\r\n\r\nexport function createTriggerElement(element: HTMLElement, options: TriggerElementOptions) {\r\n const { symbol, widgetName, label = '', ariaLabel = '', tooltip = '' } = options;\r\n\r\n element.classList.add('humany-trigger');\r\n element.classList.add(`humany_${widgetName}`);\r\n\r\n if (label.length) {\r\n element.classList.add('humany-has-text');\r\n }\r\n\r\n if (ariaLabel.length && !element.getAttribute('aria-label')) {\r\n element.setAttribute('aria-label', ariaLabel);\r\n }\r\n\r\n if (ariaLabel.length && !element.getAttribute('tabindex')) {\r\n element.setAttribute('tabindex', '0');\r\n }\r\n\r\n if (tooltip.length && !element.getAttribute('title')) {\r\n element.setAttribute('title', tooltip);\r\n }\r\n\r\n const symbolHtml = renderSymbol(symbol) || '';\r\n element.innerHTML = `${symbolHtml}\r\n <span class=\"humany-close\">\r\n <svg width=\"18\" height=\"9\" viewBox=\"0 0 18 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M9 9C8.81794 9.00045 8.63759 8.96634 8.46939 8.89965C8.3012 8.83295 8.14851 8.735 8.02015 8.61145L0.194523 1.12367C0.068294 0.99862 -0.00155266 0.831133 2.61958e-05 0.657285C0.00160506 0.483436 0.0744832 0.317136 0.202964 0.194202C0.331445 0.0712675 0.505249 0.00153576 0.686941 2.50649e-05C0.868634 -0.00148563 1.04368 0.0653456 1.17437 0.186125L9 7.6739L16.8256 0.186125C16.9563 0.0653456 17.1314 -0.00148563 17.3131 2.50649e-05C17.4948 0.00153576 17.6686 0.0712675 17.797 0.194202C17.9255 0.317136 17.9984 0.483436 18 0.657285C18.0016 0.831133 17.9317 0.99862 17.8055 1.12367L9.97985 8.61145C9.85149 8.735 9.6988 8.83295 9.53061 8.89965C9.36241 8.96634 9.18206 9.00045 9 9Z\" fill=\"white\"/>\r\n </svg>\r\n </span>\r\n <span class=\"humany-loader\">\r\n <svg viewBox=\"25 25 50 50\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"20\"\r\n fill=\"none\"\r\n stroke=\"#000\"\r\n stroke-width=\"2\"\r\n stroke-miterlimit=\"10\" />\r\n </svg>\r\n </span>\r\n ${label.length ? `<span>${label}</span>` : ''}`;\r\n\r\n setTimeout(() => element && (element as HTMLElement).classList.add('humany-rendered'));\r\n\r\n return triggerTabHandler(element);\r\n}\r\n\r\nexport function setInactive(elements: HTMLElement | HTMLElement[], title?: string) {\r\n if (elements instanceof HTMLElement) {\r\n if (title) {\r\n elements.setAttribute('title', title);\r\n }\r\n elements.classList.remove('humany-active');\r\n elements.classList.remove('humany-loading');\r\n } else if (elements instanceof Array) {\r\n elements.forEach((e) => {\r\n if (title) {\r\n e.setAttribute('title', title);\r\n }\r\n e.classList.remove('humany-active');\r\n e.classList.remove('humany-loading');\r\n });\r\n }\r\n}\r\nexport function setLoading(elements: HTMLElement | HTMLElement[]) {\r\n if (elements instanceof HTMLElement) {\r\n elements.classList.remove('humany-active');\r\n elements.classList.add('humany-loading');\r\n } else if (elements instanceof Array) {\r\n elements.forEach((e) => {\r\n e.classList.remove('humany-active');\r\n e.classList.add('humany-loading');\r\n });\r\n }\r\n}\r\nexport function setActive(elements: HTMLElement | HTMLElement[], title?: string) {\r\n if (elements instanceof HTMLElement) {\r\n if (title) {\r\n elements.setAttribute('title', title);\r\n }\r\n elements.classList.add('humany-active');\r\n elements.classList.remove('humany-loading');\r\n } else if (elements instanceof Array) {\r\n elements.forEach((e) => {\r\n if (title) {\r\n e.setAttribute('title', title);\r\n }\r\n e.classList.add('humany-active');\r\n e.classList.remove('humany-loading');\r\n });\r\n }\r\n}\r\n","import { ViewOutletOptions } from './view-outlet';\r\n\r\nenum ProvidedElements {\r\n None = 'none',\r\n WidgetDOM = 'widgetDOM',\r\n TriggerDOM = 'triggerDOM',\r\n Both = 'both',\r\n}\r\n\r\nexport enum TriggerType {\r\n Inline = 'inline',\r\n Link = 'link',\r\n Badge = 'badge',\r\n Unsupported = 'unsupported',\r\n}\r\n\r\nexport const determineProvidedElements = (\r\n widgetDOMElement?: HTMLElement,\r\n triggerDOMElement?: HTMLElement\r\n): ProvidedElements => {\r\n if (widgetDOMElement && triggerDOMElement) {\r\n return ProvidedElements.Both;\r\n }\r\n if (widgetDOMElement) {\r\n return ProvidedElements.WidgetDOM;\r\n }\r\n if (triggerDOMElement) {\r\n return ProvidedElements.TriggerDOM;\r\n }\r\n return ProvidedElements.None;\r\n};\r\n\r\nexport const determineTriggerType = (triggerDefinition?: any) => {\r\n if (!triggerDefinition) {\r\n return TriggerType.Inline;\r\n }\r\n if (typeof triggerDefinition === 'boolean' && triggerDefinition) {\r\n return TriggerType.Link;\r\n }\r\n if (typeof triggerDefinition === 'object' && !Array.isArray(triggerDefinition)) {\r\n return TriggerType.Badge;\r\n }\r\n return TriggerType.Unsupported;\r\n};\r\n\r\ntype PrepareDOMElementsOutput = ViewOutletOptions & {\r\n callback?: () => void;\r\n};\r\n\r\nexport const prepareDOMElements = (\r\n name: string,\r\n providedWidgetElement?: HTMLElement,\r\n providedTriggerElement?: HTMLElement,\r\n triggerDefinition?: any,\r\n waitWithReplace: boolean = false\r\n): PrepareDOMElementsOutput => {\r\n const providedElements = determineProvidedElements(\r\n providedWidgetElement,\r\n providedTriggerElement\r\n );\r\n const triggerType = determineTriggerType(triggerDefinition);\r\n\r\n const cachedOriginals = {\r\n widgetDOMElement: providedWidgetElement ? providedWidgetElement.cloneNode(true) : undefined,\r\n triggerDOMElement: providedTriggerElement\r\n ? providedTriggerElement.cloneNode(true)\r\n : undefined,\r\n };\r\n\r\n const output: PrepareDOMElementsOutput = {\r\n triggerType,\r\n cachedOriginals,\r\n widgetDOMElement: document.createElement('div'),\r\n };\r\n\r\n switch (providedElements) {\r\n case ProvidedElements.Both: {\r\n output.widgetDOMElement = providedWidgetElement || document.createElement('div');\r\n if (triggerType !== TriggerType.Inline) {\r\n output.triggerDOMElement = providedTriggerElement;\r\n }\r\n break;\r\n }\r\n case ProvidedElements.WidgetDOM: {\r\n output.widgetDOMElement = providedWidgetElement || document.createElement('div');\r\n if (triggerType !== TriggerType.Inline) {\r\n const triggerElement = document.body.appendChild(document.createElement('a'));\r\n if (triggerType === TriggerType.Link) {\r\n triggerElement.innerText = name;\r\n }\r\n output.triggerDOMElement = triggerElement;\r\n }\r\n break;\r\n }\r\n case ProvidedElements.TriggerDOM: {\r\n const widgetElement = document.createElement('div');\r\n output.widgetDOMElement = widgetElement;\r\n if (triggerType === TriggerType.Inline) {\r\n // replace with widgetDOMElement in the DOM\r\n widgetElement.id = providedTriggerElement?.id || '';\r\n if (waitWithReplace) {\r\n widgetElement.style.display = 'none';\r\n providedTriggerElement?.parentNode?.appendChild(widgetElement);\r\n\r\n output.callback = () => {\r\n providedTriggerElement?.parentNode?.replaceChild(\r\n widgetElement,\r\n providedTriggerElement\r\n );\r\n widgetElement.style.display =\r\n providedTriggerElement?.style.display || 'block';\r\n };\r\n } else {\r\n providedTriggerElement?.parentNode?.replaceChild(\r\n widgetElement,\r\n providedTriggerElement\r\n );\r\n }\r\n output.cachedOriginals.widgetDOMElement = providedTriggerElement;\r\n output.cachedOriginals.triggerDOMElement = undefined;\r\n } else {\r\n output.widgetDOMElement = document.body.appendChild(widgetElement);\r\n output.triggerDOMElement = providedTriggerElement;\r\n }\r\n break;\r\n }\r\n case ProvidedElements.None: {\r\n const widgetElement = document.body.appendChild(document.createElement('div'));\r\n output.widgetDOMElement = widgetElement;\r\n if (triggerType !== TriggerType.Inline) {\r\n const triggerElement = document.body.appendChild(document.createElement('a'));\r\n if (triggerType === TriggerType.Link) {\r\n triggerElement.innerText = name;\r\n }\r\n output.triggerDOMElement = triggerElement;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return output;\r\n};\r\n","import { readStorage, StorageMedium } from '@telia-ace/widget-services';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\nimport { notifyDataLoaded } from '@telia-ace/widget-utilities';\r\nimport { Container, Widget } from '@webprovisions/platform';\r\nimport { createTriggerElement, setActive, setLoading } from './html-element-handlers';\r\nimport { TriggerType } from './prepare-dom';\r\n\r\nconst MODALS_STORAGE_KEY = 'modals';\r\n\r\nexport type BadgeOptions = {\r\n symbol?: Symbol;\r\n label?: string;\r\n ariaLabel?: string;\r\n openTooltip?: string;\r\n closedTooltip?: string;\r\n};\r\n\r\nexport type ViewOutletOptions = {\r\n widgetDOMElement: HTMLElement;\r\n triggerDOMElement?: HTMLElement;\r\n triggerOptions?: BadgeOptions | boolean;\r\n triggerType: TriggerType;\r\n cachedOriginals: {\r\n widgetDOMElement?: Node;\r\n triggerDOMElement?: Node;\r\n };\r\n};\r\n\r\ntype Modals = {\r\n name: string;\r\n ref?: HTMLElement;\r\n selector?: string;\r\n};\r\n\r\nexport class ViewOutlet {\r\n container: Container;\r\n private unsubscribe: (() => void)[] = [];\r\n\r\n constructor(container: Container, public options: ViewOutletOptions) {\r\n this.container = container.createChild(this);\r\n this.container.register('widgetDOMElement', this.options.widgetDOMElement);\r\n this.container.register('triggerDOMElement', this.options.triggerDOMElement);\r\n\r\n const widget: Widget = this.container.get('$widget');\r\n this.options.widgetDOMElement.classList.add('humany-widget');\r\n this.options.widgetDOMElement.classList.add(`humany_${widget.name}`);\r\n\r\n const widgetDOMElements = container.get('widgetDOMElements') || [];\r\n container.register('widgetDOMElements', [\r\n ...widgetDOMElements,\r\n this.options.widgetDOMElement,\r\n ]);\r\n }\r\n\r\n /**\r\n * Renders the view outlet to the DOM.\r\n */\r\n render() {\r\n const { widgetDOMElement, triggerDOMElement } = this.options;\r\n\r\n const widget: Widget = this.container.get('$widget');\r\n\r\n if (widgetDOMElement.getAttribute('data-rendered') === 'true') {\r\n return Promise.resolve();\r\n }\r\n\r\n if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {\r\n setLoading(triggerDOMElement);\r\n }\r\n\r\n return import('./render')\r\n .then((module) => module.default(this.container, widgetDOMElement))\r\n .then(() => {\r\n widgetDOMElement.setAttribute('data-rendered', 'true');\r\n\r\n if (triggerDOMElement && this.options.triggerType === TriggerType.Badge) {\r\n const tooltip = (this.options.triggerOptions as BadgeOptions).openTooltip;\r\n setActive(triggerDOMElement, tooltip);\r\n }\r\n notifyDataLoaded(this.container, widgetDOMElement);\r\n\r\n const widgets = this.container.get('$environment').widgets.all();\r\n\r\n readStorage<Modals[]>(\r\n this.container,\r\n MODALS_STORAGE_KEY,\r\n StorageMedium.Session\r\n ).then((modals) => {\r\n if (modals) {\r\n modals.forEach((modal) => {\r\n if (\r\n widgets.find(\r\n (w: Widget) => w.name === modal.name && w.state === 'activated'\r\n )\r\n ) {\r\n widget.events.dispatch('widget:modal-opened', modal);\r\n }\r\n });\r\n }\r\n });\r\n });\r\n }\r\n\r\n renderBadge(options: BadgeOptions) {\r\n const { triggerDOMElement } = this.options;\r\n\r\n if (!triggerDOMElement) {\r\n return;\r\n }\r\n\r\n if (!triggerDOMElement.getAttribute('role')) {\r\n triggerDOMElement.setAttribute('role', 'button');\r\n }\r\n\r\n const { name }: Widget = this.container.get('$widget');\r\n\r\n const { label, symbol, ariaLabel, closedTooltip, openTooltip } = options;\r\n\r\n const triggerOptions = { closedTooltip, openTooltip };\r\n this.options.triggerOptions = triggerOptions;\r\n\r\n const removeTriggerListeners = createTriggerElement(triggerDOMElement, {\r\n label,\r\n symbol,\r\n ariaLabel,\r\n widgetName: name,\r\n tooltip: closedTooltip,\r\n });\r\n this.unsubscribe.push(removeTriggerListeners);\r\n }\r\n\r\n dispose() {\r\n return import('./unmount').then((module) => {\r\n const { triggerDOMElement, widgetDOMElement } = this.options;\r\n module.default(widgetDOMElement);\r\n\r\n if (this.options.cachedOriginals.widgetDOMElement) {\r\n if (widgetDOMElement) {\r\n widgetDOMElement.parentNode?.replaceChild(\r\n this.options.cachedOriginals.widgetDOMElement,\r\n widgetDOMElement\r\n );\r\n }\r\n }\r\n if (this.options.cachedOriginals.triggerDOMElement) {\r\n if (triggerDOMElement) {\r\n triggerDOMElement.parentNode?.replaceChild(\r\n this.options.cachedOriginals.triggerDOMElement,\r\n triggerDOMElement\r\n );\r\n }\r\n }\r\n\r\n this.unsubscribe.forEach((unsubscribe) => {\r\n unsubscribe();\r\n });\r\n\r\n widgetDOMElement.parentNode?.removeChild(widgetDOMElement);\r\n triggerDOMElement?.parentNode?.removeChild(triggerDOMElement);\r\n });\r\n }\r\n}\r\n","import {\r\n ChangesetOptions,\r\n ChangesetProvider,\r\n ComponentNodeAttributes,\r\n ComponentNodeSettings,\r\n ComponentPlatform,\r\n ComponentQuery,\r\n ComponentQueryRule,\r\n createComponentModel,\r\n WidgetSettings,\r\n} from '@telia-ace/widget-core';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageWriter,\r\n} from '@telia-ace/widget-services';\r\nimport { lock } from '@telia-ace/widget-utilities';\r\nimport { Container, Widget, WidgetState } from '@webprovisions/platform';\r\n\r\nconst STORAGE_KEY = 'changesets';\r\n\r\ntype ChangesetItem = {\r\n rules: ComponentQueryRule[];\r\n attributes: Partial<ComponentNodeAttributes>;\r\n options: ChangesetOptions;\r\n};\r\n\r\ntype ChangesetItemBag = {\r\n items?: { [key: string]: ChangesetItem };\r\n keys?: string[];\r\n};\r\n\r\nconst convertSettingsToAttributes = (\r\n settings: Partial<ComponentNodeSettings>\r\n): Partial<ComponentNodeAttributes> => {\r\n const attributes: Partial<ComponentNodeAttributes> = { tags: settings.tags };\r\n if (settings.context && typeof settings.context !== 'function') {\r\n attributes.context = settings.context;\r\n }\r\n if (settings.properties && typeof settings.properties !== 'function') {\r\n attributes.properties = settings.properties;\r\n }\r\n if (settings.layout && typeof settings.layout !== 'function') {\r\n attributes.layout = settings.layout;\r\n }\r\n\r\n return attributes;\r\n};\r\n\r\nexport class LocalStorageChangesetProvider implements ChangesetProvider {\r\n constructor(private container: Container, private storageWriter: StorageWriter) {}\r\n\r\n static create(container: Container): Promise<LocalStorageChangesetProvider> {\r\n return createStorageWriter(container, STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }).then((storageWriter) => new LocalStorageChangesetProvider(container, storageWriter));\r\n }\r\n\r\n write(\r\n key: string,\r\n target: ComponentQuery,\r\n attributes: Partial<ComponentNodeSettings>,\r\n options: ChangesetOptions\r\n ): Promise<any> {\r\n return lock(this)(() => {\r\n return readStorage<ChangesetItemBag>(\r\n this.container,\r\n STORAGE_KEY,\r\n StorageMedium.Local\r\n ).then((bag = {}) => {\r\n const { keys = [], items = {} } = bag;\r\n const existingIndex = keys.indexOf(key);\r\n if (existingIndex > -1) {\r\n keys.splice(existingIndex, 1);\r\n }\r\n keys.push(key);\r\n items[key] = {\r\n options,\r\n attributes: convertSettingsToAttributes(attributes),\r\n rules: target.rules,\r\n };\r\n return this.storageWriter({ keys, items });\r\n });\r\n });\r\n }\r\n\r\n remove(key: string): Promise<any> {\r\n return lock(this)(() => {\r\n return readStorage<ChangesetItemBag>(\r\n this.container,\r\n STORAGE_KEY,\r\n StorageMedium.Local\r\n ).then((bag = {}) => {\r\n const { keys = [], items = {} } = bag;\r\n const indexToRemove = keys.indexOf(key);\r\n if (indexToRemove > -1) {\r\n keys.splice(indexToRemove, 1);\r\n delete items[key];\r\n return this.storageWriter(bag);\r\n }\r\n });\r\n });\r\n }\r\n\r\n load(platform: ComponentPlatform): Promise<any> {\r\n return lock(this)(() => {\r\n return readStorage<ChangesetItemBag>(\r\n this.container,\r\n STORAGE_KEY,\r\n StorageMedium.Local\r\n ).then((bag = {}) => {\r\n const { keys = [], items = {} } = bag;\r\n keys.forEach((key) => {\r\n const item = items[key];\r\n if (item) {\r\n const { rules, attributes, options } = item;\r\n platform.write({\r\n attributes,\r\n options,\r\n target: new ComponentQuery(platform, rules),\r\n });\r\n }\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\nexport const createPlatform = (widget: Widget): Promise<ComponentPlatform> => {\r\n const { container } = widget;\r\n return LocalStorageChangesetProvider.create(container).then((localStorage) => {\r\n const settings: WidgetSettings = container.get('$settings');\r\n const providers = { localStorage };\r\n const platform = new ComponentPlatform(widget, providers);\r\n const destructComponentModel = createComponentModel(platform, settings);\r\n\r\n widget.events.subscribe('widget:state-change', (event, data: { state: WidgetState }) => {\r\n if (data.state === WidgetState.Deactivating) {\r\n destructComponentModel();\r\n }\r\n });\r\n\r\n return platform;\r\n });\r\n};\r\n","export type SiteLocation = {\r\n host: string;\r\n pathname: string;\r\n};\r\n\r\nexport const createSiteProvider = (\r\n site: 'current' | 'referrer',\r\n forceHttps: boolean\r\n): (() => string) => {\r\n return () => {\r\n const parseLocation = (href: string): SiteLocation => {\r\n const link = document.createElement('a');\r\n link.href = href;\r\n return link;\r\n };\r\n\r\n let location: SiteLocation = window.location;\r\n if (site === 'referrer' && document.referrer) {\r\n location = parseLocation(document.referrer);\r\n }\r\n return [forceHttps ? 'https:' : '', '//', location.host, location.pathname].join('');\r\n };\r\n};\r\n","import { WidgetSettings } from '@telia-ace/widget-core';\r\nimport { Container, Widget } from '@webprovisions/platform';\r\nimport { createPlatform } from './component-platform-factory';\r\nimport { createSiteProvider } from './site-provider';\r\n\r\nexport const createRoutingService = (container: Container) => {\r\n return import('@telia-ace/widget-routing').then(({ RoutingService, HistoryMode }) => {\r\n return container.get('settings').then((settings: WidgetSettings) => {\r\n const {\r\n routing: { initialPath = '/', mode = HistoryMode.scopedHash, basePath },\r\n views,\r\n } = settings;\r\n\r\n const routingService = new RoutingService(container, {\r\n initialPath,\r\n mode,\r\n routes: Object.keys(views).map((name) => ({\r\n name,\r\n path: views[name].path,\r\n })),\r\n basePath,\r\n });\r\n return routingService;\r\n });\r\n });\r\n};\r\n\r\nexport const createStorageService = (container: Container) => {\r\n return import('@telia-ace/widget-services').then(({ StorageProvider }) => {\r\n return new StorageProvider();\r\n });\r\n};\r\n\r\nexport const createServiceClient = (container: Container) => {\r\n return import('@telia-ace/knowledge-serviceclient').then(({ ServiceClient, ServiceProxy }) => {\r\n return container.get('settings').then((settings: WidgetSettings) => {\r\n const { name, events }: Widget = container.get('$widget');\r\n const {\r\n data: { projection = '', site = 'current', forceHttps = false },\r\n } = settings;\r\n\r\n const proxy = new ServiceProxy(projection, { credentials: 'same-origin' });\r\n\r\n // Replacing '_contact' & '_contact-method' while\r\n // still using the shadow widget concept\r\n const client = new ServiceClient(\r\n proxy,\r\n {\r\n funnel: name.replace('_contact-method', '').replace('_contact', ''),\r\n site: createSiteProvider(site, forceHttps),\r\n },\r\n null,\r\n container\r\n );\r\n\r\n events.subscribe('widget:settings-updated', (event, { data }: WidgetSettings) => {\r\n if (data && data.projection !== projection) {\r\n client.proxy.setBaseUrl(data.projection);\r\n }\r\n });\r\n\r\n return client;\r\n });\r\n });\r\n};\r\n\r\nexport const createActionResolver = (container: Container) => {\r\n return import('@telia-ace/widget-core').then(({ ActionResolver }) => {\r\n return new ActionResolver(container);\r\n });\r\n};\r\n\r\nexport const createComponentResolver = (container: Container) => {\r\n return import('@telia-ace/widget-core').then(({ ComponentResolver }) => {\r\n return new ComponentResolver(container);\r\n });\r\n};\r\n\r\nexport const createComponentPlatform = (container: Container) => {\r\n return import('@telia-ace/widget-core').then(({ ComponentPlatform, createComponentModel }) => {\r\n return createPlatform(container.get('$widget'));\r\n });\r\n};\r\n","import {\r\n ActionResolver,\r\n ComponentPlatform,\r\n WidgetRenderState,\r\n WidgetSettings,\r\n} from '@telia-ace/widget-core';\r\nimport { onWidgetUrl, RouteData, RoutingService } from '@telia-ace/widget-routing';\r\nimport {\r\n createStorageWriter,\r\n readStorage,\r\n StorageCategory,\r\n StorageMedium,\r\n StorageScope,\r\n} from '@telia-ace/widget-services';\r\nimport { removeNullAndUndefinedValues, uuid } from '@telia-ace/widget-utilities';\r\nimport { BootstrappingActivationData, supportBootstrapping } from '@webprovisions/bootstrapping';\r\nimport { Container, EventSubscriptionCancellation, WidgetType } from '@webprovisions/platform';\r\nimport { BadgeOptions, ViewOutlet, ViewOutletOptions } from '././ui/view-outlet';\r\nimport {\r\n createActionResolver,\r\n createComponentPlatform,\r\n createComponentResolver,\r\n createRoutingService,\r\n createServiceClient,\r\n createStorageService,\r\n} from './services';\r\nimport { setActive, setInactive } from './ui/html-element-handlers';\r\nimport { determineTriggerType, prepareDOMElements, TriggerType } from './ui/prepare-dom';\r\n\r\nconst SETTINGS_STORAGE_KEY = '$settings';\r\nconst OPEN_STORAGE_KEY = 'open';\r\nconst STICKY_WIDGET_STORAGE_KEY = 'activeStickyWidget';\r\n\r\nexport enum InitialRenderState {\r\n Open = 'open',\r\n Closed = 'closed',\r\n Hidden = 'hidden',\r\n Storage = 'storage',\r\n}\r\n\r\nexport type RenderData = {\r\n widgetDOMElement?: HTMLElement;\r\n triggerDOMElement?: HTMLElement;\r\n key?: string;\r\n open?: boolean;\r\n withRenderState?: InitialRenderState;\r\n};\r\n\r\nexport type AttachData = {\r\n widgetDOMElement?: HTMLElement;\r\n triggerDOMElement?: HTMLElement;\r\n key?: string;\r\n withRenderState?: InitialRenderState;\r\n};\r\n\r\nexport default class Widget extends WidgetType {\r\n outlets = new Map<string, ViewOutlet>();\r\n activated: Promise<void> | undefined = undefined;\r\n subs: EventSubscriptionCancellation[] = [];\r\n\r\n constructor(container: Container) {\r\n super(container);\r\n\r\n this.container.registerAsync('storage', () => createStorageService(this.container));\r\n\r\n this.container.registerFactory('settings', () => {\r\n return readStorage<Partial<WidgetSettings>>(\r\n this.container,\r\n SETTINGS_STORAGE_KEY,\r\n StorageMedium.Local\r\n ).then((settings = {}) => {\r\n return {\r\n ...this.container.get('$settings'),\r\n ...settings,\r\n };\r\n });\r\n });\r\n\r\n supportBootstrapping(this as any, 'load', this.handleBootstrapping);\r\n\r\n this.container.registerAsync('componentResolver', () =>\r\n createComponentResolver(this.container)\r\n );\r\n this.container.registerAsync('matchingClient', () => createServiceClient(this.container));\r\n this.container.registerAsync('router', () => createRoutingService(this.container));\r\n this.container.registerAsync('actionResolver', () => createActionResolver(this.container));\r\n this.container.register('matchMedia', window.matchMedia);\r\n this.container.registerAsync('components', () => createComponentPlatform(this.container));\r\n }\r\n\r\n handleBootstrapping = (activationData: BootstrappingActivationData) => {\r\n const options = {\r\n triggerDOMElement: activationData.sourceDOMElement,\r\n withRenderState: InitialRenderState.Storage,\r\n };\r\n\r\n this.container.get('settings').then((settings: any) => {\r\n const { activate } = settings;\r\n const shouldActivate =\r\n typeof activate === 'undefined' || activate === null || activate === true;\r\n\r\n if (shouldActivate) {\r\n this.activated = (this.activated || this.widget.activate()).then(() =>\r\n this.attach(options)\r\n );\r\n }\r\n });\r\n };\r\n\r\n initialize() {\r\n const promises = this.container.getManyAsync(\r\n 'actionResolver',\r\n 'router',\r\n 'components'\r\n ) as Promise<{\r\n actionResolver: ActionResolver;\r\n router: RoutingService;\r\n components: ComponentPlatform;\r\n }>;\r\n\r\n return Promise.all([promises, this.container.get('settings')]).then(\r\n ([{ actionResolver, router, components }, settings]) => {\r\n actionResolver.subscribe(this.widget.name, (origin, action, value) =>\r\n this.onAction(action, value)\r\n );\r\n\r\n const switchViewNodes = (routeName: string) => {\r\n components.nodes.query({ type: 'view' }).forEach((viewNode) => {\r\n components.setSwitch(viewNode, routeName);\r\n });\r\n };\r\n\r\n const initialRoute = router.getInitialRoute()?.name || 'index';\r\n switchViewNodes(initialRoute);\r\n\r\n this.events.subscribe('widget:data-loaded', (e, { element }) => {\r\n if (this.widget.container.get('seoConfiguration')) {\r\n this.events.dispatch('widget:preloaded-replaced', {\r\n element,\r\n });\r\n }\r\n });\r\n\r\n this.events.subscribe(\r\n 'router:change',\r\n (e, { previous = { routeData: {} }, next = { routeData: {} } }) => {\r\n const { routeData: prevData }: { routeData: RouteData } = previous;\r\n const { routeData: nextData }: { routeData: RouteData } = next;\r\n\r\n const notFoundView = Object.keys(settings.views).reduce((acc, key) => {\r\n const view = settings.views[key];\r\n if (typeof view.path === 'undefined') {\r\n return key;\r\n }\r\n return acc;\r\n }, '');\r\n\r\n // route not found\r\n if (!nextData.name && notFoundView) {\r\n switchViewNodes(notFoundView);\r\n } else {\r\n switchViewNodes(nextData.name);\r\n }\r\n\r\n removeNullAndUndefinedValues(prevData && prevData.params);\r\n removeNullAndUndefinedValues(nextData && nextData.params);\r\n\r\n this.container\r\n .getAsync('actionResolver')\r\n .then((actionResolver: ActionResolver) => {\r\n actionResolver.action(this.widget.name, 'routeChange', {\r\n next: nextData,\r\n previous: prevData,\r\n });\r\n });\r\n }\r\n );\r\n\r\n return router.initialize();\r\n }\r\n );\r\n }\r\n\r\n attach(attachData: AttachData = {}) {\r\n return this.container.get('settings').then(({ trigger }: WidgetSettings) => {\r\n const {\r\n widgetDOMElement,\r\n key = uuid(),\r\n triggerDOMElement,\r\n withRenderState,\r\n } = attachData;\r\n\r\n const triggerType = determineTriggerType(trigger);\r\n\r\n // This could probably be defined already when bootstrapping occurs,\r\n // Webprovisions knows when a widget is prerendered,\r\n // see \"queryPrerenderedTargets in @webprovisions/bootstrapping\"\r\n const waitWithReplace =\r\n triggerType === TriggerType.Inline &&\r\n (triggerDOMElement?.childElementCount || 0) > 0;\r\n\r\n const outletOptions = prepareDOMElements(\r\n this.widget.name,\r\n widgetDOMElement,\r\n triggerDOMElement,\r\n trigger,\r\n waitWithReplace\r\n );\r\n\r\n if (this.outlets.size < 1 && !withRenderState) {\r\n this.setRenderState('unset');\r\n }\r\n\r\n const swap = () => {\r\n const isReady = () =>\r\n widgetDOMElement.querySelectorAll('[data-loading=true]').length === 0;\r\n const [widgetDOMElement] = this.widget.container.get('widgetDOMElements');\r\n\r\n const watcher = (mutations: MutationRecord[], observer: MutationObserver) => {\r\n if (isReady()) {\r\n if (outletOptions.callback) {\r\n outletOptions.callback();\r\n }\r\n observer.disconnect();\r\n }\r\n };\r\n const options = {\r\n attributes: true,\r\n subtree: true,\r\n childList: true\r\n };\r\n\r\n if (isReady()) {\r\n outletOptions.callback && outletOptions.callback();\r\n }\r\n const observer = new MutationObserver(watcher);\r\n\r\n observer.observe(widgetDOMElement, options);\r\n };\r\n\r\n if (waitWithReplace) {\r\n this.widget.container.getAsync('dataClient').then(({ events }: any) => {\r\n events.subscribe('data-client:fetched', (event: any, data: any) => {\r\n if (data.unresolvedQueries === 0) {\r\n swap();\r\n }\r\n });\r\n });\r\n }\r\n\r\n const outlet = this.getOrCreateViewOutlet(key, outletOptions);\r\n this.outlets.set(key, outlet);\r\n this.widget.events.dispatch('widget:attached', {}, { bubbles: true });\r\n\r\n if (outletOptions.triggerType === TriggerType.Badge && trigger) {\r\n outletOptions.triggerDOMElement?.setAttribute('aria-expanded', 'false');\r\n outlet?.renderBadge(trigger);\r\n }\r\n\r\n if (outletOptions.triggerType !== TriggerType.Inline) {\r\n outletOptions.triggerDOMElement?.addEventListener('click', (event: any) => {\r\n event.preventDefault();\r\n this.container\r\n .get('settings')\r\n .then(({ trigger: updatedTrigger }: WidgetSettings) => {\r\n outlet\r\n .render()\r\n .then(() => this.renderState())\r\n .then((renderState) => {\r\n if (\r\n updatedTrigger &&\r\n updatedTrigger.action &&\r\n updatedTrigger.action === 'hide'\r\n ) {\r\n return renderState === WidgetRenderState.open\r\n ? this.hide()\r\n : this.open();\r\n }\r\n return renderState === WidgetRenderState.open\r\n ? this.close()\r\n : this.open();\r\n });\r\n });\r\n });\r\n }\r\n\r\n if (this.outlets.size > 1) {\r\n return this.renderState().then((state: WidgetRenderState) => {\r\n // new outlets should have the same state as existing ones\r\n this.triggerStateIfApplicable(state);\r\n });\r\n }\r\n\r\n if (withRenderState) {\r\n if (withRenderState === InitialRenderState.Storage) {\r\n return this.renderState().then((state: WidgetRenderState) => {\r\n if (outletOptions.triggerType === TriggerType.Inline) {\r\n this.triggerStateIfApplicable('open');\r\n return;\r\n }\r\n this.triggerStateIfApplicable(state);\r\n });\r\n }\r\n return this.triggerStateIfApplicable(withRenderState);\r\n }\r\n });\r\n }\r\n\r\n detach(key?: string) {\r\n if (key) {\r\n if (this.outlets.has(key)) {\r\n const outlet = this.outlets.get(key);\r\n outlet?.dispose();\r\n this.outlets.delete(key);\r\n return;\r\n }\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(`detach(): Could not find View Outlet with key ${key}`);\r\n }\r\n return;\r\n }\r\n this.outlets.forEach((outlet) => {\r\n outlet.dispose();\r\n });\r\n this.outlets.clear();\r\n }\r\n\r\n private triggerStateIfApplicable(input: string) {\r\n return this.container.getAsync('router').then((router) => {\r\n switch (input) {\r\n case 'closed':\r\n this.close();\r\n break;\r\n case 'open':\r\n this.open();\r\n break;\r\n case 'hidden':\r\n this.hide();\r\n router.start();\r\n break;\r\n default:\r\n return;\r\n }\r\n });\r\n }\r\n\r\n private getOrCreateViewOutlet(key: string, options: ViewOutletOptions): ViewOutlet {\r\n return (\r\n this.outlets.has(key) ? this.outlets.get(key) : new ViewOutlet(this.container, options)\r\n )!;\r\n }\r\n\r\n render(renderData: RenderData = {}) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn('widget.render() is deprecated. Use widget.attach() instead.');\r\n }\r\n if (renderData.open) {\r\n const options: AttachData = {\r\n ...renderData,\r\n withRenderState: InitialRenderState.Open,\r\n };\r\n return this.attach(options);\r\n }\r\n return this.attach(renderData);\r\n }\r\n\r\n activate(data?: any) {\r\n if (data?.override) {\r\n this.setSettings(() => data.override);\r\n }\r\n // TODO: this is considered a hack, remove apiNotificationPriorityBy\r\n // when there is a better way to get notifications from backend\r\n if (data?.apiNotificationPriorityBy) {\r\n this.container.register('apiNotificationPriorityBy', data.apiNotificationPriorityBy);\r\n }\r\n }\r\n\r\n setSettings(\r\n fn: (settings: WidgetSettings) => Promise<Partial<WidgetSettings>>\r\n ): Promise<WidgetSettings> {\r\n return Promise.all([\r\n this.container.get('settings'),\r\n createStorageWriter(this.container, SETTINGS_STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n }),\r\n ]).then(([settings, write]) => {\r\n return Promise.resolve(fn(settings)).then((override) => {\r\n return write(override).then(() => {\r\n const updated = { ...settings, ...override };\r\n this.widget.events.dispatch('widget:settings-updated', updated);\r\n return updated;\r\n });\r\n });\r\n });\r\n }\r\n\r\n clearSettings(): Promise<void> {\r\n return createStorageWriter(\r\n this.container,\r\n SETTINGS_STORAGE_KEY,\r\n StorageCategory.Necessary,\r\n { medium: StorageMedium.Local }\r\n )\r\n .then((write) => write())\r\n .then(() => this.container.get('settings'))\r\n .then((settings) => {\r\n this.widget.events.dispatch('widget:settings-updated', settings);\r\n });\r\n }\r\n\r\n action({ action, value }: { action: string; value?: any }) {\r\n return this.container.getAsync('actionResolver').then((actionResolver: ActionResolver) => {\r\n actionResolver.action(this.widget.name, action, value);\r\n });\r\n }\r\n\r\n renderState(): Promise<WidgetRenderState> {\r\n if (onWidgetUrl(this.container)) {\r\n return Promise.resolve(WidgetRenderState.open);\r\n }\r\n const readSessionOpen = () =>\r\n readStorage<WidgetRenderState>(\r\n this.container,\r\n OPEN_STORAGE_KEY,\r\n StorageMedium.Session\r\n ).then((value = WidgetRenderState.closed) => value);\r\n\r\n const readLocalOpen = () =>\r\n readStorage<WidgetRenderState>(\r\n this.container,\r\n OPEN_STORAGE_KEY,\r\n StorageMedium.Session\r\n ).then((value = WidgetRenderState.closed) => value);\r\n\r\n return this.container.getAsync('router').then((routing: RoutingService) => {\r\n if (routing.isSticky()) {\r\n return readLocalOpen().then((localOpen) => {\r\n return localOpen === WidgetRenderState.open ? localOpen : readSessionOpen();\r\n });\r\n }\r\n return readSessionOpen();\r\n });\r\n }\r\n\r\n hide(): Promise<void> {\r\n if (this.outlets.size < 1) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(\r\n 'hide(): No-op as no view outlets are registered. Invoke the attach() command first.'\r\n );\r\n }\r\n return Promise.resolve();\r\n }\r\n this.outlets.forEach((outlet) => outlet.render());\r\n return this.action({ action: 'hide' }).then(() => {\r\n this.setTriggerState(false);\r\n });\r\n }\r\n\r\n open(): Promise<void> {\r\n if (this.outlets.size < 1) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(\r\n 'open(): No-op as no view outlets are registered. Invoke the attach() command first.'\r\n );\r\n }\r\n return Promise.resolve();\r\n }\r\n this.outlets.forEach((outlet) => outlet.render());\r\n return this.action({ action: 'open' }).then(() => {\r\n this.widget.events.dispatch('tracking:widget-rendered', {});\r\n return this.onOpen();\r\n });\r\n }\r\n\r\n close(): Promise<void> {\r\n if (this.outlets.size < 1) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(\r\n 'close(): No-op as no view outlets are registered. Invoke the attach() command first.'\r\n );\r\n }\r\n return Promise.resolve();\r\n }\r\n return this.action({ action: 'close' }).then(() => this.onClose());\r\n }\r\n\r\n show(): Promise<void> {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn(\r\n 'show(): Command is deprecated and will be removed in the future. Use open() instead.'\r\n );\r\n }\r\n return this.open();\r\n }\r\n\r\n private onAction(action: string, value: any) {\r\n switch (action) {\r\n case 'close':\r\n case 'open':\r\n case 'hide':\r\n const newState =\r\n action === 'open'\r\n ? WidgetRenderState.open\r\n : action === 'close'\r\n ? WidgetRenderState.closed\r\n : WidgetRenderState.hidden;\r\n\r\n return this.setRenderState(newState).then(() => {\r\n this.setTriggerState(newState === WidgetRenderState.open);\r\n if (newState !== WidgetRenderState.hidden) {\r\n newState === WidgetRenderState.open ? this.onOpen() : this.onClose();\r\n } else {\r\n this.outlets.forEach((outlet) =>\r\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'false')\r\n );\r\n }\r\n });\r\n }\r\n }\r\n\r\n private setRenderState(newState: string): Promise<void> {\r\n const { invoke, events } = this.container.get('$widget');\r\n return Promise.all([\r\n createStorageWriter(this.container, OPEN_STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Session,\r\n }),\r\n createStorageWriter(this.container, OPEN_STORAGE_KEY, StorageCategory.Necessary, {\r\n medium: StorageMedium.Local,\r\n duration: { minutes: 5 },\r\n }),\r\n this.container.getAsync('router'),\r\n invoke('renderState'),\r\n ]).then(([writeSessionOpen, writeLocalOpen, routing, previousRenderState]) => {\r\n if (newState === 'unset' || !newState) {\r\n writeLocalOpen();\r\n writeSessionOpen();\r\n } else {\r\n if (routing.isSticky()) {\r\n writeLocalOpen(newState);\r\n }\r\n writeSessionOpen(newState);\r\n }\r\n events.dispatch('widget:render-state-changed', {\r\n previous: previousRenderState,\r\n next: newState,\r\n });\r\n });\r\n }\r\n\r\n private onOpen(): Promise<void> {\r\n return this.container.getAsync('router').then((router: RoutingService) => {\r\n this.outlets.forEach((outlet) =>\r\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'true')\r\n );\r\n return router.start();\r\n });\r\n }\r\n\r\n private onClose(): Promise<void> {\r\n const services = this.container.getManyAsync('router', 'components') as Promise<{\r\n router: RoutingService;\r\n components: ComponentPlatform;\r\n }>;\r\n\r\n const resetActivateProp = () => {\r\n return this.container.get('settings').then((widgetSettings: WidgetSettings) => {\r\n const { activate } = this.container.get('$settings');\r\n if (widgetSettings.activate !== activate) {\r\n return this.setSettings(() => Promise.resolve({ activate }));\r\n }\r\n return Promise.resolve();\r\n });\r\n };\r\n\r\n return resetActivateProp()\r\n .then(() => {\r\n return services;\r\n })\r\n .then(\r\n ({\r\n router,\r\n components,\r\n }: {\r\n router: RoutingService;\r\n components: ComponentPlatform;\r\n }) => {\r\n const visibleNodes = components.nodes.visible;\r\n this.outlets.forEach((outlet) =>\r\n outlet.options.triggerDOMElement?.setAttribute('aria-expanded', 'false')\r\n );\r\n\r\n if (\r\n visibleNodes.filter(\r\n (c) =>\r\n c.attributes.properties.animation &&\r\n c.attributes.properties.animation !== 'none'\r\n ).length\r\n ) {\r\n return new Promise<RoutingService>((resolve) => {\r\n setTimeout(() => {\r\n resolve(router);\r\n }, 200);\r\n });\r\n }\r\n\r\n return Promise.resolve(router);\r\n }\r\n )\r\n .then((router: RoutingService) => router.stop());\r\n }\r\n\r\n private setTriggerState(open: boolean) {\r\n this.outlets.forEach((outlet) => {\r\n const {\r\n options: { triggerDOMElement, triggerOptions },\r\n } = outlet;\r\n const { openTooltip, closedTooltip } = (triggerOptions as BadgeOptions) || {};\r\n if (triggerDOMElement) {\r\n open\r\n ? setActive(triggerDOMElement, openTooltip)\r\n : setInactive(triggerDOMElement, closedTooltip);\r\n }\r\n });\r\n }\r\n\r\n deactivate() {\r\n this.subs.forEach((s) => s());\r\n\r\n const promises: Promise<void>[] = [];\r\n this.outlets.forEach((outlet) => promises.push(outlet.dispose()));\r\n\r\n return readStorage<string>(\r\n this.container,\r\n STICKY_WIDGET_STORAGE_KEY,\r\n StorageMedium.Local\r\n ).then((value) => {\r\n /**\r\n * Remove stored sticky widget from implementation's localStorage if applicable\r\n */\r\n if (value === this.widget.name) {\r\n return createStorageWriter(\r\n this.container,\r\n STICKY_WIDGET_STORAGE_KEY,\r\n StorageCategory.Necessary,\r\n {\r\n medium: StorageMedium.Local,\r\n scope: StorageScope.Implementation,\r\n }\r\n )\r\n .then((write) => write())\r\n .then(() => Promise.all(promises));\r\n }\r\n return Promise.all(promises);\r\n });\r\n }\r\n}\r\n"],"names":["RouteSwitch","StyledView","DetachedComponent","useContext"],"mappings":"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"}