@telia-ace/widget-types-grid 1.0.20 → 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/dist/index.js
CHANGED
|
@@ -487,7 +487,7 @@ class Dt {
|
|
|
487
487
|
}
|
|
488
488
|
render() {
|
|
489
489
|
const { widgetDOMElement: e, triggerDOMElement: n } = this.options, i = this.container.get("$widget");
|
|
490
|
-
return e.getAttribute("data-rendered") === "true" ? Promise.resolve() : (n && this.options.triggerType === P.Badge && Ot(n), import("./render.
|
|
490
|
+
return e.getAttribute("data-rendered") === "true" ? Promise.resolve() : (n && this.options.triggerType === P.Badge && Ot(n), import("./render.20e0f363.js").then((s) => s.default(this.container, e)).then(() => {
|
|
491
491
|
if (e.setAttribute("data-rendered", "true"), n && this.options.triggerType === P.Badge) {
|
|
492
492
|
const o = this.options.triggerOptions.openTooltip;
|
|
493
493
|
Ee(n, o);
|
|
@@ -609,7 +609,7 @@ const Nt = (t) => {
|
|
|
609
609
|
} = i, l = new n(r, { credentials: "same-origin" }), h = new e(l, {
|
|
610
610
|
funnel: s.replace("_contact-method", "").replace("_contact", ""),
|
|
611
611
|
site: Lt(c, a)
|
|
612
|
-
});
|
|
612
|
+
}, null, t);
|
|
613
613
|
return o.subscribe("widget:settings-updated", (u, { data: p }) => {
|
|
614
614
|
p && p.projection !== r && h.proxy.setBaseUrl(p.projection);
|
|
615
615
|
}), h;
|
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 {\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(proxy, {\r\n funnel: name.replace('_contact-method', '').replace('_contact', ''),\r\n site: createSiteProvider(site, forceHttps),\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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"}
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.
|
|
1
|
+
{"version":3,"file":"render.20e0f363.js","sources":["../src/ui/use-router.ts","../src/ui/wrapper.tsx","../src/ui/render.tsx"],"sourcesContent":["import { RoutingService } from '@telia-ace/widget-routing';\r\nimport { useIsMounted } from '@telia-ace/widget-ui';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { useEffect, useState } from 'react';\r\n\r\nexport default (container: Container): RoutingService | null => {\r\n const [router, setRouter] = useState<RoutingService | null>(null);\r\n const isMounted = useIsMounted();\r\n\r\n useEffect(() => {\r\n container.getAsync('router').then((router: RoutingService) => {\r\n if (isMounted.current) {\r\n setRouter(router);\r\n }\r\n });\r\n }, [container, isMounted]);\r\n\r\n return router;\r\n};\r\n","import { ContainerContext, RoutingContext, useComponentPlatform } from '@telia-ace/widget-ui';\r\nimport { appendClassNames } from '@telia-ace/widget-utilities';\r\nimport { Container } from '@webprovisions/platform';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { Router } from 'react-router-dom';\r\nimport Component from './component';\r\nimport useRouter from './use-router';\r\n\r\nconst keyNavigationKeys = ['Tab', 'ArrowDown', 'ArrowUp', 'ArrowRight', 'ArrowLeft'];\r\n\r\ntype Props = {\r\n container: Container;\r\n};\r\n\r\nconst Wrapper: React.SFC<Props> = ({ container }) => {\r\n const components = useComponentPlatform(container);\r\n const router = useRouter(container);\r\n const env = container.get('$environment');\r\n const [isTabbing, setIsTabbing] = useState(env?.container.get('isTabbing') || false);\r\n const [entry, setEntry] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n const keydown = (event: KeyboardEvent) => {\r\n if (keyNavigationKeys.indexOf(event.key) > -1) {\r\n if (!isTabbing) {\r\n env?.container.register('isTabbing', true);\r\n }\r\n setIsTabbing(true);\r\n }\r\n };\r\n const click = (event: any) => {\r\n if (event.screenX === 0 && event.screenY === 0) {\r\n return;\r\n }\r\n if (isTabbing) {\r\n env?.container.register('isTabbing', false);\r\n }\r\n setIsTabbing(false);\r\n };\r\n window.addEventListener('keydown', keydown);\r\n window.addEventListener('click', click);\r\n return () => {\r\n window.removeEventListener('keydown', keydown);\r\n window.removeEventListener('click', click);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (components) {\r\n setEntry(components.nodes.root.children.default[0].id || null);\r\n const unsubscribe = components.events.subscribe(\r\n 'components:root-children-changed',\r\n (event, { node }) => {\r\n if (node.parent && node.parent.type === 'root') {\r\n const entry = node.parent.children.default[0].id;\r\n setEntry(entry);\r\n }\r\n }\r\n );\r\n\r\n return unsubscribe;\r\n }\r\n }, [components]);\r\n\r\n if (!router || !router.history || !components) {\r\n return null;\r\n }\r\n\r\n if (!entry) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Router history={router.history}>\r\n <ContainerContext.Provider value={container}>\r\n <RoutingContext.Provider value={router}>\r\n <Component\r\n className={appendClassNames([isTabbing, 'humany-is-tabbing'])}\r\n isTabbing={isTabbing}\r\n id={entry}\r\n branch=\"default\"\r\n />\r\n </RoutingContext.Provider>\r\n </ContainerContext.Provider>\r\n </Router>\r\n );\r\n};\r\n\r\nexport default Wrapper;\r\n","import { Container } from '@webprovisions/platform';\r\nimport React from 'react';\r\nimport { render } from 'react-dom';\r\nimport Wrapper from './wrapper';\r\n\r\nexport default (container: Container, element: HTMLElement) =>\r\n render(<Wrapper container={container} />, element);\r\n"],"names":["render","Wrapper"],"mappings":";;;;;;;;;;;;;;AAKA,MAAe,IAAA,CAAC,MAAgD;AAC5D,QAAM,CAAC,GAAQ,KAAa,EAAgC,IAAI,GAC1D,IAAY;AAElB,WAAU,MAAM;AACZ,MAAU,SAAS,QAAQ,EAAE,KAAK,CAAC,MAA2B;AAC1D,MAAI,EAAU,WACV,EAAU,CAAM;AAAA,IACpB,CACH;AAAA,EAAA,GACF,CAAC,GAAW,CAAS,CAAC,GAElB;AACX,GCVM,IAAoB,CAAC,OAAO,aAAa,WAAW,cAAc,WAAW,GAM7E,IAA4B,CAAC,EAAE,mBAAgB;AAC3C,QAAA,IAAa,EAAqB,CAAS,GAC3C,IAAS,EAAU,CAAS,GAC5B,IAAM,EAAU,IAAI,cAAc,GAClC,CAAC,GAAW,KAAgB,EAAS,wBAAK,UAAU,IAAI,iBAAgB,EAAK,GAC7E,CAAC,GAAO,KAAY,EAAwB,IAAI;AAiDtD,SA/CA,EAAU,MAAM;AACN,UAAA,IAAU,CAAC,MAAyB;AACtC,MAAI,EAAkB,QAAQ,EAAM,GAAG,IAAI,MAClC,MACI,eAAA,UAAU,SAAS,aAAa,KAEzC,EAAa,EAAI;AAAA,IACrB,GAEE,IAAQ,CAAC,MAAe;AAC1B,MAAI,EAAM,YAAY,KAAK,EAAM,YAAY,KAGzC,MACK,gBAAA,UAAU,SAAS,aAAa,MAEzC,EAAa,EAAK;AAAA,IAAA;AAEf,kBAAA,iBAAiB,WAAW,CAAO,GACnC,OAAA,iBAAiB,SAAS,CAAK,GAC/B,MAAM;AACF,aAAA,oBAAoB,WAAW,CAAO,GACtC,OAAA,oBAAoB,SAAS,CAAK;AAAA,IAAA;AAAA,EAEjD,GAAG,CAAE,CAAA,GAEL,EAAU,MAAM;AACZ,QAAI;AACA,eAAS,EAAW,MAAM,KAAK,SAAS,QAAQ,GAAG,MAAM,IAAI,GACzC,EAAW,OAAO,UAClC,oCACA,CAAC,GAAO,EAAE,cAAW;AACjB,YAAI,EAAK,UAAU,EAAK,OAAO,SAAS,QAAQ;AAC5C,gBAAM,IAAQ,EAAK,OAAO,SAAS,QAAQ,GAAG;AAC9C,YAAS,CAAK;AAAA,QAClB;AAAA,MAAA,CAER;AAAA,EAGJ,GACD,CAAC,CAAU,CAAC,GAEX,CAAC,KAAU,CAAC,EAAO,WAAW,CAAC,KAI/B,CAAC,IACM,OAIN,kBAAA,cAAA,GAAA;AAAA,IAAO,SAAS,EAAO;AAAA,EACpB,GAAA,kBAAA,cAAC,EAAiB,UAAjB;AAAA,IAA0B,OAAO;AAAA,EAC9B,GAAA,kBAAA,cAAC,EAAe,UAAf;AAAA,IAAwB,OAAO;AAAA,EAAA,GAC3B,kBAAA,cAAA,GAAA;AAAA,IACG,WAAW,EAAiB,CAAC,GAAW,mBAAmB,CAAC;AAAA,IAC5D;AAAA,IACA,IAAI;AAAA,IACJ,QAAO;AAAA,EAAA,CACX,CACJ,CACJ,CACJ;AAER,GAEA,IAAe,GCnFf,IAAe,CAAC,GAAsB,MAClCA,EAAQ,kBAAA,cAAAC,GAAA;AAAA,EAAQ;AAAA,CAAsB,GAAI,CAAO;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telia-ace/widget-types-grid",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"description": "Type definition for Grid widget.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
6
6
|
"author": "Telia Company AB",
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
},
|
|
26
26
|
"sideEffects": false,
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@telia-ace/knowledge-serviceclient": "^1.0.
|
|
29
|
-
"@telia-ace/widget-core": "^1.0.
|
|
30
|
-
"@telia-ace/widget-forms": "^1.0.
|
|
31
|
-
"@telia-ace/widget-routing": "^1.0.
|
|
32
|
-
"@telia-ace/widget-services": "^1.0.
|
|
33
|
-
"@telia-ace/widget-ui": "^1.0.
|
|
34
|
-
"@telia-ace/widget-utilities": "^1.0.
|
|
28
|
+
"@telia-ace/knowledge-serviceclient": "^1.0.7",
|
|
29
|
+
"@telia-ace/widget-core": "^1.0.14",
|
|
30
|
+
"@telia-ace/widget-forms": "^1.0.21",
|
|
31
|
+
"@telia-ace/widget-routing": "^1.0.15",
|
|
32
|
+
"@telia-ace/widget-services": "^1.0.14",
|
|
33
|
+
"@telia-ace/widget-ui": "^1.0.21",
|
|
34
|
+
"@telia-ace/widget-utilities": "^1.0.3",
|
|
35
35
|
"@webprovisions/bootstrapping": "^1.0.12",
|
|
36
36
|
"@webprovisions/platform": "^1.1.2"
|
|
37
37
|
},
|
|
@@ -50,5 +50,5 @@
|
|
|
50
50
|
"@types/react-transition-group": "^4.4.4",
|
|
51
51
|
"@types/styled-components": "^5.1.7"
|
|
52
52
|
},
|
|
53
|
-
"gitHead": "
|
|
53
|
+
"gitHead": "e9e22ff408d32106cc60212d14fb1ff63dd5c1e1"
|
|
54
54
|
}
|