@clickview/lite 0.52.3-rc.1 → 0.52.4-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/bundles.json +1 -1
  2. package/dist/css/{1329-lite-ed09e82f2b.chunk.css → 1329-lite-cdc45079de.chunk.css} +1 -1
  3. package/dist/css/{6094-lite-371570d4ad.chunk.css → 1760-lite-19ef9620ac.chunk.css} +1 -1
  4. package/dist/css/{5549-lite-9903803dfd.chunk.css → 3640-lite-d751a30ca4.chunk.css} +1 -1
  5. package/dist/css/{431-lite-49ed0485bd.chunk.css → 431-lite-c2c2516537.chunk.css} +1 -1
  6. package/dist/css/{5660-lite-3a211c1297.chunk.css → 4683-lite-15b9d982f3.chunk.css} +1 -1
  7. package/dist/css/{5466-lite-5d0d45cb7d.chunk.css → 5466-lite-1b4fd17947.chunk.css} +1 -1
  8. package/dist/css/{3640-lite-9903803dfd.chunk.css → 5549-lite-d751a30ca4.chunk.css} +1 -1
  9. package/dist/css/{5587-lite-6e77f9442a.chunk.css → 5587-lite-304279013c.chunk.css} +1 -1
  10. package/dist/css/{4683-lite-3a211c1297.chunk.css → 5660-lite-15b9d982f3.chunk.css} +1 -1
  11. package/dist/css/{6054-lite-fdc8362cf4.chunk.css → 6054-lite-0b2c72f84f.chunk.css} +1 -1
  12. package/dist/css/{1760-lite-371570d4ad.chunk.css → 6094-lite-19ef9620ac.chunk.css} +1 -1
  13. package/dist/css/{7954-lite-b5558736f9.chunk.css → 7954-lite-95ad75b04d.chunk.css} +1 -1
  14. package/dist/css/{9808-lite-5d0d45cb7d.chunk.css → 9808-lite-1b4fd17947.chunk.css} +1 -1
  15. package/dist/languages/en.json +1 -1
  16. package/dist/scripts/{1329-b3e3f5d25d-lite.chunk.js → 1329-57aa3d33cb-lite.chunk.js} +2 -2
  17. package/dist/scripts/{1329-b3e3f5d25d-lite.chunk.js.map → 1329-57aa3d33cb-lite.chunk.js.map} +1 -1
  18. package/dist/scripts/1518-c1105e83b0-lite.chunk.js +2 -0
  19. package/dist/scripts/1518-c1105e83b0-lite.chunk.js.map +1 -0
  20. package/dist/scripts/{1760-7218da90dd-lite.chunk.js → 1760-19e88443c6-lite.chunk.js} +1 -1
  21. package/dist/scripts/{1760-7218da90dd-lite.chunk.js.map → 1760-19e88443c6-lite.chunk.js.map} +1 -1
  22. package/dist/scripts/1798-fc93a2f7a6-lite.chunk.js +2 -0
  23. package/dist/scripts/1798-fc93a2f7a6-lite.chunk.js.map +1 -0
  24. package/dist/scripts/2094-0f30600b14-lite.chunk.js +2 -0
  25. package/dist/scripts/{5710-c2804ffafe-lite.chunk.js.map → 2094-0f30600b14-lite.chunk.js.map} +1 -1
  26. package/dist/scripts/{3640-5b0a186dfd-lite.chunk.js → 3640-ac303efb99-lite.chunk.js} +1 -1
  27. package/dist/scripts/{3640-5b0a186dfd-lite.chunk.js.map → 3640-ac303efb99-lite.chunk.js.map} +1 -1
  28. package/dist/scripts/3969-c0160d0139-lite.chunk.js +2 -0
  29. package/dist/scripts/3969-c0160d0139-lite.chunk.js.map +1 -0
  30. package/dist/scripts/422-ee640f76c5-lite.chunk.js +2 -0
  31. package/dist/scripts/422-ee640f76c5-lite.chunk.js.map +1 -0
  32. package/dist/scripts/{431-5e609b8dbd-lite.chunk.js → 431-586d197eeb-lite.chunk.js} +1 -1
  33. package/dist/scripts/{431-5e609b8dbd-lite.chunk.js.map → 431-586d197eeb-lite.chunk.js.map} +1 -1
  34. package/dist/scripts/{4683-be07f1375c-lite.chunk.js → 4683-ce52da47d8-lite.chunk.js} +1 -1
  35. package/dist/scripts/{4683-be07f1375c-lite.chunk.js.map → 4683-ce52da47d8-lite.chunk.js.map} +1 -1
  36. package/dist/scripts/5220-58d9529f21-lite.chunk.js +3 -0
  37. package/dist/scripts/5220-58d9529f21-lite.chunk.js.map +1 -0
  38. package/dist/scripts/{5466-0500ed8c29-lite.chunk.js → 5466-401f301cd1-lite.chunk.js} +1 -1
  39. package/dist/scripts/{5466-0500ed8c29-lite.chunk.js.map → 5466-401f301cd1-lite.chunk.js.map} +1 -1
  40. package/dist/scripts/{5549-d19ed5a9c6-lite.chunk.js → 5549-ae40aeb0f8-lite.chunk.js} +1 -1
  41. package/dist/scripts/{5549-d19ed5a9c6-lite.chunk.js.map → 5549-ae40aeb0f8-lite.chunk.js.map} +1 -1
  42. package/dist/scripts/{5587-3de8761ca3-lite.chunk.js → 5587-d27030e106-lite.chunk.js} +1 -1
  43. package/dist/scripts/{5587-3de8761ca3-lite.chunk.js.map → 5587-d27030e106-lite.chunk.js.map} +1 -1
  44. package/dist/scripts/{5660-268adb479d-lite.chunk.js → 5660-a356acdbca-lite.chunk.js} +1 -1
  45. package/dist/scripts/{5660-268adb479d-lite.chunk.js.map → 5660-a356acdbca-lite.chunk.js.map} +1 -1
  46. package/dist/scripts/{6054-fcfe84a18d-lite.chunk.js → 6054-cf9311ce64-lite.chunk.js} +1 -1
  47. package/dist/scripts/{6054-fcfe84a18d-lite.chunk.js.map → 6054-cf9311ce64-lite.chunk.js.map} +1 -1
  48. package/dist/scripts/{6094-063cffe417-lite.chunk.js → 6094-d5fa8b07dc-lite.chunk.js} +1 -1
  49. package/dist/scripts/{6094-063cffe417-lite.chunk.js.map → 6094-d5fa8b07dc-lite.chunk.js.map} +1 -1
  50. package/dist/scripts/6450-601f889072-lite.chunk.js +2 -0
  51. package/dist/scripts/6450-601f889072-lite.chunk.js.map +1 -0
  52. package/dist/scripts/6544-fd0c4d43c1-lite.chunk.js +2 -0
  53. package/dist/scripts/6544-fd0c4d43c1-lite.chunk.js.map +1 -0
  54. package/dist/scripts/6572-75c435eae1-lite.chunk.js +2 -0
  55. package/dist/scripts/6572-75c435eae1-lite.chunk.js.map +1 -0
  56. package/dist/scripts/{7954-9a3694b784-lite.chunk.js → 7954-87777549a2-lite.chunk.js} +1 -1
  57. package/dist/scripts/{7954-9a3694b784-lite.chunk.js.map → 7954-87777549a2-lite.chunk.js.map} +1 -1
  58. package/dist/scripts/8801-4b8d3958b4-lite.chunk.js +2 -0
  59. package/dist/scripts/8801-4b8d3958b4-lite.chunk.js.map +1 -0
  60. package/dist/scripts/{9674-1ce4fe796c-lite.chunk.js → 9674-f560ed51ea-lite.chunk.js} +2 -2
  61. package/dist/scripts/9674-f560ed51ea-lite.chunk.js.map +1 -0
  62. package/dist/scripts/{9808-5ce9fc5d84-lite.chunk.js → 9808-e80883e731-lite.chunk.js} +2 -2
  63. package/dist/scripts/{9808-5ce9fc5d84-lite.chunk.js.map → 9808-e80883e731-lite.chunk.js.map} +1 -1
  64. package/dist/scripts/{bundle-af42b7e6d6.min.js → bundle-507079f8c6.min.js} +3 -3
  65. package/dist/scripts/{bundle-af42b7e6d6.min.js.map → bundle-507079f8c6.min.js.map} +1 -1
  66. package/package.json +1 -1
  67. package/dist/scripts/1518-8275a95d07-lite.chunk.js +0 -2
  68. package/dist/scripts/1518-8275a95d07-lite.chunk.js.map +0 -1
  69. package/dist/scripts/1798-972b0f3769-lite.chunk.js +0 -2
  70. package/dist/scripts/1798-972b0f3769-lite.chunk.js.map +0 -1
  71. package/dist/scripts/2120-2e824a172a-lite.chunk.js +0 -2
  72. package/dist/scripts/2120-2e824a172a-lite.chunk.js.map +0 -1
  73. package/dist/scripts/3969-525c157e0c-lite.chunk.js +0 -2
  74. package/dist/scripts/3969-525c157e0c-lite.chunk.js.map +0 -1
  75. package/dist/scripts/422-5773602f61-lite.chunk.js +0 -2
  76. package/dist/scripts/422-5773602f61-lite.chunk.js.map +0 -1
  77. package/dist/scripts/5710-c2804ffafe-lite.chunk.js +0 -2
  78. package/dist/scripts/6450-2745feb746-lite.chunk.js +0 -2
  79. package/dist/scripts/6450-2745feb746-lite.chunk.js.map +0 -1
  80. package/dist/scripts/6572-4dda098022-lite.chunk.js +0 -2
  81. package/dist/scripts/6572-4dda098022-lite.chunk.js.map +0 -1
  82. package/dist/scripts/9620-d6dd77fedc-lite.chunk.js +0 -3
  83. package/dist/scripts/9620-d6dd77fedc-lite.chunk.js.map +0 -1
  84. package/dist/scripts/9674-1ce4fe796c-lite.chunk.js.map +0 -1
  85. package/dist/scripts/999-1afd6be8dc-lite.chunk.js +0 -2
  86. package/dist/scripts/999-1afd6be8dc-lite.chunk.js.map +0 -1
  87. /package/dist/css/{9620-lite-8b4a93ca31.chunk.css → 5220-lite-8b4a93ca31.chunk.css} +0 -0
  88. /package/dist/css/{2120-lite-d46c2d634c.chunk.css → 6544-lite-d46c2d634c.chunk.css} +0 -0
  89. /package/dist/css/{999-lite-c88eb54bee.chunk.css → 8801-lite-c88eb54bee.chunk.css} +0 -0
  90. /package/dist/scripts/{1329-b3e3f5d25d-lite.chunk.js.LICENSE.txt → 1329-57aa3d33cb-lite.chunk.js.LICENSE.txt} +0 -0
  91. /package/dist/scripts/{9620-d6dd77fedc-lite.chunk.js.LICENSE.txt → 5220-58d9529f21-lite.chunk.js.LICENSE.txt} +0 -0
  92. /package/dist/scripts/{9808-5ce9fc5d84-lite.chunk.js.LICENSE.txt → 9808-e80883e731-lite.chunk.js.LICENSE.txt} +0 -0
  93. /package/dist/scripts/{bundle-af42b7e6d6.min.js.LICENSE.txt → bundle-507079f8c6.min.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/5710-c2804ffafe-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","file:///app/packages/libs/shared/src/apps/search/components/filter-button/filter-button.scss","file:///app/packages/libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","file:///app/packages/libs/shared/src/utils/StateHelper.ts","file:///app/packages/libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/filter-types/tag-filter/tag-filter.scss","file:///app/packages/libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","file:///app/packages/libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/tags/TagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.scss","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","file:///app/packages/libs/shared/src/utils/DragHelper.ts","file:///app/packages/libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","file:///app/packages/libs/shared/src/enums/CssMeasurement.ts","file:///app/packages/libs/shared/src/enums/TagType.ts","file:///app/packages/libs/shared/src/enums/WidgetInteraction.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/apps/search/components/search-filters/search-filters.scss","file:///app/packages/libs/shared/src/components/tags/tags.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"hideCaret\":\"KDq7l\",\"filterMenu\":\"E9o_Q\",\"twoColumnsWidth\":\"C70vU\",\"nestedCheckboxesWidth\":\"kUHcg\",\"switchWidth\":\"bi1FH\",\"moreFiltersWidth\":\"rbr22\",\"svgContainer\":\"UwDMA\"};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent\n ? props.filter.customComponent\n : FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svgName={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active\n ? acc + 1\n : acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent\n ? filter.customComponent\n : FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"tagItem\":\"j84HW\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching\n ? new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n })\n : []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string;\n mainFilters: Array<SearchFilter>;\n moreFilters: MoreFilters;\n alignLeft?: boolean;\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: props.currentQueryParam ? { query: props.currentQueryParam } : null\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject;\n mainFilters: SearchFilter[];\n appLink: Core.AppLink;\n moreFilters?: MoreFilters;\n isFetchingOptions?: boolean;\n constantIndices?: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n\n hideHeading?: boolean;\n hideDivider?: boolean;\n hideResetButton?: boolean;\n alignResetButtonLeft?: boolean;\n hideCaret?: boolean;\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={`d-flex ${!props.hideDivider ? 'border-bottom pb-3 mb-3' : ''}`}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={`d-flex flex-wrap ${styles.filtersContainer} ${!hideHeading ? 'ms-2' : ''}`}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport styles from './tags.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove)\n classNames += ' ' + styles.badge;\n\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour\n ? { backgroundColor: props.themeColours.secondary }\n : {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className='text-truncate text-nowrap'>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className='text-truncate text-nowrap'>\n {name}\n {props.onRemove &&\n <button\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"seeMore\":\"yv0FS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './widget-header.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description: string;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{ ...props.analyticsOptions, descriptor: ClickDescriptor.SeeMore }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeMore')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className={styles.title}>\n <AppLink\n appLink={props.appLink}\n analyticsOptions={props.analyticsOptions}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.name}\n </h2>\n </AppLink>\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description ${styles.description}`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n\n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLDivElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLDivElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLDivElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <div\n className='d-flex flex-nowrap position-relative w-100'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </div>\n );\n});","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialFilterHeading\":\"O8f8H\",\"partialButton\":\"ThKam\",\"filtersContainer\":\"JIp3h\"};","// extracted by mini-css-extract-plugin\nexport default {\"tagList\":\"Zw6d9\",\"disabled\":\"jlL1c\",\"partialTag\":\"too_N\",\"badge\":\"OjtN8\",\"close\":\"X9joI\"};"],"names":["namespace","FilterActions","props","className","active","DivButton","onClick","onClickReset","Text","phrase","onClickApply","defaultProps","FilterButton","state","currentFilterState","filter","id","isDropdownFilter","type","name","label","setLabel","showDropdown","setShowDropdown","draftState","setDraftState","onSelectItem","applyFilter","newState","FilterHelper","appLink","selection","FilterComponent","customComponent","caretClass","hideCaret","customWidthClass","Dropdown","onToggle","isShowing","show","variant","disabled","icon","SvgContainer","svgName","labelPrefix","defaultOption","options","find","o","StateHelper","getSetStateByKey","setState","key","callback","data","fn","FunctionHelper","getTotalActiveFilters","currentState","Object","keys","reduce","acc","MoreFiltersButton","moreFilters","totalActiveFilters","setTotalActiveFilters","currentFilterStateKey","map","join","filters","baseClass","e","stopPropagation","isOnMoreFilters","filterId","f","TagWidgetItem","colorClass","selectedItems","TagItem","tag","tagClass","TagFilter","selections","unappliedOptions","opt","onClickOption","option","nextFilterState","indexOfItem","i","toString","newItems","slice","length","concat","collection","isFetching","DynamicWidget","childComponent","staticChildren","Array","fill","component","PartialTagItem","position","partialLoadingComponent","ResetButton","params","currentQueryParam","query","alignLeft","SearchFilters","queryParams","hideHeading","isFetchingOptions","constantIndices","mainFilters","dispatch","ObjectHelper","payload","analyticsOptions","indices","ArrayHelper","mainFiltersWithoutTags","tagFilter","value","hideDivider","hideResetButton","alignResetButtonLeft","classNames","getPhrase","toLowerCase","tagType","hasThemeColour","themeColours","secondary","getTagTypeClass","onRemove","style","backgroundColor","title","role","LanguageService","SeeMore","AppLink","analyticsData","descriptor","WidgetHeader","hasDescription","description","showSeeMoreLink","blankImage","Image","src","DragHelper","event","dataTransfer","setDragImage","isTouchScreen","UserAgentHelper","SlidingListContainer","ref","listenerProps","xPosition","measurement","dragPercentage","children","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","CssMeasurement","C","transform","transition","draggable","onDragStart","onDragOver","onTouchMoveCapture","onTouchEndCapture","TagType","TagTypeNumber","WidgetInteraction","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/2094-0f30600b14-lite.chunk.js","mappings":"yMAKMA,EAAY,uBAcZ,SAAUC,EAAcC,GAC5B,OACE,uBAAKC,UAAS,yCAAoCD,EAAMC,YACrDD,EAAME,OACL,gBAACC,EAAA,EAAS,CAACF,UAAU,qDAAqDG,QAASJ,EAAMK,cACvF,gBAACC,EAAA,EAAI,CAACR,UAAWA,EAAWS,OAAO,WAGrC,uBAAKN,UAAU,cAGjB,gBAACE,EAAA,EAAS,CAACF,UAAU,YAAYG,QAASJ,EAAMQ,cAC9C,gBAACF,EAAA,EAAI,CAACR,UAAWA,EAAWS,OAAO,WAI3C,CArBAR,EAAcU,aAAe,CAC3BP,QAAQ,EACRD,UAAW,I,qCCfb,SAAgB,UAAY,QAAQ,WAAa,QAAQ,gBAAkB,QAAQ,sBAAwB,QAAQ,YAAc,QAAQ,iBAAmB,QAAQ,aAAe,S,suCCuC7K,SAAUS,EAAaV,GAC3B,IAAQW,EAAU,aAAiB,KAA3BA,MACFC,EAAqBD,EAAMX,EAAMa,OAAOC,IAExCC,EAAyC,aAAtBf,EAAMa,OAAOG,KAEuB,IAAjC,WAAehB,EAAMa,OAAOI,MAAK,GAArDC,EAAK,KAAEC,EAAQ,KACwC,IAArB,YAAe,GAAM,GAAvDC,EAAY,KAAEC,EAAe,KACgD,IAA/C,WAA4BT,GAAmB,GAA7EU,EAAU,KAAEC,EAAa,KAOjC,SAASC,EAAab,GACpBY,EAAcZ,GAEVI,GACFU,EAAYd,EAChB,CAgBA,SAASc,IAA8C,I,MAAlCC,EAAA,uDAAwBJ,EAC3CK,EAAA,eACE,CAAC3B,EAAMa,QACPD,G,EAAkB,G,EACfZ,EAAMa,OAAOC,G,EAAKY,G,uXACrBf,EAAMiB,QAEV,CAjCA,aAAgB,WACdT,EAASQ,EAAA,YAAsB3B,EAAMa,OAAQD,IAC7CW,EAAcX,EAChB,GAAG,CAAEZ,EAAMa,OAAQD,aAAkB,EAAlBA,EAAoBiB,YA0CvC,IAjF2BhB,EAiFrBiB,EAAkB,WAAc,WACpC,OAAO9B,EAAMa,OAAOkB,gBAChB/B,EAAMa,OAAOkB,gBACbJ,EAAA,sBAAgC3B,EAAMa,OAAOG,KACnD,GAAG,CAAChB,EAAMa,OAAOG,OAGXgB,EAAahC,EAAMiC,YAAclB,EAAmB,YAAmB,GACvEmB,GAzFqBrB,EAyFkBb,EAAMa,OAxF/Cc,EAAA,qBAA+Bd,GAC1B,kBAGS,mBAAdA,EAAOC,GACF,sBAELa,EAAA,oBAA8Bd,GACzB,wBAEW,WAAhBA,EAAOG,KACF,cAEF,IA6EP,MAA0B,WAAtBhB,EAAMa,OAAOG,KAEb,gBAACc,EAAe,CACdjB,OAAQb,EAAMa,OACdS,WAAYA,EACZC,cAAeC,IAKnB,gBAACW,EAAA,EAAQ,CAACC,SA9BZ,SAA0BC,GACxBhB,EAAgBgB,GAEZA,GAAatB,GAIjBU,GACF,EAsBwCa,KAAMlB,GAC1C,gBAACe,EAAA,SAAe,CACdrB,GAAE,uBAAkBd,EAAMa,OAAOC,IACjCb,UAAS,UAjBG,iDAiBW,YAAI+B,GAC3BO,QAAU3B,EAAmBV,SAAWa,EAAoB,OAAS,eACrEyB,SAAUxC,EAAMa,OAAO2B,YAEpBxC,EAAMa,OAAO4B,MACd,uBAAKxC,UAAW,gBACd,gBAACyC,EAAA,EAAY,CAACC,QAAS3C,EAAMa,OAAO4B,QAGvCzC,EAAMa,OAAO+B,YAAW,IAAG1B,GAG9B,gBAACiB,EAAA,OAAa,KACZ,uBAAKlC,UAAS,eAAU,aAAiB,YAAIiC,EAAgB,YAAKnB,EAAiC,GAAd,cACnF,gBAACe,EAAe,CACdjB,OAAQb,EAAMa,OACdS,WAAYA,EACZC,cAAeC,KAGdT,IAAqBf,EAAMa,OAAO2B,UACnC,gBAACzC,EAAa,CACZG,OAAQoB,EAAWpB,OACnBG,aA/EZ,W,MACQwC,EAAoC,QAApB,EAAA7C,EAAMa,OAAOiC,eAAO,eAAEC,MAAK,SAAAC,GAAC,OAAIA,EAAC,OAAQ,IAE/DzB,EAAc,CACZrB,QAAQ,EACR2B,UAAWgB,EAAgB,CAACA,GAAiB,IAEjD,EAyEYrC,aAvEZ,WACEiB,IACAJ,GAAgB,EAClB,MA2EF,CAtHAX,EAAaD,aAAe,CAC1BwB,WAAW,G,qPC7BN,IAAMgB,EAAc,CAUzBC,iBAAgB,SACdC,EACAC,EACAC,GAEA,OAAO,SAACC,GAAS,OAAKH,GAAS,SAAAxC,GAC7B,I,MAAM4C,EAAKC,EAAA,aAA0BH,GAAYA,EAAWG,EAAA,gBAC5D,OAAO,OAAP,wBAAY7C,I,EAAK,G,EAAGyC,E,EAAMG,EAAGD,EAAM3C,I,uXACrC,GAAE,CACJ,G,ggCCXF,SAAS8C,EAAsBC,GAO7B,OANcC,OAAOC,KAAKF,GAAcG,QAAO,SAACC,EAAaV,GAC3D,OAAOM,EAAaN,GAAKlD,OACrB4D,EAAM,EACNA,CACN,GAAG,EAGL,CAMM,SAAUC,EAAkB/D,GAChC,IAAQW,EAAU,aAAiB,KAA3BA,MACFC,EAAqBD,EAAMqD,YAE4B,IAAjC,WAAehE,EAAMa,OAAOI,MAAK,GAArDC,EAAK,KAAEC,EAAQ,KACwC,IAArB,YAAe,GAAM,GAAvDC,EAAY,KAAEC,EAAe,KAC+C,IAA9C,WAA2BT,GAAmB,GAA5EU,EAAU,KAAEC,EAAa,KAC8E,IAAzD,WAAekC,EAAsB7C,IAAoB,GAAvGqD,EAAkB,KAAEC,EAAqB,KAE3CC,EAAwBR,OAAOC,KAAKhD,GAAoBwD,KAAI,SAACtD,GACjE,MAAO,GAAP,OAAUA,EAAE,YAAIF,EAAmBE,GAAIZ,OACzC,IAAGmE,KAAK,KA4CR,SAAS5C,IACPE,EAAA,eACE3B,EAAMa,OAAOyD,QACb1D,EACAU,EACAX,EAAMiB,QAEV,CAjDA,aAAgB,WACdL,EAAcX,GACdsD,EAAsBT,EAAsB7C,GAC9C,GAAG,CAAEZ,EAAMa,OAAQsD,IAEnB,aAAgB,WACdhD,EAAS8C,EAAqB,GAAH,OAAMjE,EAAMa,OAAOI,KAAI,cAAMgD,GAAuBjE,EAAMa,OAAOI,KAC9F,GAAG,CAACgD,IA4CJ,IAAMM,EAAY,eAAH,OAAkB,YAAgB,aAEjD,OACE,gBAACpC,EAAA,EAAQ,CAACC,SAtBZ,SAA0BC,GACxBhB,EAAgBgB,GAEZA,GAIJZ,GACF,EAcwCa,KAAMlB,GAC1C,gBAACe,EAAA,SAAe,CAACrB,GAAId,EAAMa,OAAOC,GAAIb,UAAWsE,EAAWhC,QAAS0B,EAAqB,OAAS,gBAChG/C,GAGH,gBAACiB,EAAA,OAAa,CAAC/B,QAAS,SAACoE,GAAmB,OAAKA,EAAEC,iBAAiB,GAClE,uBAAKxE,UAAS,eAAU,mBAAuB,YAA0B,aAAtBD,EAAMa,OAAOG,KAAsB,YAAc,KACjGhB,EAAMa,OAAOyD,QAAQF,KAAI,SAAAvD,GACxB,IAAMiB,EAAkBjB,EAAOkB,gBAC3BlB,EAAOkB,gBACPJ,EAAA,sBAAgCd,EAAOG,MAE3C,OACE,4BAAUoC,IAAKvC,EAAOC,IACpB,gBAACgB,EAAe,CACdjB,OAAQA,EACRS,WAAYA,EAAWT,EAAOC,IAC9BS,cAAe0B,EAAYC,iBAAiB3B,EAAeV,EAAOC,IAClE4D,iBAAe,IAIvB,IAEA,gBAAC3E,EAAa,CACZG,SAAUyD,OAAOC,KAAKtC,GAAYyB,MAAK,SAACK,GAAc,OAAK9B,EAAW8B,GAAKlD,MAAM,IACjFG,aAvEV,WACE,IAEMqB,EAFYiC,OAAOC,KAAKhD,GAEHiD,QAAO,SAACC,EAAiBa,G,MAE5C9B,EAA8B,QAAd,EADP7C,EAAMa,OAAOyD,QAAQvB,MAAK,SAAA6B,GAAC,OAAIA,EAAE9D,KAAO6D,CAAQ,IAClC7B,eAAO,eAAEC,MAAK,SAAAC,GAAC,OAAIA,EAAC,OAAQ,IAOzD,OALAc,EAAIa,GAAY,CACdzE,QAAQ,EACR2B,UAAWgB,EAAgB,CAACA,GAAiB,IAGxCiB,CACT,GAAG,CAAC,GAEJvC,EAAcG,EAChB,EAwDUlB,aAtDV,WACEiB,IACAJ,GAAgB,EAClB,MAyDF,C,qCC9GM,SAAUwD,EAAc7E,GAC5B,IAEM8E,EAFa9E,EAAM+E,cAAchC,MAAK,SAAAlB,GAAS,OAAIA,EAAUf,KAAOd,EAAMsD,KAAKxC,EAAE,IAEvD,yBAA2B,WAE3D,OACE,gBAACkE,EAAA,EAAO,CACNC,IAAKjF,EAAMsD,KACX1B,QAAS5B,EAAM4B,QACfsD,SAAQ,wBAAmBJ,EAAU,SACrC1E,QAAS,kBAAMJ,EAAMI,QAAQJ,EAAMsD,KAAK,GAG9C,CC3BA,SAAgB,QAAU,S,o8BCkBpB,SAAU6B,EAAUnF,G,YAChBW,EAAU,aAAiB,KAA3BA,MAER,KAAiB,QAAZ,EAAAX,EAAMa,cAAM,eAAEC,IACjB,OAAO,iCAET,IAAMF,EAAqBD,EAAMX,EAAMa,OAAOC,IAE3BsE,EAAexE,EAA1BiB,UAEFwD,EAEJ,QAFuB,EAAqB,QAArB,EAAY,QAAZ,EAAArF,EAAMa,cAAM,eAAEiC,eAAO,eAAEjC,QAAO,SAAAyE,GACrD,QAAQF,aAAU,EAAVA,EAAYrC,MAAK,SAAAlB,GAAS,OAAIA,EAAUf,KAAOwE,EAAIxE,EAAE,IAC/D,WAAE,QAAI,GAEN,SAASyE,EAAcC,GACrB,I,MAAIC,EAA+B,KAE/BC,GAAuB,EAa3B,GAVAN,EAAWrC,MAAK,SAAClB,EAAW8D,GACtBD,GAAe,GAGf7D,EAAUf,GAAG8E,aAAeJ,EAAO1E,GAAG8E,aAG1CF,EAAcC,EAChB,IAEID,GAAe,EAAG,CACpB,IAAMG,EAAW,GAAH,SAAQT,EAAWU,MAAM,EAAGJ,IAAY,EAAKN,EAAWU,MAAMJ,EAAc,KAE1FD,EAAkB,CAChBvF,SAAU2F,EAASE,OACnBlE,UAAWgE,E,MAGbJ,EAAkB,CAChBvF,QAAQ,EACR2B,UAAWuD,EAAWY,OAAOR,IAIjC7D,EAAA,eACE,CAAC3B,EAAMa,QACPD,G,EAAkB,G,EACfZ,EAAMa,OAAOC,G,EAAK2E,G,uXACrB9E,EAAMiB,QAEV,CAaA,IAVM3B,EAUAgG,EAAa,GAAH,SAAQb,GAAU,EAAMpF,EAAMkG,WAAa,GAAKb,IAEhE,OACE,uBAAKpF,UAAYD,EAAMkG,YAAcD,EAAWF,OAAU,OAAS,IACjE,uBAAK9F,WAdHA,EAAY,OAEZgG,EAAWF,QAAU/F,EAAMkG,WAC7BjG,GAAa,SACLgG,EAAWF,QAAW/F,EAAMkG,aACpCjG,GAAa,WAERA,OAQCgG,EAAWF,QAAU/F,EAAMkG,aAC7B,gBAACC,EAAA,EAAa,CACZF,WAAYA,EACZG,eAAgB,SAACpG,GAAyB,OACxC,gBAAC6E,EAAa,iBACR7E,EAAK,CACT+E,cAAeK,EACfhF,QAASmF,IACT,EAEJc,eAAgBrG,EAAMkG,WAClB,IAAII,MAAM,GAAGC,KAAK,CAClBC,UAAW,kBAAM,gBAACC,EAAA,EAAc,CAACvB,SAAU,WAAkB,EAC7DwB,SAAU,QAEV,GAEJC,wBAAyB,kBACvB,uBAAK1G,UAAU,QACb,gBAACwG,EAAA,EAAc,CAACvB,SAAQ,UAAK,aACzB,KAOpB,C,eCjGM,SAAU0B,EAAY5G,GAC1B,IAAQW,EAAU,aAAiB,KAA3BA,MASR,OACE,gBAACR,EAAA,EAAS,CACRC,QATiB,WACnB,eAA2B,OAAD,wBACrBO,EAAMiB,SAAO,CAChBiF,OAAQ7G,EAAM8G,kBAAoB,CAAEC,MAAO/G,EAAM8G,mBAAsB,OAE3E,EAKI7G,UAAS,UAAKD,EAAMgH,UAAY,cAAgB,GAAE,wEAElD,gBAAC1G,EAAA,EAAI,CAACR,UAAU,qBAAqBS,OAAO,UAGlD,C,gvBCCM,SAAU0G,EAAcjH,GAC5B,I,IAAQkH,EAA8ElH,EAA9EkH,YAAatF,EAAiE5B,EAAjE4B,QAASuF,EAAwDnH,EAAxDmH,YAAaC,EAA2CpH,EAA3CoH,kBAAiB,EAA0BpH,EAAxBqH,gBAAAA,OAAe,IAAG,KAAE,EAE5E3F,EAAW,WAAc,WAC7B,OAAOC,EAAA,+BAAyCuF,EAAalH,EAAMsH,YAAatH,EAAMgE,YAAapC,EACrG,GAAG,CAAEsF,EAAaE,IAEmD,G,EAAzC,aAAiB,IAAe1F,G,EAAS,E,unBAA7Df,EAAK,KAAE4G,EAAQ,KAEvB,aAAgB,WACVC,EAAA,UAAqB9F,EAAUf,KAGnC4G,EAAS,CACPvG,KAAM,SACNyG,QAAS/F,IAGP1B,EAAM0H,kBACR/F,EAAA,kBACE3B,EAAMsH,YACNtH,EAAMgE,YACNtC,EACAwF,EAAYH,MACZ/G,EAAM0H,kBAGZ,GAAG,CAAChG,IAEJ,IAAMiG,EAAUC,EAAA,OAAiB,GAAD,SAC3BjG,EAAA,qBAA+BuF,IAAY,EAC3CG,KAGL,EAAqC1F,EAAA,uBACnChB,EACAgH,EACA3H,EAAMsH,YACNtH,EAAMgE,aAJAsD,EAAW,EAAXA,YAAatD,EAAW,EAAXA,YAQf6D,EAAyBP,EAAYzG,QAAO,SAAA+D,GAAC,MAAe,QAAXA,EAAE5D,IAAc,IACjE8G,EAAYR,EAAYvE,MAAK,SAAA6B,GAAC,MAAe,QAAXA,EAAE5D,IAAc,IAExD,OACE,gBAAC,aAAsB,CAAC+G,MAAO,CAAEpH,MAAAA,EAAO4G,SAAAA,IACtC,gBAAC,aAAiC,CAACQ,MAAM,wBACvC,+BACE,uBAAK9H,UAAS,iBAAaD,EAAMgI,YAA0C,GAA5B,6BAC3Cb,GACA,sBAAIlH,UAAU,oEACZ,gBAACK,EAAA,EAAI,CAACC,OAAO,aAIjB,uBAAKN,UAAS,2BAAsB,qBAAuB,YAAKkH,EAAuB,GAAT,SAC3EU,EAAuBzD,KAAI,SAAAQ,GAAC,OAC3B,gBAAClE,EAAY,CAAC0C,IAAKwB,EAAE9D,GAAID,OAAQ+D,EAAG3C,UAAWjC,EAAMiC,WAAa,IAGnE+B,GAAe,gBAACD,EAAiB,CAAClD,OAAQmD,IAE1CrC,EAAA,oBAA8BuF,KAAiBlH,EAAMiI,iBACpD,gBAACrB,EAAW,CACVU,YAAatH,EAAMsH,YACnBtD,YAAahE,EAAMgE,YACnB8C,kBAAmBI,EAAYH,MAC/BW,iBAAkB1H,EAAM0H,iBACxBV,UAAWhH,EAAMkI,yBAMzB,gBAAC/C,EAAS,CACRtE,OAAQiH,EACRZ,YAAaA,EACbhB,WAAYlG,EAAMoH,sBAM9B,C,6DChHaX,EAAiB,QAAW,YAA+C,QAApCvB,SAC5CiD,EAAa,0FAAH,YAD0C,IAAG,KAAE,EACsD,YAAI,gBAEzH,OACE,uBAAKlI,UAAU,QACb,wBAAMA,UAAWkI,GAAU,KAGjC,G,8FCJMC,EAAY,qBADA,eAgCZ,SAAUpD,EAAQhF,G,QACdiF,EAAsDjF,EAAtDiF,IAAKrD,EAAiD5B,EAAjD4B,QAASxB,EAAwCJ,EAAxCI,QAASoC,EAA+BxC,EAA/BwC,SAAQ,EAAuBxC,EAArBkF,SAAAA,OAAQ,IAAG,QAAK,EAEnDjE,EAAOgE,EAAIhE,KAAKoH,cAChBC,EAAqB,QAAX,EAAArD,EAAIqD,eAAO,eAAED,cAEvBE,EAAkBD,IAAY,YAAkBtI,EAAMwI,iBAAqC,QAAlB,EAAAxI,EAAMwI,oBAAY,eAAEC,WAC/FN,EAAa,oCAAH,OAAuCjD,EAAQ,YA1B/D,SAAyBoD,EAAkBC,GACzC,OAAQD,GACN,KAAK,aACL,KAAK,UACH,MAAO,0BAET,KAAK,WACH,MAAO,uBAET,KAAK,WACH,OAAKC,EAEE,GADE,wBAGX,QACE,MAAO,GAEb,CASmEG,CAAgBJ,EAASC,IAEtFA,IACFJ,GAAc,gBAEXvG,IAAWxB,GAAaoC,IAC3B2F,GAAc,mBAEZ3F,IACF2F,GAAc,IAAM,cAElBnI,EAAM2I,WACRR,GAAc,IAAM,WAEjBvG,IACHuG,GAAc,mBAEhB,IAAMS,EAA6BL,EAC/B,CAAEM,gBAAiB7I,EAAMwI,aAAaC,WACtC,CAAC,EAEL,OAAI7G,EAEA,gBAAC,IAAO,CACNxB,QAASA,EACTwB,QAASA,EACT3B,UAAWkI,EACXW,MAAO7H,EACP2H,MAAOA,GAEP,wBAAM3I,UAAU,6BAA6BgB,IAMjD,0BACEb,QAASA,EACTH,UAAWkI,EACXW,MAAO7H,EACP2H,MAAOA,EAAK,uBACGR,EAAU,cAAa,YAAInH,IAE1C,wBAAMhB,UAAU,6BACbgB,EACAjB,EAAM2I,UACL,0BACEvI,QAASJ,EAAM2I,SACf1I,UAAS,UAAK,UAAY,+BAC1B8I,KAAK,SAAQ,aACF,WAMvB,C,mFCzGA,SAAgB,QAAU,SCW1B,IACMX,EAAYY,EAAA,mBADA,uBAclB,SAASC,EAAQjJ,GACf,OACE,uBAAKC,UAAS,eAAU,YACtB,gBAACiJ,EAAA,EAAO,CACNtH,QAAS5B,EAAM4B,QACfuH,cAAenJ,EAAMmJ,cACrBzB,iBAAgB,+BAAO1H,EAAM0H,kBAAgB,CAAE0B,WAAY,eAC3DnJ,UAAS,+BAA0BD,EAAM4B,QAAU,sBAAwB,KAE3E,qBAAG3B,UAAU,yDAAyDmI,EAAU,aAIxF,CAEM,SAAUiB,EAAarJ,GAC3B,IAAMsJ,IAAmBtJ,EAAMuJ,YAE/B,OAAKvJ,EAAMiB,MAASjB,EAAMuJ,YAIxB,uBAAKtJ,UAAU,yBACb,uBAAKA,UAAU,oCACVD,EAAMiB,MACP,uBAAKhB,UAAW,SACd,gBAACiJ,EAAA,EAAO,CACNtH,QAAS5B,EAAM4B,QACf8F,iBAAkB1H,EAAM0H,iBACxByB,cAAenJ,EAAMmJ,cACrBlJ,UAAS,+BAA0BD,EAAM4B,QAAU,sBAAwB,IAC3ExB,QAASJ,EAAMI,SAEf,sBAAIH,UAAU,6BACXD,EAAMiB,UAKZjB,EAAM4B,UAAY0H,KAAoBtJ,EAAMwJ,iBAAmB,gBAACP,EAAO,iBAAKjJ,KAGhFsJ,GACC,uBAAKrJ,UAAU,kDACb,qBAAGA,UAAS,iDAA4C,gBACtD,4BAAOD,EAAMuJ,gBAEZvJ,EAAM4B,WAAa5B,EAAMwJ,iBAAmB,gBAACP,EAAO,iBAAKjJ,MA5B3D,gCAiCX,C,wxCCtEA,IAAMyJ,EAAwB,IAkBxB,SAAUC,EAAkB5G,GAChC,IAAQ9B,EAA0C8B,EAA1C9B,KAAML,EAAoCmC,EAApCnC,MAAOgJ,EAA6B7G,EAA7B6G,aAAcC,EAAe9G,EAAf8G,WAEsB,IAArB,YAAe,GAAM,GAAjDC,EAAS,KAAEC,EAAY,KACmD,IAA9B,WAA2B,CAAC,GAAE,GAA1EC,EAAiB,KAAEC,EAAoB,KAC2B,IAApB,WAAe,MAAK,GAAlEC,EAAkB,KAAEC,EAAqB,KAuHjD,OAlHA,aAAgB,WACD,YAATlJ,GAAuB2I,EAAaQ,SAAaxJ,EAA6ByJ,uBAElFC,YAAW,kBASLC,EAAqB3J,EAErB4J,EAAiBjE,MAAMkE,KAAKb,EAAaQ,QAAQM,UAAU5G,QAAO,SAACC,EAAK4G,GAC5E,I,MAAMC,EAAOD,aAAI,EAAJA,EAAME,wBAMbC,EACJF,EAAKG,KAAOR,EAAmBS,wBAC/BJ,EAAKK,MAAQV,EAAmBF,sBAElC,OAAO,OAAP,wBACKtG,I,EAAG,G,EACL4G,EAAK5J,G,EAAK+J,EACP,CACA,eAAe,GACb,CACF,eAAe,EACf,MAAS,S,uXAGjB,GAAG,CAAC,QAEJb,EAAqBO,GA1BvB,IACQD,EAEAC,CAXiC,GAAEd,EAAwB,GACnE,GAAG,CACDE,EAAaQ,QACbP,EACCjJ,EAA6BsK,OAC7BtK,EAA6ByJ,wBA0GzB,CACLP,UAAAA,EACAqB,cAhBF,SAAuBC,GACjBC,SAASC,cAAc,sBACzBvB,GAAa,GACbI,EAAsBiB,GAE1B,EAYEG,aAVF,WACOF,SAASC,cAAc,sBAC1BvB,GAAa,GACbI,EAAsB,MAE1B,EAMEqB,mBA3EF,SAA4BJ,GAC1B,IAAMK,EAAmB7K,EAKzB,OAFEwK,GAAUK,EAAiBP,OAASO,EAAiBC,eACrDN,EAAQK,EAAiBP,OAElB,CACL,eAAe,GAIZ,CACL,MAAS,OACT,eAAe,EAEnB,EA4DElB,kBAAAA,EACA2B,UAvDF,WACErB,YAAW,WAKT,IAJA,IAAMsB,EAAQhC,EAAaQ,QAAQyB,iBAAiB,mBAEhDC,EAAoC,KAE/BlG,EAAKsE,EAAqB,EAAItE,EAAIgG,EAAM5F,SAC3C8F,EADmDlG,IAIvDkG,EAAuBF,EAAMhG,GAAG0F,cAAc,mBAG5CQ,GACFA,EAAqBC,OACzB,GAAGrC,EAAwB,IAC7B,EAwCEsC,UAtCF,WACE1B,YAAW,WAIT,IAHA,IAAMsB,EAAQhC,EAAaQ,QAAQyB,iBAAiB,mBAEhDI,EAAoC,KAC/BrG,EAAIsE,EAAqB,EAAGtE,GAAK,IACpCqG,EADuCrG,IAI3CqG,EADaL,EAAMhG,GACS0F,cAAc,mBAGxCW,GACFA,EAAqBF,OACzB,GAAGrC,EAAwB,IAC7B,EAyBF,C,mFC7JMwC,EAAa,IAAIC,MACvBD,EAAWE,IAAM,yEAEV,IAAMC,EAEE,SAACC,GACPA,EAAMC,aAAaC,cAAiB/I,EAAA,aAA0B6I,EAAMC,aAAaC,eAGtFF,EAAMC,aAAaC,aAAaN,EAAY,EAAG,EACjD,ECJIO,EAAgBC,EAAA,kBA2BTC,EAAuB,cAAiB,SACnD1M,EACA2M,GAEA,IAGQC,EAhCkBC,EAAmBC,EAA6BC,EA6BlEtC,EAAwGzK,EAAxGyK,SAAUuC,EAA8FhN,EAA9FgN,aAAcC,EAAgFjN,EAAhFiN,OAAQC,EAAwElN,EAAxEkN,UAAWC,EAA6DnN,EAA7DmN,YAAaC,EAAgDpN,EAAhDoN,WAAYC,EAAoCrN,EAApCqN,kBAAiB,EAAmBrN,EAAjB0G,SAAAA,OAAQ,IAAG,IAAC,EAoB3G,OACE,oCACEzG,UAAU,2DACV2I,OApDsBiE,EAoDInG,EApDeoG,EAoDLE,EApDkCD,EAoDpBM,EAlDlDP,IAAgBQ,EAAAC,EAAA,YAA6BR,IAC/CF,GAAwBE,GAEnB,CACLS,UAAW,eAAF,OAAiBX,GAAS,OAAGC,EAAW,eAEjDW,WAAY,8BA6CVd,IAAKA,IArBDC,EAA4B,CAAC,EAE/BK,GAAUC,IACZN,EAAcc,WAAY,EAC1Bd,EAAcM,UAAYA,EAC1BN,EAAce,YAAcvB,EAC5BQ,EAAcgB,WAAaX,GAGzBE,GAAeC,GAAcZ,IAC/BI,EAAciB,mBAAqBV,EACnCP,EAAckB,kBAAoBV,GAG7BR,IAUJnC,EAGP,G,kBCrEA,IAAY6C,E,iBAAZ,SAAYA,GACV,iBACA,aACD,CAHD,CAAYA,IAAAA,EAAc,I,kBCA1B,IAAYS,EAYAC,E,iBAZZ,SAAYD,GACV,kBACA,sBACA,kBACA,gBACA,qBACD,CAND,CAAYA,IAAAA,EAAO,KAYnB,SAAYC,GACV,uBACA,2BACA,uBACA,qBACA,0BACD,CAND,CAAYA,IAAAA,EAAa,I,kBCZzB,IAAYC,E,iBAAZ,SAAYA,GACV,cACA,cACA,sBACA,kBACA,cACA,kBACA,6BACD,CARD,CAAYA,IAAAA,EAAiB,I,yGC0BvBC,EAA8B,CAClCC,SAAU,IACVC,UAAW,CACTC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,QAAS,KAEXC,WAAY,KAGR,SAAUC,EACdC,GAMkC,IALlCC,EAAA,uDAA+B,CAAC,EAKhCC,EAAA,uDAAgC,CAAC,EAEjC,GAAKF,EAAL,CAGA,IAAIG,EAGFA,EADmB,iBAAVH,EACIA,EAEAA,EAAKI,OAGpB,IAAMC,EAAW,OAAH,wBACTd,GACAU,GAGAE,GAGA,yBAAmCA,KAGpCA,IAAe,aAMfA,IAAe,cAUdD,EAAUJ,YACb,aAAuB,IAAIO,EAASP,YAN/BI,EAAUT,WACb,aAAuB,IAAIY,EAASZ,UAAUI,SAX3CK,EAAUV,UACb,aAAuB,IAAIa,EAASb,UAvBhC,CAuCV,C,mCCrFA,SAAgB,qBAAuB,QAAQ,cAAgB,QAAQ,iBAAmB,Q,mCCA1F,SAAgB,QAAU,QAAQ,SAAW,QAAQ,WAAa,QAAQ,MAAQ,QAAQ,MAAQ,Q","sources":["file:///app/packages/libs/shared/src/apps/search/components/filter-actions/FilterActions.tsx","file:///app/packages/libs/shared/src/apps/search/components/filter-button/filter-button.scss","file:///app/packages/libs/shared/src/apps/search/components/filter-button/FilterButton.tsx","file:///app/packages/libs/shared/src/utils/StateHelper.ts","file:///app/packages/libs/shared/src/apps/search/components/filter-button/MoreFiltersButton.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","file:///app/packages/libs/shared/src/apps/search/components/filter-types/tag-filter/tag-filter.scss","file:///app/packages/libs/shared/src/apps/search/components/filter-types/tag-filter/TagFilter.tsx","file:///app/packages/libs/shared/src/apps/search/components/reset-button/ResetButton.tsx","file:///app/packages/libs/shared/src/apps/search/components/search-filters/SearchFilters.tsx","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/tags/TagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/widget-header.scss","file:///app/packages/libs/shared/src/components/widgets/curated-widgets/components/header/WidgetHeader.tsx","file:///app/packages/libs/shared/src/components/widgets/hooks/useWidgetKeyboard.ts","file:///app/packages/libs/shared/src/utils/DragHelper.ts","file:///app/packages/libs/shared/src/components/widgets/sliding-list/SlidingListContainer.tsx","file:///app/packages/libs/shared/src/enums/CssMeasurement.ts","file:///app/packages/libs/shared/src/enums/TagType.ts","file:///app/packages/libs/shared/src/enums/WidgetInteraction.ts","file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/apps/search/components/search-filters/search-filters.scss","file:///app/packages/libs/shared/src/components/tags/tags.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'search.filterActions';\n\ninterface FilterActionsProps {\n className?: string;\n onClickReset: () => void;\n onClickApply: () => void;\n active: boolean;\n}\n\nFilterActions.defaultProps = {\n active: false,\n className: ''\n};\n\nexport function FilterActions(props: FilterActionsProps): JSX.Element {\n return (\n <div className={`d-flex justify-content-between ${props.className}`}>\n {props.active ? (\n <DivButton className='text-secondary hover-text-underline cursor-pointer' onClick={props.onClickReset}>\n <Text namespace={namespace} phrase='reset' />\n </DivButton>\n ) : (\n <div className='invisible' />\n )}\n\n <DivButton className='info-link' onClick={props.onClickApply}>\n <Text namespace={namespace} phrase='apply' />\n </DivButton>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"hideCaret\":\"KDq7l\",\"filterMenu\":\"E9o_Q\",\"twoColumnsWidth\":\"C70vU\",\"nestedCheckboxesWidth\":\"kUHcg\",\"switchWidth\":\"bi1FH\",\"moreFiltersWidth\":\"rbr22\",\"svgContainer\":\"UwDMA\"};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\n\nimport styles from './filter-button.scss';\n\n/**\n * If your filter requires some customisations to the default width, add a use case here.\n */\nfunction getCustomWidthClass(filter: SearchFilter): string {\n if (FilterHelper.displayTwoColumns(filter))\n return styles.twoColumnsWidth;\n\n // Some classifications has long names, so we make them wider\n if (filter.id === 'classification')\n return styles.classificationWidth;\n \n if (FilterHelper.displayTwoLayers(filter))\n return styles.nestedCheckboxesWidth;\n\n if (filter.type === 'switch')\n return styles.switchWidth;\n\n return '';\n}\n\nFilterButton.defaultProps = {\n hideCaret: true\n};\n\ninterface FilterButtonProps {\n filter: SearchFilter;\n hideCaret?: boolean;\n}\n\nexport function FilterButton(props: FilterButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state[props.filter.id];\n\n const isDropdownFilter = props.filter.type === 'dropdown';\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<FilterState>(currentFilterState);\n\n React.useEffect(() => {\n setLabel(FilterHelper.getLabel(props.filter, currentFilterState));\n setDraftState(currentFilterState);\n }, [ props.filter, currentFilterState?.selection ]);\n\n function onSelectItem(state: FilterState): void {\n setDraftState(state);\n\n if (isDropdownFilter)\n applyFilter(state);\n }\n\n function onClickReset(): void {\n const defaultOption = props.filter.options?.find(o => o.default);\n\n setDraftState({\n active: false,\n selection: defaultOption ? [defaultOption] : []\n });\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function applyFilter(newState: FilterState = draftState): void {\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: newState },\n state.appLink\n );\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing || isDropdownFilter)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n const FilterComponent = React.useMemo(() => {\n return props.filter.customComponent\n ? props.filter.customComponent\n : FilterHelper.mapTypeToComponent(props.filter.type);\n }, [props.filter.type]);\n\n const baseClass = `fw-semibold mx-1 btn d-flex align-items-center`;\n const caretClass = props.hideCaret && !isDropdownFilter ? styles.hideCaret : '';\n const customWidthClass = getCustomWidthClass(props.filter);\n\n if (props.filter.type === 'button')\n return (\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n );\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle\n id={`filterButton-${props.filter.id}`}\n className={`${baseClass} ${caretClass}`}\n variant={(currentFilterState.active && !isDropdownFilter) ? 'dark' : 'outline-dark'}\n disabled={props.filter.disabled}\n >\n {!!props.filter.icon && (\n <div className={styles.svgContainer}>\n <SvgContainer svgName={props.filter.icon} />\n </div>\n )}\n {props.filter.labelPrefix} {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu>\n <div className={`mx-1 ${styles.filterMenu} ${customWidthClass} ${!isDropdownFilter ? 'px-2 py-1' : ''}`}>\n <FilterComponent\n filter={props.filter}\n draftState={draftState}\n setDraftState={onSelectItem}\n />\n\n {(!isDropdownFilter && !props.filter.disabled) && (\n <FilterActions\n active={draftState.active}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n )}\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}\n","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nexport const StateHelper = {\n /**\n * Helper function to get the setState function for an individual key in a state object.\n * \n * @param setState React setState action\n * @param key Property within the state object we're updating\n * @param callback Optional callback to modify data before setting state. Uses identity fn by default.\n * \n * @returns Newly updated state object\n */\n getSetStateByKey<T extends HashObject>(\n setState: React.Dispatch<React.SetStateAction<T>>,\n key: keyof T,\n callback?: (data: any, state?: T) => T[keyof T]\n ): (data: any) => void {\n return (data: any) => setState(state => {\n const fn = FunctionHelper.isFunction(callback) ? callback : FunctionHelper.useIdentity<T>();\n return { ...state, [key]: fn(data, state) };\n });\n }\n};","import * as React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { FilterActions } from 'libs/shared/apps/search/components/filter-actions/FilterActions';\nimport { FilterIds, MoreFilters } from 'libs/shared/apps/search/interfaces';\nimport { DraftState, FilterContext, FilterStateHash } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { StateHelper } from 'libs/shared/utils/StateHelper';\n\nimport styles from './filter-button.scss';\n\nfunction getTotalActiveFilters(currentState: FilterStateHash): number {\n const total = Object.keys(currentState).reduce((acc: number, key: FilterIds) => {\n return currentState[key].active\n ? acc + 1\n : acc;\n }, 0);\n\n return total;\n}\n\ninterface MoreFiltersButtonProps {\n filter: MoreFilters;\n}\n\nexport function MoreFiltersButton(props: MoreFiltersButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n const currentFilterState = state.moreFilters;\n\n const [ label, setLabel ] = React.useState(props.filter.name);\n const [ showDropdown, setShowDropdown ] = React.useState(false);\n const [ draftState, setDraftState ] = React.useState<DraftState>(currentFilterState);\n const [ totalActiveFilters, setTotalActiveFilters ] = React.useState(getTotalActiveFilters(currentFilterState));\n\n const currentFilterStateKey = Object.keys(currentFilterState).map((id: FilterIds) => {\n return `${id}:${currentFilterState[id].active}`;\n }).join('-');\n\n React.useEffect(() => {\n setDraftState(currentFilterState);\n setTotalActiveFilters(getTotalActiveFilters(currentFilterState));\n }, [ props.filter, currentFilterStateKey ]);\n\n React.useEffect(() => {\n setLabel(totalActiveFilters ? `${props.filter.name} - ${totalActiveFilters}` : props.filter.name);\n }, [totalActiveFilters]);\n\n function onClickReset(): void {\n const filterIds = Object.keys(currentFilterState) as FilterIds[];\n\n const newState = filterIds.reduce((acc: DraftState, filterId) => {\n const filter = props.filter.filters.find(f => f.id === filterId);\n const defaultOption = filter.options?.find(o => o.default);\n\n acc[filterId] = {\n active: false,\n selection: defaultOption ? [defaultOption] : []\n };\n\n return acc;\n }, {});\n\n setDraftState(newState);\n }\n\n function onClickApply(): void {\n applyFilter();\n setShowDropdown(false);\n }\n\n function onToggleDropdown(isShowing: boolean): void {\n setShowDropdown(isShowing);\n\n if (isShowing)\n return;\n\n // Apply the filter if the dropdown has been closed\n applyFilter();\n }\n\n function applyFilter(): void {\n FilterHelper.applyFilter(\n props.filter.filters,\n currentFilterState,\n draftState,\n state.appLink\n );\n }\n\n const baseClass = `fw-semibold ${styles.hideCaret} mx-1 btn`;\n\n return (\n <Dropdown onToggle={onToggleDropdown} show={showDropdown}>\n <Dropdown.Toggle id={props.filter.id} className={baseClass} variant={totalActiveFilters ? 'dark' : 'outline-dark'}>\n {label}\n </Dropdown.Toggle>\n\n <Dropdown.Menu onClick={(e: React.MouseEvent) => e.stopPropagation()}>\n <div className={`mx-1 ${styles.moreFiltersWidth} ${props.filter.type !== 'dropdown' ? 'px-2 py-1' : ''}`}>\n {props.filter.filters.map(filter => {\n const FilterComponent = filter.customComponent\n ? filter.customComponent\n : FilterHelper.mapTypeToComponent(filter.type);\n\n return (\n <fieldset key={filter.id}>\n <FilterComponent\n filter={filter}\n draftState={draftState[filter.id]}\n setDraftState={StateHelper.getSetStateByKey(setDraftState, filter.id)}\n isOnMoreFilters\n />\n </fieldset>\n );\n })}\n\n <FilterActions\n active={!!Object.keys(draftState).find((key: FilterIds) => draftState[key].active)}\n onClickReset={onClickReset}\n onClickApply={onClickApply}\n />\n </div>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"tagItem\":\"j84HW\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FilterOption, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterState } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { PartialTagItem } from 'libs/shared/components/tags/PartialTagItem';\nimport { DynamicWidget } from 'libs/shared/components/widgets/dynamic-widget/DynamicWidget';\nimport { TagWidgetItem, TagWidgetItemProps } from 'libs/shared/components/widgets/items/tag-widget-item/TagWidgetItem';\n\nimport styles from './tag-filter.scss';\n\ninterface TagFilterProps {\n filter: SearchFilter;\n queryParams: HashObject;\n isFetching?: boolean;\n}\n\nexport function TagFilter(props: TagFilterProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n if (!props.filter?.id)\n return <></>;\n\n const currentFilterState = state[props.filter.id];\n\n const { selection: selections } = currentFilterState;\n\n const unappliedOptions = props.filter?.options?.filter(opt => {\n return !selections?.find(selection => selection.id === opt.id);\n }) ?? [];\n\n function onClickOption(option: FilterOption): void {\n let nextFilterState: FilterState = null;\n\n let indexOfItem: number = -1;\n\n // Find the index of the selected item if it's already selected\n selections.find((selection, i) => {\n if (indexOfItem > -1)\n return;\n\n if (selection.id.toString() !== option.id.toString())\n return;\n\n indexOfItem = i;\n });\n\n if (indexOfItem >= 0) {\n const newItems = [ ...selections.slice(0, indexOfItem), ...selections.slice(indexOfItem + 1) ];\n \n nextFilterState = {\n active: !!newItems.length,\n selection: newItems\n };\n } else {\n nextFilterState = {\n active: true,\n selection: selections.concat(option)\n };\n }\n\n FilterHelper.applyFilter(\n [props.filter],\n currentFilterState,\n { [props.filter.id]: nextFilterState },\n state.appLink\n );\n }\n\n function getContainerClass(): string {\n let className = 'mb-3';\n\n if (collection.length && props.isFetching)\n className += ' mt-n1';\n else if (!collection.length && !props.isFetching)\n className += ' d-none';\n\n return className;\n }\n\n const collection = [ ...selections, ...(props.isFetching ? [] : unappliedOptions) ];\n\n return (\n <div className={(props.isFetching || collection.length) ? 'py-2' : ''}>\n <div className={getContainerClass()}>\n {(!!collection.length || props.isFetching) && (\n <DynamicWidget\n collection={collection}\n childComponent={(props: TagWidgetItemProps) => (\n <TagWidgetItem\n {...props}\n selectedItems={selections}\n onClick={onClickOption}\n />\n )}\n staticChildren={props.isFetching\n ? new Array(3).fill({\n component: () => <PartialTagItem tagClass={styles.tagItem} />,\n position: 'end'\n })\n : []\n }\n partialLoadingComponent={() => (\n <div className='me-2'>\n <PartialTagItem tagClass={`${styles.tagItem}`} />\n </div>\n )}\n />\n )}\n </div>\n </div>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { MoreFilters, SearchFilter } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext } from 'libs/shared/apps/search/reducers';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PropsWithAnalyticsOptions } from 'libs/shared/interfaces';\n\ntype ResetButtonProps = PropsWithAnalyticsOptions<{\n currentQueryParam: string;\n mainFilters: Array<SearchFilter>;\n moreFilters: MoreFilters;\n alignLeft?: boolean;\n}>;\n\nexport function ResetButton(props: ResetButtonProps): JSX.Element {\n const { state } = React.useContext(FilterContext);\n\n const onClickReset = () => {\n Core.AppLinkHelper.trigger({\n ...state.appLink,\n params: props.currentQueryParam ? { query: props.currentQueryParam } : null\n });\n };\n\n return (\n <DivButton\n onClick={onClickReset}\n className={`${props.alignLeft ? 'order-first' : ''} hover-text-underline cursor-pointer d-flex align-items-center mx-2`}\n >\n <Text namespace='search.resetButton' phrase='reset' />\n </DivButton>\n );\n}","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { FilterButton } from 'libs/shared/apps/search/components/filter-button/FilterButton';\nimport { MoreFiltersButton } from 'libs/shared/apps/search/components/filter-button/MoreFiltersButton';\nimport { TagFilter } from 'libs/shared/apps/search/components/filter-types/tag-filter/TagFilter';\nimport { ResetButton } from 'libs/shared/apps/search/components/reset-button/ResetButton';\nimport { MoreFilters, SearchFilter, SearchIndices } from 'libs/shared/apps/search/interfaces';\nimport { FilterContext, FilterReducer } from 'libs/shared/apps/search/reducers';\nimport { FilterHelper } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport styles from './search-filters.scss';\n\ntype SearchFiltersProps = {\n queryParams: HashObject;\n mainFilters: SearchFilter[];\n appLink: Core.AppLink;\n moreFilters?: MoreFilters;\n isFetchingOptions?: boolean;\n constantIndices?: SearchIndices[];\n analyticsOptions?: AnalyticsOptions;\n\n hideHeading?: boolean;\n hideDivider?: boolean;\n hideResetButton?: boolean;\n alignResetButtonLeft?: boolean;\n hideCaret?: boolean;\n};\n\nexport function SearchFilters(props: SearchFiltersProps): JSX.Element {\n const { queryParams, appLink, hideHeading, isFetchingOptions, constantIndices = []} = props;\n\n const newState = React.useMemo(() => {\n return FilterHelper.deriveInitialStateFromQuery(queryParams, props.mainFilters, props.moreFilters, appLink);\n }, [ queryParams, isFetchingOptions ]);\n\n const [ state, dispatch ] = React.useReducer(FilterReducer, newState);\n\n React.useEffect(() => {\n if (ObjectHelper.isEqual(newState, state))\n return;\n\n dispatch({\n type: 'update',\n payload: newState\n });\n\n if (props.analyticsOptions) {\n FilterHelper.logFilterEvent(\n props.mainFilters,\n props.moreFilters,\n newState,\n queryParams.query,\n props.analyticsOptions\n );\n }\n }, [newState]);\n\n const indices = ArrayHelper.uniq([\n ...FilterHelper.getAppliedIndices(queryParams),\n ...constantIndices\n ]);\n\n const { mainFilters, moreFilters } = FilterHelper.mixinDisabledFields(\n state,\n indices,\n props.mainFilters,\n props.moreFilters\n );\n\n // Separate the tag filter as it's rendered differently\n const mainFiltersWithoutTags = mainFilters.filter(f => f.type !== 'tag');\n const tagFilter = mainFilters.find(f => f.type === 'tag');\n\n return (\n <FilterContext.Provider value={{ state, dispatch }}>\n <LanguageNamespaceContext.Provider value='search.searchFilters'>\n <section>\n <div className={`d-flex ${!props.hideDivider ? 'border-bottom pb-3 mb-3' : ''}`}>\n {!hideHeading && (\n <h2 className='h5 mb-0 d-inline-block pe-2 border-end d-flex align-items-center'>\n <Text phrase='heading' />\n </h2>\n )}\n\n <div className={`d-flex flex-wrap ${styles.filtersContainer} ${!hideHeading ? 'ms-2' : ''}`}>\n {mainFiltersWithoutTags.map(f => (\n <FilterButton key={f.id} filter={f} hideCaret={props.hideCaret} />\n ))}\n\n {moreFilters && <MoreFiltersButton filter={moreFilters} />}\n\n {FilterHelper.hasActiveFilters(queryParams) && !props.hideResetButton && (\n <ResetButton\n mainFilters={props.mainFilters}\n moreFilters={props.moreFilters}\n currentQueryParam={queryParams.query}\n analyticsOptions={props.analyticsOptions}\n alignLeft={props.alignResetButtonLeft}\n />\n )}\n </div>\n </div>\n \n <TagFilter\n filter={tagFilter}\n queryParams={queryParams}\n isFetching={props.isFetchingOptions}\n />\n </section>\n </LanguageNamespaceContext.Provider>\n </FilterContext.Provider>\n );\n}\n","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}>&nbsp;</span>\n </div>\n );\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { TagType } from 'libs/shared/enums/TagType';\nimport { Tag, ThemeColours } from 'libs/shared/interfaces';\n\nimport styles from './tags.scss';\n\nconst namespace = 'shared.tags';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TagItemProps {\n tag: Tag;\n themeColours?: ThemeColours;\n appLink?: Core.AppLink;\n onClick?: () => void;\n onRemove?: () => void;\n disabled?: boolean;\n tagClass?: string;\n}\n\nfunction getTagTypeClass(tagType: TagType, hasThemeColour: boolean): string {\n switch (tagType) {\n case TagType.Pedagogy:\n case TagType.Skill:\n return 'pedagogy-tag text-white';\n\n case TagType.Hidden:\n return 'hidden-tag fw-normal';\n\n case TagType.Normal:\n if (!hasThemeColour)\n return 'bg-gray-100 fw-normal';\n return '';\n\n default:\n return '';\n }\n}\n\nexport function TagItem(props: TagItemProps): JSX.Element {\n const { tag, appLink, onClick, disabled, tagClass = 'tag' } = props;\n\n const name = tag.name.toLowerCase();\n const tagType = tag.tagType?.toLowerCase() as TagType;\n\n const hasThemeColour = (tagType === TagType.Normal && props.themeColours) && !!props.themeColours?.secondary;\n let classNames = `rounded-pill py-1 px-2 my-1 me-1 ${tagClass} ${getTagTypeClass(tagType, hasThemeColour)}`;\n\n if (hasThemeColour)\n classNames += ' text-white';\n\n if ((appLink || onClick) && !disabled)\n classNames += ' cursor-pointer';\n\n if (disabled)\n classNames += ' ' + styles.disabled;\n\n if (props.onRemove)\n classNames += ' ' + styles.badge;\n\n if (!appLink)\n classNames += ' d-inline-block';\n\n const style: React.CSSProperties = hasThemeColour\n ? { backgroundColor: props.themeColours.secondary }\n : {};\n\n if (appLink) {\n return (\n <AppLink\n onClick={onClick}\n appLink={appLink}\n className={classNames}\n title={name}\n style={style}\n >\n <span className='text-truncate text-nowrap'>{name}</span>\n </AppLink>\n );\n }\n\n return (\n <button\n onClick={onClick}\n className={classNames}\n title={name}\n style={style}\n aria-label={`${getPhrase('ariaFilter')} ${name}`}\n >\n <span className='text-truncate text-nowrap'>\n {name}\n {props.onRemove &&\n <button\n onClick={props.onRemove}\n className={`${styles.close} btn-close font-size-normal`}\n role='button'\n aria-label='Close'\n />\n }\n </span>\n </button>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"seeMore\":\"yv0FS\"};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsOptions, ClickDescriptor } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport styles from './widget-header.scss';\n\nconst namespace = 'shared.widgetHeader';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface WidgetHeaderProps {\n name: string;\n description: string;\n\n appLink?: Core.AppLink;\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n showSeeMoreLink?: boolean;\n onClick?: () => void;\n}\n\nfunction SeeMore(props: WidgetHeaderProps) {\n return (\n <div className={`ms-3 ${styles.seeMore}`}>\n <AppLink\n appLink={props.appLink}\n analyticsData={props.analyticsData }\n analyticsOptions={{ ...props.analyticsOptions, descriptor: ClickDescriptor.SeeMore }}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n >\n <p className='hover-text-underline text-dark curated-widget-heading'>{getPhrase('seeMore')}</p>\n </AppLink>\n </div>\n );\n}\n\nexport function WidgetHeader(props: WidgetHeaderProps): JSX.Element {\n const hasDescription = !!props.description;\n\n if (!props.name && !props.description)\n return <></>;\n\n return (\n <div className='curated-widget-header'>\n <div className='d-flex justify-content-between'>\n {!!props.name && (\n <div className={styles.title}>\n <AppLink\n appLink={props.appLink}\n analyticsOptions={props.analyticsOptions}\n analyticsData={props.analyticsData}\n className={`text-decoration-none ${props.appLink ? 'curated-widget-link' : ''}`}\n onClick={props.onClick}\n >\n <h2 className='h4 curated-widget-heading'>\n {props.name}\n </h2>\n </AppLink>\n </div>\n )}\n {!!props.appLink && !hasDescription && !!props.showSeeMoreLink && <SeeMore {...props}/>}\n </div>\n \n {hasDescription && (\n <div className='d-flex justify-content-between align-items-end'>\n <p className={`description curated-widget-description ${styles.description}`}>\n <span>{props.description}</span>\n </p>\n {!!props.appLink && !!props.showSeeMoreLink && <SeeMore {...props}/> }\n </div>\n )}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { DynamicWidgetState } from 'libs/shared/components/widgets/dynamic-widget';\nimport { FixedWidgetState } from 'libs/shared/components/widgets/fixed-widget';\n\n// Sync with transition time in SlidingListContainer.tsx\nconst SLIDER_ANIMATION_TIME = 400;\n\ntype FixedWidgetKeyboardOptions = {\n type: 'fixed',\n state: FixedWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery?: never;\n}\n\ntype DynamicWidgetKeyboardOptions = {\n type: 'dynamic',\n state: DynamicWidgetState,\n containerRef: React.MutableRefObject<HTMLElement>\n mediaQuery: string\n}\n\ntype UseWidgetKeyboard = FixedWidgetKeyboardOptions | DynamicWidgetKeyboardOptions\n\nexport function useWidgetKeyboard(options: UseWidgetKeyboard) {\n const { type, state, containerRef, mediaQuery } = options;\n\n const [ isTabbing, setIsTabbing ] = React.useState(false);\n const [ dynamicAttributes, setDynamicAttributes ] = React.useState<HashObject>({});\n const [ focusedWidgetIndex, setFocusedWidgetIndex ] = React.useState(null);\n \n /**\n * Get accessibility attributes for dynamic widget items\n * */\n React.useEffect(() => {\n if (type !== 'dynamic' || !containerRef.current || !(state as DynamicWidgetState).containerLeftPosition) return;\n \n setTimeout(() => getDynamicAttributes(), SLIDER_ANIMATION_TIME + 50);\n }, [\n containerRef.current,\n mediaQuery,\n (state as DynamicWidgetState).offset,\n (state as DynamicWidgetState).containerLeftPosition\n ]);\n\n function getDynamicAttributes() {\n const dynamicWidgetState = state as DynamicWidgetState;\n \n const focusableItems = Array.from(containerRef.current.children).reduce((acc, item) => {\n const rect = item?.getBoundingClientRect();\n\n /**\n * When any part of the widget item is visible it should be focusable,\n * otherwise prevent interaction and the slider should be the next focusable element\n * */\n const isItemVisable =\n rect.left < dynamicWidgetState.containerRightPosition &&\n rect.right > dynamicWidgetState.containerLeftPosition;\n\n return {\n ...acc,\n [item.id]: isItemVisable\n ? {\n 'aria-hidden': false\n } : {\n 'aria-hidden': true,\n 'inert': 'true'\n }\n };\n }, {});\n\n setDynamicAttributes(focusableItems);\n }\n\n /**\n * Get accessibility attributes for fixed widget items\n * */\n function getFixedAttributes(index?: number) {\n const fixedWidgetState = state as FixedWidgetState;\n\n const isItemVisible =\n index >= (fixedWidgetState.offset - fixedWidgetState.viewableItems) &&\n index < fixedWidgetState.offset;\n if (isItemVisible) {\n return {\n 'aria-hidden': false\n };\n }\n\n return {\n 'inert': 'true',\n 'aria-hidden': true\n };\n }\n\n /**\n * When the user is not signed in, there may be videos which are not focusable.\n * setTimeout is required because the transition time is 400ms\n */\n function focusNext() {\n setTimeout(() => {\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let nextFocusableElement: HTMLElement = null;\n\n for (let i = (focusedWidgetIndex + 1); i < items.length; i++) {\n if (nextFocusableElement)\n break;\n \n nextFocusableElement = items[i].querySelector('a[tabindex=\"0\"]');\n }\n\n if (nextFocusableElement)\n nextFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function focusPrev() {\n setTimeout(() => {\n const items = containerRef.current.querySelectorAll('li[aria-hidden]');\n\n let prevFocusableElement: HTMLElement = null;\n for (let i = focusedWidgetIndex - 1; i >= 0; i--) {\n if (prevFocusableElement) break;\n \n const item = items[i];\n prevFocusableElement = item.querySelector('a[tabindex=\"0\"]');\n }\n \n if (prevFocusableElement)\n prevFocusableElement.focus();\n }, SLIDER_ANIMATION_TIME + 100);\n }\n\n function onFocusWidget(index: number) {\n if (document.querySelector('.user-is-tabbing')) {\n setIsTabbing(true);\n setFocusedWidgetIndex(index);\n }\n }\n\n function onBlurWidget() {\n if (!document.querySelector('.user-is-tabbing')) {\n setIsTabbing(false);\n setFocusedWidgetIndex(null);\n }\n }\n\n return {\n isTabbing,\n onFocusWidget,\n onBlurWidget,\n getFixedAttributes,\n dynamicAttributes,\n focusNext,\n focusPrev\n };\n}","import { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst blankImage = new Image();\nblankImage.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';\n\nexport const DragHelper = {\n // This removes the image that appears when you drag a draggable HTML element\n hideDragImage(event: React.DragEvent<HTMLElement>): void {\n if (!event.dataTransfer.setDragImage || !FunctionHelper.isFunction(event.dataTransfer.setDragImage))\n return;\n\n event.dataTransfer.setDragImage(blankImage, 0, 0);\n }\n};","import * as React from 'react';\n\nimport { UserAgentHelper } from 'libs/common/backbone/utils/UserAgentHelper';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { CssMeasurement } from 'libs/shared/enums/CssMeasurement';\nimport { DragHelper } from 'libs/shared/utils/DragHelper';\n\nconst isTouchScreen = UserAgentHelper.isTouchScreen();\n\nconst getPositionStyling = (xPosition: number, measurement: CssMeasurement, dragPercentage?: number) => {\n // Used in situations where a touch screen user is dragging the `<FixedWidget />`\n if (measurement === CssMeasurement.Percentage && dragPercentage)\n xPosition = xPosition - dragPercentage;\n \n return {\n transform: `translate3d(${xPosition}${measurement}, 0px, 0px)`,\n // Sync with transition time in useWidgetKeyboard.ts\n transition: 'transform .4s ease-in-out'\n };\n};\n\ninterface SlidingListContainerProps extends React.PropsWithChildren<unknown> {\n position: number;\n positionType: CssMeasurement;\n\n onDrag?: (event: React.DragEvent<HTMLUListElement>) => void;\n onDragEnd?: () => void;\n\n onTouchMove?: (event: React.TouchEvent<HTMLUListElement>) => void;\n onTouchEnd?: () => void;\n\n percentageDragged?: number;\n}\n\nexport const SlidingListContainer = React.forwardRef((\n props: SlidingListContainerProps,\n ref: React.MutableRefObject<HTMLUListElement>\n): JSX.Element => {\n const { children, positionType, onDrag, onDragEnd, onTouchMove, onTouchEnd, percentageDragged, position = 0 } = props;\n\n function getEventListeners(): HashObject {\n const listenerProps: HashObject = {};\n\n if (onDrag && onDragEnd) {\n listenerProps.draggable = true;\n listenerProps.onDragEnd = onDragEnd;\n listenerProps.onDragStart = DragHelper.hideDragImage;\n listenerProps.onDragOver = onDrag;\n }\n\n if (onTouchMove && onTouchEnd && isTouchScreen) {\n listenerProps.onTouchMoveCapture = onTouchMove;\n listenerProps.onTouchEndCapture = onTouchEnd;\n }\n\n return listenerProps;\n }\n\n return (\n <ul\n className='list-unstyled d-flex flex-nowrap position-relative w-100'\n style={getPositionStyling(position, positionType, percentageDragged)}\n ref={ref}\n {...getEventListeners()}\n >\n {children}\n </ul>\n );\n});","export enum CssMeasurement {\n Percentage = '%',\n Pixels = 'px'\n}","export enum TagType {\n Normal = 'normal',\n Pedagogy = 'pedagogy',\n Hidden = 'hidden',\n Skill = 'skill',\n Curation = 'curation'\n}\n\n/**\n * This should **only** be used to create new tags in master (as it only accepts enum values).\n * Use the string enum above for all other cases.\n */\nexport enum TagTypeNumber {\n Normal = 0,\n Pedagogy = 1,\n Hidden = 2,\n Skill = 3,\n Curation = 4\n}","export enum WidgetInteraction {\n Init = 'init',\n Next = 'next',\n Previous = 'previous',\n Resize = 'resize',\n Drag = 'drag',\n Update = 'update',\n JumpToIndex = 'jump-to-index'\n}","import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialFilterHeading\":\"O8f8H\",\"partialButton\":\"ThKam\",\"filtersContainer\":\"JIp3h\"};","// extracted by mini-css-extract-plugin\nexport default {\"tagList\":\"Zw6d9\",\"disabled\":\"jlL1c\",\"partialTag\":\"too_N\",\"badge\":\"OjtN8\",\"close\":\"X9joI\"};"],"names":["namespace","FilterActions","props","className","active","DivButton","onClick","onClickReset","Text","phrase","onClickApply","defaultProps","FilterButton","state","currentFilterState","filter","id","isDropdownFilter","type","name","label","setLabel","showDropdown","setShowDropdown","draftState","setDraftState","onSelectItem","applyFilter","newState","FilterHelper","appLink","selection","FilterComponent","customComponent","caretClass","hideCaret","customWidthClass","Dropdown","onToggle","isShowing","show","variant","disabled","icon","SvgContainer","svgName","labelPrefix","defaultOption","options","find","o","StateHelper","getSetStateByKey","setState","key","callback","data","fn","FunctionHelper","getTotalActiveFilters","currentState","Object","keys","reduce","acc","MoreFiltersButton","moreFilters","totalActiveFilters","setTotalActiveFilters","currentFilterStateKey","map","join","filters","baseClass","e","stopPropagation","isOnMoreFilters","filterId","f","TagWidgetItem","colorClass","selectedItems","TagItem","tag","tagClass","TagFilter","selections","unappliedOptions","opt","onClickOption","option","nextFilterState","indexOfItem","i","toString","newItems","slice","length","concat","collection","isFetching","DynamicWidget","childComponent","staticChildren","Array","fill","component","PartialTagItem","position","partialLoadingComponent","ResetButton","params","currentQueryParam","query","alignLeft","SearchFilters","queryParams","hideHeading","isFetchingOptions","constantIndices","mainFilters","dispatch","ObjectHelper","payload","analyticsOptions","indices","ArrayHelper","mainFiltersWithoutTags","tagFilter","value","hideDivider","hideResetButton","alignResetButtonLeft","classNames","getPhrase","toLowerCase","tagType","hasThemeColour","themeColours","secondary","getTagTypeClass","onRemove","style","backgroundColor","title","role","LanguageService","SeeMore","AppLink","analyticsData","descriptor","WidgetHeader","hasDescription","description","showSeeMoreLink","SLIDER_ANIMATION_TIME","useWidgetKeyboard","containerRef","mediaQuery","isTabbing","setIsTabbing","dynamicAttributes","setDynamicAttributes","focusedWidgetIndex","setFocusedWidgetIndex","current","containerLeftPosition","setTimeout","dynamicWidgetState","focusableItems","from","children","item","rect","getBoundingClientRect","isItemVisable","left","containerRightPosition","right","offset","onFocusWidget","index","document","querySelector","onBlurWidget","getFixedAttributes","fixedWidgetState","viewableItems","focusNext","items","querySelectorAll","nextFocusableElement","focus","focusPrev","prevFocusableElement","blankImage","Image","src","DragHelper","event","dataTransfer","setDragImage","isTouchScreen","UserAgentHelper","SlidingListContainer","ref","listenerProps","xPosition","measurement","dragPercentage","positionType","onDrag","onDragEnd","onTouchMove","onTouchEnd","percentageDragged","CssMeasurement","C","transform","transition","draggable","onDragStart","onDragOver","onTouchMoveCapture","onTouchEndCapture","TagType","TagTypeNumber","WidgetInteraction","defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
1
  "use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[3640],{5859:(e,a,i)=>{function t(e,a){(null==a||a>e.length)&&(a=e.length);for(var i=0,t=Array(a);i<a;i++)t[i]=e[i];return t}i.d(a,{u:()=>r});var n={numItems:5,minWidth:50,maxWidth:100},r={getPartialLoadingItems:function(){var e,a=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=Object.assign(Object.assign({},n),a);return(e=Array(i.numItems),function(e){if(Array.isArray(e))return t(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,a){if(e){if("string"==typeof e)return t(e,a);var i={}.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?t(e,a):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map((function(){return{width:"".concat(Math.max(Math.floor(Math.random()*i.maxWidth),i.minWidth),"px")}}))}}},70067:(e,a,i)=>{i.r(a),i.d(a,{PlaySharedClipViewV2:()=>x});var t=i(32735),n=i(20354),r=i(65858),c=i(16714),s=i(43012),o=i(39151),d=i(1666),l=i(20768),u=i(31949),p=i(1575),m=i(26304),v=i(22902),g=i(15311),I=i(79612),h=i(76753),y=i(51855),f=i(7179),A=i(49948),P=i(36873),C=i(27638),E=i(44110),b=i(35014),V=i(97816),O=i(81812),F=i(14085);function x(e){var a,i,x,L,S,G,k=(0,g.r)().hasProduct,R=(0,C.u)(r.LZ.VideoThumbnail),T=R.setFavourite,w=R.canFavourite,q=(0,v.T)().hasPermissions,N=(0,y.G)().isPlugin,U=(0,O.a)(),M=(0,b.I)(),j=n.a.useBasicFetch(u.N.currentUser()),_=n.a.useBasicFetch(o.L.config()),W=n.a.useBasicFetch(s.e.sharedClip(e.objectId,e.shareId)),B=n.a.useBasicFetch(!!(null===(a=W.data)||void 0===a?void 0:a._parentVideo)&&p.R.video(W.data._parentVideo.id)),D=n.a.useBasicFetch(!!(null===(x=null===(i=W.data)||void 0===i?void 0:i._parentVideo)||void 0===x?void 0:x.id)&&M.canViewClips&&s.e.videoClips(W.data._parentVideo.id)),H=n.a.useBasicFetch(M.canViewInteractives&&l.b.videoInteractives(e.objectId)),K=(0,P.k)({video:B.data,context:e.queryParams.context,contextId:e.queryParams.contextId,moviesAndTv:e.queryParams.mtv,currentUser:j.data}),Q=(0,E.i)(),Y=n.a.useBasicFetch((null===(L=j.data)||void 0===L?void 0:L.isAuthenticated)&&d.h.yearGroups(j.data.customerId)),Z=(0,A.l)(e.objectId);return(0,I.M)(h.CG.getClipMetadata({content:W.data})),(0,V.V)(null!==(S=K.videos)&&void 0!==S?S:[]),(0,m.b)(W),(0,f.P)({id:e.objectId,app:"clips",shareId:e.shareId}),W.data&&j.hasCompleted&&_.hasCompleted&&Z.hasCompleted?t.createElement(F.S,{shareId:e.shareId,clip:W.data,clips:D.data,interactives:H.data,originalVideo:B.data,currentUser:j.data,yearGroups:Y.data,relatedVideos:K,canFavourite:w,setFavourite:T,hasProduct:k,queryParams:e.queryParams,audiences:Q.data,imageCdnUrl:_.data.imageCdnUrl,canManageVideoAccess:q(c.C.ManageVideoAccess),pointsOfInterest:null==Z?void 0:Z.items,featureAccess:M,tableOfContentsId:null===(G=e.queryParams)||void 0===G?void 0:G.tocId,shouldShowSideTableOfContents:U,isPlugin:N}):t.createElement(t.Fragment,null)}},44110:(e,a,i)=>{i.d(a,{i:()=>c});var t=i(20354),n=i(89454),r=i(86698),c=function(){var e=(0,r.y)({redirectOnError:!0}),a=e.activePresentation,i=e.getFallbackPresentation,c=a||i();return t.a.useBasicFetch(!!c&&n.O.presentationAudiences(c.id))}},14085:(e,a,i)=>{i.d(a,{S:()=>H});var t=i(32735),n=i(28400),r=i(49935),c=i(5640),s=i(12059),o=i(51184),d=i(64921),l=i(95812),u=i(53709),p=i(71063),m=i(10439),v=i(35429),g=i(4594),I=i(16714),h=i(12754),y=i(22902),f=i(65332),A=i(76196),P=i(59598),C=i(31908),E=i(26492),b=i(9465),V=i(91479),O=i(47938),F=i(81024),x=i(78166),L=i(99742),S=i(14070),G=i(97291),k=i(22490),R=i(63010),T=i(14476),w=i(53256),q=i(83345),N=i(13231),U=i(51365),M=i(10671),j=i(10741),_="shared.playClipV2";function W(e){var a=(0,y.T)().hasPermissions,i=(0,M._)({location:M.i.VideoItem});return t.createElement("section",{className:"play-page-section",id:P.K.ClippedFrom,ref:function(a){var i;a&&(null===(i=e.headingRef)||void 0===i?void 0:i.current)&&e.headingRef.current.set(P.K.ClippedFrom,a)}},t.createElement("h2",{className:"h4 mb-0"},t.createElement(q.x,{namespace:_,phrase:"clippedFrom"})),t.createElement(U.M.Provider,{value:i},t.createElement(N.E4,{videos:[e.originalVideo],yearGroups:e.yearGroups,setFavourite:e.setFavourite,canFavourite:e.canFavourite,getVideoAppLink:function(a,i){return k.W.getAppLink(a,Object.assign(Object.assign({},i),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},hasPermissions:a,presentationAudiences:e.audiences,getPreviewQuestionsAppLink:function(e){return j.j.getPreviewQuestionsAppLink(e)},isPlugin:e.isPlugin,getClassroomGuideAppLink:e.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:e.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:e.getResourceGuidanceAppLink})))}const B={main:"iQ0Ie",expandedToc:"sIoV8"};var D=function(e,a,i){return function(t){return i?{application:G.O.VIDEOS,action:S.e.Videos.PREVIEW_PDF,args:[t.id],params:{videoId:e,shareId:a}}:{application:G.O.SIGN_UP,action:S.e.SignUp.SIGN_UP}}};function H(e){var a,i,q,N,U,M,j,_,H,K,Q=(0,v.g)(),Y=(0,y.T)().hasPermissions,Z=C.M.getCanBeConsumed(e.clip).canConsume,J=(0,R.Q)(e.tableOfContentsId),$=J.tableOfContentsActiveId,z=J.setTableOfContentsActiveId,X=J.controlledId,ee=J.setControlledId,ae=J.tableOfContentsExpanded,ie=J.onToggleTableOfContents,te=(0,o.Wp)(e.clip)&&e.featureAccess.canViewGlance,ne=(0,T.i)(te),re=ne.headingRef,ce=ne.headingElements,se=ce.map((function(a){var i;return{id:a.id,name:w.d.getSectionHeading(a.id,{clips:e.clips,interactives:e.interactives,resources:null===(i=e.clip.resources)||void 0===i?void 0:i.data,isPlayClipPage:!0})}}));(0,f.D)({setActiveId:z,headingElements:ce,controlledId:X,setControlledId:ee}),(0,A.P)(ce,e.tableOfContentsId);var oe=C.M.isVideoTypeArchived(e.clip),de=Y(I.C.StudentExperience),le=t.useRef(!1);function ue(){var e,a,i,t;le.current=!(null===(a=null===(e=null==Q?void 0:Q.playerRef)||void 0===e?void 0:e.current)||void 0===a?void 0:a.isPaused()),null===(t=null===(i=null==Q?void 0:Q.playerRef)||void 0===i?void 0:i.current)||void 0===t||t.pause()}function pe(){var e,a;le.current&&(null===(a=null===(e=null==Q?void 0:Q.playerRef)||void 0===e?void 0:e.current)||void 0===a||a.play())}function me(){var a,i;return!(!e.originalVideo||!(null===(a=e.clip._canBeConsumed)||void 0===a?void 0:a.value)||!(null===(i=e.currentUser)||void 0===i?void 0:i.isAuthenticated)||!e.hasProduct(h.x.Primary)||de)}var ve="picture-in-picture"===Q.mode||e.featureAccess.canViewPublicLayout,ge=null!==(i=null===(a=e.clips)||void 0===a?void 0:a.filter((function(a){return a.id.toString()!==e.clip.id.toString()})))&&void 0!==i?i:[];return t.createElement("div",{className:"px-4 play-page-sections-container"},t.createElement("main",{className:"".concat(B.main," ").concat(e.shouldShowSideTableOfContents&&ae?B.expandedToc:e.shouldShowSideTableOfContents&&!ae?"pe-4":void 0)},!!(null===(q=e.breadcrumbs)||void 0===q?void 0:q.length)&&t.createElement("div",{className:"mb-2"},t.createElement(r.Oo,{breadcrumbs:e.breadcrumbs})),t.createElement(O.W,{restrictions:e.clip._restrictions,yearGroups:e.yearGroups,objectId:e.clip.id,objectTypeId:g.E.Clip,canManageVideoAccess:e.canManageVideoAccess}),oe&&t.createElement(E.T,{typeId:e.clip.typeId,hasStudentExperience:de}),t.createElement("section",{id:P.K.Video,className:"mb-2 ".concat(p.M.GLOBAL_PLAYER_SELECTOR),ref:function(e){e&&(null==re?void 0:re.current)&&re.current.set(P.K.Video,e)}},Z&&t.createElement(m.r,{key:e.clip.id,objectId:e.clip.id,objectTypeId:e.clip.typeId,shareId:e.shareId,context:null===(N=e.queryParams)||void 0===N?void 0:N.context,contextId:null===(U=e.queryParams)||void 0===U?void 0:U.contextId,moviesAndTv:null===(M=e.queryParams)||void 0===M?void 0:M.mtv,playNext:null===(j=e.queryParams)||void 0===j?void 0:j.playNext,startTime:null!==(H=null===(_=e.queryParams)||void 0===_?void 0:_.t)&&void 0!==H?H:null===(K=e.queryParams)||void 0===K?void 0:K.startTime,mode:"default",location:"play-page"}),t.createElement("div",{className:ve?"":"d-none"},t.createElement(F.S,{video:e.clip,type:"pip"}))),t.createElement(V.v,{media:e.clip,yearGroups:e.yearGroups,audiences:e.audiences,originalVideoAppLink:me()?{application:G.O.VIDEOS,action:S.e.Videos.PLAY_VIDEO,args:[e.originalVideo.id,n.m.slugify(e.originalVideo.name)]}:null,featureAccess:e.featureAccess,shareId:e.shareId}),te?t.createElement(d.j,{video:e.clip,pointsOfInterest:e.pointsOfInterest,setStartTime:function(e){var a;return null===(a=Q.playerRef.current)||void 0===a?void 0:a.currentTime(e)},getTagAppLink:function(e){return{application:G.O.SEARCH,action:S.e.Search.HOME,params:{tagOrClassification:e.name}}},suppressInteractivity:e.featureAccess.canViewPublicLayout,canViewGlance:te}):t.createElement(s.a,{video:e.clip,onLaunchImmersiveReader:ue,onExitImmersiveReader:pe,getTagAppLink:function(e){return{application:G.O.SEARCH,action:S.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:re,suppressInteractivity:e.featureAccess.canViewPublicLayout}),t.createElement(u.M,{video:e.clip,canViewResources:e.featureAccess.canViewResourceItems,imageCdnUrl:e.imageCdnUrl,getAppLink:D(e.clip.id,e.shareId,e.featureAccess.canViewResourceItems),analyticsData:{clipId:e.clip.id,clipName:e.clip.name},resourceThumbnailFallbackUrl:L.W.Fallbacks.RESOURCE_THUMBNAIL,headingRef:re}),t.createElement(l.J,{video:e.clip,interactives:e.interactives,imageCdnUrl:e.imageCdnUrl,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},canViewInteractives:e.featureAccess.canViewInteractives,headingRef:re,yearGroups:e.yearGroups,setFavourite:e.setFavourite,canFavourite:e.canFavourite,isPlugin:e.isPlugin}),t.createElement(c.O,{clips:ge||[],video:e.clip,canViewClips:e.featureAccess.canViewClips,yearGroups:e.yearGroups,audiences:e.audiences,imageCdnUrl:e.imageCdnUrl,setFavourite:e.setFavourite,canFavourite:e.canFavourite,headingRef:re,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},isPlugin:e.isPlugin}),te&&t.createElement(s.a,{video:e.clip,onLaunchImmersiveReader:ue,onExitImmersiveReader:pe,getTagAppLink:function(e){return{application:G.O.SEARCH,action:S.e.Search.HOME,params:{tagOrClassification:e.name}}},headingRef:re,suppressInteractivity:e.featureAccess.canViewPublicLayout}),!!me()&&t.createElement(W,{originalVideo:e.originalVideo,setFavourite:e.setFavourite,canFavourite:e.canFavourite,yearGroups:e.yearGroups,shareId:e.shareId,queryParams:e.queryParams,audiences:e.audiences,headingRef:re,isPlugin:e.isPlugin,getClassroomGuideAppLink:k.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:k.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:k.W.getResourceGuidanceAppLink}),t.createElement(x.Z,{currentVideo:e.clip,yearGroups:e.yearGroups,relatedVideos:e.relatedVideos,setFavourite:e.setFavourite,canFavourite:e.canFavourite,currentUser:e.currentUser,audiences:e.audiences,getVideoAppLink:function(a,i){return k.W.getAppLink(a,Object.assign(Object.assign({},i),{context:e.queryParams.context,contextId:e.queryParams.contextId,playNext:e.queryParams.playNext,shareId:e.shareId,moviesAndTv:e.queryParams.mtv}))},moviesAndTv:e.queryParams.mtv,isPlugin:e.isPlugin})),t.createElement(b.h,{isExpanded:ae,setIsExpanded:ie,items:se,activeId:$,setControlledId:ee,analyticsData:{clipId:e.clip.id,clipName:e.clip.name},showInSide:e.shouldShowSideTableOfContents}))}}}]);
2
- //# sourceMappingURL=3640-5b0a186dfd-lite.chunk.js.map
2
+ //# sourceMappingURL=3640-ac303efb99-lite.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"scripts/3640-5b0a186dfd-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/share/views/play-shared-clip/v2/PlaySharedClipViewV2.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/clipped-from/ClippedFrom.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/play-clip-v2.scss","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/PlayClipV2.tsx"],"sourcesContent":["const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, InteractiveMetadata, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\nimport { PlayClipV2 } from 'shared/views/play-clip/v2/components/play-clip/PlayClipV2';\n\nimport { ShareLinkViewProps } from 'apps/share/interfaces/ShareLinkViewProps';\n\nexport function PlaySharedClipViewV2(props: ShareLinkViewProps): React.ReactElement {\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasPermissions } = usePermissions();\n const { isPlugin } = usePluginHelper();\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const featureAccess = useVideoFeatureAccess();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.sharedClip(props.objectId, props.shareId));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id));\n const childClips = Flight.useBasicFetch<Clip[]>(\n !!clip.data?._parentVideo?.id && featureAccess.canViewClips && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n const interactives = Flight.useBasicFetch<InteractiveMetadata[]>(\n featureAccess.canViewInteractives && InteractiveRequests.videoInteractives(props.objectId)\n );\n \n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.objectId);\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(clip);\n useDeepLinks({ id: props.objectId, app: 'clips', shareId: props.shareId });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClipV2\n shareId={props.shareId}\n clip={clip.data}\n clips={childClips.data}\n interactives={interactives.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n relatedVideos={relatedVideos}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest?.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n isPlugin={isPlugin}\n />\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'shared.playClipV2';\n\ninterface ClippedFromProps {\n originalVideo: VideoTypes;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n shareId?: string;\n headingRef: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n}\n\nexport function ClippedFrom(props: ClippedFromProps) {\n const { hasPermissions } = usePermissions();\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.ClippedFrom}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.ClippedFrom, el);\n }}\n >\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n />\n </VideoActionsContext.Provider>\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"main\":\"iQ0Ie\",\"expandedToc\":\"sIoV8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PlayPageClips } from 'libs/shared/components/play-page-v2/clips-widget/PlayPageClips';\nimport { VideoDetailsWithScrollbarV2 } from 'libs/shared/components/play-page-v2/details/VideoDetailsV2';\nimport { hasGlanceData } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceUtilsV2';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceV2';\nimport { PlayPageInteractives } from 'libs/shared/components/play-page-v2/interactives-widget/PlayPageInteractives';\nimport { PlayPageResources } from 'libs/shared/components/play-page-v2/resources-widget/PlayPageResources';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { TableOfContentsContainer } from 'shared/components/play-page/components/table-of-contents/TableOfContents';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { usePlayPageTableOfContent } from 'shared/views/play/v2/hooks/usePlayPageTableOfContent';\nimport { useSectionHeadings } from 'shared/views/play/v2/hooks/useSectionHeadings';\nimport { PlayPageUtils } from 'shared/views/play/v2/PlayPageUtilV2';\nimport { ClippedFrom } from 'shared/views/play-clip/v2/components/clipped-from/ClippedFrom';\n\nimport styles from './play-clip-v2.scss';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n\ninterface PlayClipV2Props {\n clip: Clip;\n clips: Clip[];\n interactives: InteractiveMetadata[];\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n tableOfContentsId: string;\n shouldShowSideTableOfContents: boolean;\n isPlugin: boolean;\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PlayClipV2(props: PlayClipV2Props): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const {\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n onToggleTableOfContents\n } = usePlayPageTableOfContent(props.tableOfContentsId);\n\n const hasGlance = hasGlanceData(props.clip) && props.featureAccess.canViewGlance;\n\n const { headingRef, headingElements } = useSectionHeadings(hasGlance);\n const items = headingElements.map(ele => {\n return {\n id: ele.id as PlayPageAnchor,\n name: PlayPageUtils.getSectionHeading(\n ele.id as PlayPageAnchor,\n {\n clips: props.clips,\n interactives: props.interactives,\n resources: props.clip.resources?.data,\n isPlayClipPage: true\n }\n )\n };\n });\n\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentsActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n useTableOfContentsScroll(headingElements, props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function canAccessOriginal(): boolean {\n if (!props.originalVideo || !props.clip._canBeConsumed?.value)\n return false;\n\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n if (!props.hasProduct(ProductId.Primary))\n return false;\n\n if (hasStudentExperience)\n return false;\n\n return true;\n }\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal())\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n function getMainClassName() {\n if (props.shouldShowSideTableOfContents && tableOfContentsExpanded) {\n return styles.expandedToc;\n }\n if (props.shouldShowSideTableOfContents && !tableOfContentsExpanded)\n return 'pe-4';\n }\n\n return (\n <div className='px-4 play-page-sections-container'>\n <main className={`${styles.main} ${getMainClassName()}`}>\n {!!props.breadcrumbs?.length &&\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n\n\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section\n id={PlayPageAnchor.Video}\n className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}\n ref={el => { (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.Video, el); }}\n >\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n )}\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* if no glance render video details here */}\n {hasGlance ? (\n <VideoAtAGlanceV2\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n canViewGlance={hasGlance}\n />\n ) : (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n\n <PlayPageResources\n video={props.clip}\n canViewResources={props.featureAccess.canViewResourceItems}\n imageCdnUrl={props.imageCdnUrl}\n getAppLink={\n getResourceAppLink(props.clip.id, props.shareId, props.featureAccess.canViewResourceItems)\n }\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n headingRef={headingRef}\n />\n\n <PlayPageInteractives\n video={props.clip}\n interactives={props.interactives}\n imageCdnUrl={props.imageCdnUrl}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n headingRef={headingRef}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n isPlugin={props.isPlugin}\n />\n\n <PlayPageClips\n clips={otherClips || []}\n video={props.clip}\n canViewClips={props.featureAccess.canViewClips}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n imageCdnUrl={props.imageCdnUrl}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n headingRef={headingRef}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n isPlugin={props.isPlugin}\n />\n\n {/* if has glance, render video details here */}\n {hasGlance && (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n \n {!!canAccessOriginal() && (\n <ClippedFrom\n originalVideo={props.originalVideo}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n yearGroups={props.yearGroups}\n shareId={props.shareId}\n queryParams={props.queryParams}\n audiences={props.audiences}\n headingRef={headingRef}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n )}\n\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n\n </main>\n\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n />\n \n </div>\n );\n}"],"names":["DEFAULT_PARTIAL_LOADING_OPTIONS","numItems","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","map","width","Math","max","floor","random","PlaySharedClipViewV2","props","hasProduct","u","setFavourite","canFavourite","hasPermissions","isPlugin","shouldShowSideTableOfContents","featureAccess","currentUser","config","clip","objectId","shareId","video","data","_parentVideo","id","childClips","canViewClips","interactives","canViewInteractives","relatedVideos","context","queryParams","contextId","moviesAndTv","mtv","audiences","yearGroups","isAuthenticated","customerId","pointsOfInterest","content","videos","app","hasCompleted","clips","originalVideo","imageCdnUrl","canManageVideoAccess","items","tableOfContentsId","tocId","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","namespace","ClippedFrom","usePermissions","videoActions","useVideoActions","location","className","PlayPageAnchor","ref","el","headingRef","current","set","Text","phrase","VideoActionsContext","value","VideoList","getVideoAppLink","v","VideoAppLinkHelper","playNext","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getResourceAppLink","videoId","canViewResource","resource","application","action","args","params","PlayClipV2","playerContext","canConsume","VideoHelper","usePlayPageTableOfContent","tableOfContentsActiveId","setTableOfContentsActiveId","controlledId","setControlledId","tableOfContentsExpanded","onToggleTableOfContents","hasGlance","canViewGlance","useSectionHeadings","headingElements","ele","name","resources","isPlayClipPage","useTableOfContentsActiveHeading","setActiveId","useTableOfContentsScroll","isArchived","hasStudentExperience","PermissionName","shouldPlayOnExitImmersiveReader","onLaunchImmersiveReader","playerRef","isPaused","pause","onExitImmersiveReader","play","canAccessOriginal","_canBeConsumed","ProductId","showPlayerPlaceholder","mode","canViewPublicLayout","otherClips","filter","c","toString","breadcrumbs","length","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectTypeId","MasterType","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","key","startTime","t","PlayerPlaceholder","type","PlayPageTitleAndActions","media","originalVideoAppLink","TextHelper","VideoAtAGlanceV2","setStartTime","time","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","PlayPageResources","canViewResources","canViewResourceItems","getAppLink","analyticsData","clipId","clipName","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","PlayPageClips","RelatedVideos","currentVideo","TableOfContents","isExpanded","setIsExpanded","activeId","showInSide"],"sourceRoot":""}
1
+ {"version":3,"file":"scripts/3640-ac303efb99-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/share/views/play-shared-clip/v2/PlaySharedClipViewV2.tsx","file:///app/packages/projects/lite/src/shared/hooks/usePresentationAudiences.ts","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/clipped-from/ClippedFrom.tsx","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/play-clip-v2.scss","file:///app/packages/projects/lite/src/shared/views/play-clip/v2/components/play-clip/PlayClipV2.tsx"],"sourcesContent":["const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { CustomerRequests } from 'libs/shared/flight-requests/CustomerRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useCannotConsumeError } from 'libs/shared/hooks/useCannotConsumeError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Clip, Config, CurrentUser, InteractiveMetadata, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { useDeepLinks } from 'shared/hooks/useDeepLinks';\nimport { useFetchPointsOfInterest } from 'shared/hooks/useFetchPointsOfInterest';\nimport { useGetRelatedVideos } from 'shared/hooks/useGetRelatedVideos';\nimport { useLiteFavourites } from 'shared/hooks/useLiteFavourites';\nimport { usePresentationAudiences } from 'shared/hooks/usePresentationAudiences';\nimport { useVideoFeatureAccess } from 'shared/hooks/useVideoFeatureAccess';\nimport { useVideoMixin } from 'shared/hooks/useVideoMixin';\nimport { useShouldShowSideTableOfContents } from 'shared/views/play/v2/hooks/useShouldShowTableOfContents';\nimport { PlayClipV2 } from 'shared/views/play-clip/v2/components/play-clip/PlayClipV2';\n\nimport { ShareLinkViewProps } from 'apps/share/interfaces/ShareLinkViewProps';\n\nexport function PlaySharedClipViewV2(props: ShareLinkViewProps): React.ReactElement {\n const { hasProduct } = useProducts();\n const { setFavourite, canFavourite } = useLiteFavourites(LocationContext.VideoThumbnail);\n const { hasPermissions } = usePermissions();\n const { isPlugin } = usePluginHelper();\n\n const shouldShowSideTableOfContents = useShouldShowSideTableOfContents();\n\n const featureAccess = useVideoFeatureAccess();\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.sharedClip(props.objectId, props.shareId));\n const video = Flight.useBasicFetch<Video>(!!clip.data?._parentVideo &&\n VideoRequests.video(clip.data._parentVideo.id));\n const childClips = Flight.useBasicFetch<Clip[]>(\n !!clip.data?._parentVideo?.id && featureAccess.canViewClips && ClipRequests.videoClips(clip.data._parentVideo.id)\n );\n const interactives = Flight.useBasicFetch<InteractiveMetadata[]>(\n featureAccess.canViewInteractives && InteractiveRequests.videoInteractives(props.objectId)\n );\n \n const relatedVideos = useGetRelatedVideos({\n video: video.data,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n moviesAndTv: props.queryParams.mtv,\n currentUser: currentUser.data\n });\n const audiences = usePresentationAudiences();\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(\n currentUser.data?.isAuthenticated && CustomerRequests.yearGroups(currentUser.data.customerId)\n );\n const pointsOfInterest = useFetchPointsOfInterest(props.objectId);\n\n useSetPageMetadata(PageMetadataHelper.getClipMetadata({ content: clip.data }));\n\n useVideoMixin(relatedVideos.videos ?? []);\n useCannotConsumeError(clip);\n useDeepLinks({ id: props.objectId, app: 'clips', shareId: props.shareId });\n\n const hasLoaded = (\n clip.data &&\n currentUser.hasCompleted &&\n config.hasCompleted &&\n pointsOfInterest.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <PlayClipV2\n shareId={props.shareId}\n clip={clip.data}\n clips={childClips.data}\n interactives={interactives.data}\n originalVideo={video.data}\n currentUser={currentUser.data}\n yearGroups={yearGroups.data}\n relatedVideos={relatedVideos}\n canFavourite={canFavourite}\n setFavourite={setFavourite}\n hasProduct={hasProduct}\n queryParams={props.queryParams}\n audiences={audiences.data}\n imageCdnUrl={config.data.imageCdnUrl}\n canManageVideoAccess={hasPermissions(PermissionName.ManageVideoAccess)}\n pointsOfInterest={pointsOfInterest?.items}\n featureAccess={featureAccess}\n tableOfContentsId={props.queryParams?.tocId}\n shouldShowSideTableOfContents={shouldShowSideTableOfContents}\n isPlugin={isPlugin}\n />\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { PresentationAudience } from 'libs/shared/interfaces';\n\nimport { usePresentation } from 'shared/hooks/usePresentation';\n\nexport const usePresentationAudiences = () => {\n const { activePresentation, getFallbackPresentation } = usePresentation({ redirectOnError: true });\n\n const presentation = activePresentation || getFallbackPresentation();\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n !!presentation &&\n AudienceRequests.presentationAudiences(presentation.id)\n );\n\n return audiences;\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext } from 'libs/shared/context/VideoActionsContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { CanFavouriteFunc, FavouriteFunc, PresentationAudience, VideoTypes, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\n\nimport { useVideoActions, VideoActionsLocation } from 'shared/hooks/use-video-actions/useVideoActions';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nconst namespace = 'shared.playClipV2';\n\ninterface ClippedFromProps {\n originalVideo: VideoTypes;\n yearGroups: YearGroup[];\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n audiences: PresentationAudience[];\n shareId?: string;\n headingRef: React.MutableRefObject<Map<PlayPageAnchor, HTMLElement>>;\n isPlugin: boolean;\n getInteractiveGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getResourceGuidanceAppLink: (id: string, type: MasterType) => Core.AppLink;\n getClassroomGuideAppLink: (id: string, type: MasterType) => Core.AppLink;\n}\n\nexport function ClippedFrom(props: ClippedFromProps) {\n const { hasPermissions } = usePermissions();\n const videoActions = useVideoActions({ location: VideoActionsLocation.VideoItem });\n\n return (\n <section\n className='play-page-section'\n id={PlayPageAnchor.ClippedFrom}\n ref={el => {\n (el && props.headingRef?.current) && props.headingRef.current.set(PlayPageAnchor.ClippedFrom, el);\n }}\n >\n <h2 className='h4 mb-0'><Text namespace={namespace} phrase='clippedFrom' /></h2>\n <VideoActionsContext.Provider value={videoActions}>\n <VideoList\n videos={[props.originalVideo]}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n hasPermissions={hasPermissions}\n presentationAudiences={props.audiences}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={props.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={props.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={props.getResourceGuidanceAppLink}\n />\n </VideoActionsContext.Provider>\n </section>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"main\":\"iQ0Ie\",\"expandedToc\":\"sIoV8\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PlayPageClips } from 'libs/shared/components/play-page-v2/clips-widget/PlayPageClips';\nimport { VideoDetailsWithScrollbarV2 } from 'libs/shared/components/play-page-v2/details/VideoDetailsV2';\nimport { hasGlanceData } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceUtilsV2';\nimport { VideoAtAGlanceV2 } from 'libs/shared/components/play-page-v2/glance/VideoAtAGlanceV2';\nimport { PlayPageInteractives } from 'libs/shared/components/play-page-v2/interactives-widget/PlayPageInteractives';\nimport { PlayPageResources } from 'libs/shared/components/play-page-v2/resources-widget/PlayPageResources';\nimport { SeoConstants } from 'libs/shared/constants/SeoConstants';\nimport { GlobalPlayerConsumer } from 'libs/shared/context/player-context/components/GlobalPlayerConsumer';\nimport { usePlayerContext } from 'libs/shared/context/player-context/PlayerContext';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { HasProductFunc } from 'libs/shared/hooks/UseProducts';\nimport { useTableOfContentsActiveHeading } from 'libs/shared/hooks/useTableOfContentsActiveHeading';\nimport { useTableOfContentsScroll } from 'libs/shared/hooks/useTableOfContentsScroll';\nimport { CanFavouriteFunc, Clip, CurrentUser, FavouriteFunc, InteractiveMetadata, Link, PointOfInterest, PresentationAudience, Resource, Video, YearGroup } from 'libs/shared/interfaces';\nimport { PlayPageAnchor } from 'libs/shared/interfaces/PlayPageAnchor';\nimport { PlayViewQueryParams } from 'libs/shared/interfaces/query-params/PlayViewQueryParams';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ArchivedBanner } from 'shared/components/play-page/ArchivedBanner';\nimport { TableOfContentsContainer } from 'shared/components/play-page/components/table-of-contents/TableOfContents';\nimport { PlayPageTitleAndActions } from 'shared/components/play-page/components/title-and-actions/PlayPageTitleAndActions';\nimport { RestrictionBanner } from 'shared/components/play-page/RestrictionBanner';\nimport { PlayerPlaceholder } from 'shared/components/player-placeholder/PlayerPlaceholder';\nimport { RelatedVideos } from 'shared/components/related-videos/RelatedVideos';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { RelatedVideosHash } from 'shared/hooks/useGetRelatedVideos';\nimport { VideoFeaturesHash } from 'shared/hooks/useVideoFeatureAccess';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\nimport { usePlayPageTableOfContent } from 'shared/views/play/v2/hooks/usePlayPageTableOfContent';\nimport { useSectionHeadings } from 'shared/views/play/v2/hooks/useSectionHeadings';\nimport { PlayPageUtils } from 'shared/views/play/v2/PlayPageUtilV2';\nimport { ClippedFrom } from 'shared/views/play-clip/v2/components/clipped-from/ClippedFrom';\n\nimport styles from './play-clip-v2.scss';\n\nconst getResourceAppLink = (videoId: string, shareId: string, canViewResource: boolean) =>\n (resource: Resource | Link) => {\n if (!canViewResource) {\n return {\n application: AppChannels.SIGN_UP,\n action: Actions.SignUp.SIGN_UP\n };\n }\n\n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PREVIEW_PDF,\n args: [resource.id],\n params: {\n videoId: videoId,\n shareId: shareId\n }\n };\n };\n\n\ninterface PlayClipV2Props {\n clip: Clip;\n clips: Clip[];\n interactives: InteractiveMetadata[];\n originalVideo: Video;\n currentUser: CurrentUser;\n yearGroups: YearGroup[];\n relatedVideos: RelatedVideosHash;\n setFavourite: FavouriteFunc;\n canFavourite: CanFavouriteFunc;\n queryParams: PlayViewQueryParams;\n hasProduct: HasProductFunc;\n audiences: PresentationAudience[];\n imageCdnUrl: string;\n shareId?: string;\n canManageVideoAccess: boolean;\n pointsOfInterest?: PointOfInterest[];\n featureAccess: VideoFeaturesHash;\n tableOfContentsId: string;\n shouldShowSideTableOfContents: boolean;\n isPlugin: boolean;\n breadcrumbs?: Breadcrumb[];\n}\n\nexport function PlayClipV2(props: PlayClipV2Props): JSX.Element {\n const playerContext = usePlayerContext();\n\n const { hasPermissions } = usePermissions();\n const { canConsume } = VideoHelper.getCanBeConsumed(props.clip);\n \n const {\n tableOfContentsActiveId,\n setTableOfContentsActiveId,\n controlledId,\n setControlledId,\n tableOfContentsExpanded,\n onToggleTableOfContents\n } = usePlayPageTableOfContent(props.tableOfContentsId);\n\n const hasGlance = hasGlanceData(props.clip) && props.featureAccess.canViewGlance;\n\n const { headingRef, headingElements } = useSectionHeadings(hasGlance);\n const items = headingElements.map(ele => {\n return {\n id: ele.id as PlayPageAnchor,\n name: PlayPageUtils.getSectionHeading(\n ele.id as PlayPageAnchor,\n {\n clips: props.clips,\n interactives: props.interactives,\n resources: props.clip.resources?.data,\n isPlayClipPage: true\n }\n )\n };\n });\n\n useTableOfContentsActiveHeading({\n setActiveId: setTableOfContentsActiveId,\n headingElements,\n controlledId,\n setControlledId\n });\n\n useTableOfContentsScroll(headingElements, props.tableOfContentsId);\n\n const isArchived = VideoHelper.isVideoTypeArchived(props.clip);\n const hasStudentExperience = hasPermissions(PermissionName.StudentExperience);\n /**\n * Need to use a ref because if we use state, onExitImmersiveReader will have a stale\n * reference of the state. This is because the state is changed in onLaunchImmersiveReader\n * which is passed in at the same time as onExitImmersiveReader\n */\n const shouldPlayOnExitImmersiveReader = React.useRef(false);\n\n function onLaunchImmersiveReader(): void {\n shouldPlayOnExitImmersiveReader.current = !playerContext?.playerRef?.current?.isPaused();\n playerContext?.playerRef?.current?.pause();\n }\n\n function onExitImmersiveReader(): void {\n if (!shouldPlayOnExitImmersiveReader.current)\n return;\n\n playerContext?.playerRef?.current?.play();\n }\n\n function canAccessOriginal(): boolean {\n if (!props.originalVideo || !props.clip._canBeConsumed?.value)\n return false;\n\n if (!props.currentUser?.isAuthenticated)\n return false;\n\n if (!props.hasProduct(ProductId.Primary))\n return false;\n\n if (hasStudentExperience)\n return false;\n\n return true;\n }\n\n function getOriginalVideoAppLink(): Core.AppLink {\n if (!canAccessOriginal())\n return null;\n \n return {\n application: AppChannels.VIDEOS,\n action: Actions.Videos.PLAY_VIDEO,\n args: [ props.originalVideo.id, TextHelper.slugify(props.originalVideo.name) ]\n };\n }\n\n const showPlayerPlaceholder = playerContext.mode === 'picture-in-picture' || props.featureAccess.canViewPublicLayout;\n\n const otherClips = props.clips?.filter(c => c.id.toString() !== props.clip.id.toString()) ?? [];\n\n function getMainClassName() {\n if (props.shouldShowSideTableOfContents && tableOfContentsExpanded) {\n return styles.expandedToc;\n }\n if (props.shouldShowSideTableOfContents && !tableOfContentsExpanded)\n return 'pe-4';\n }\n\n return (\n <div className='px-4 play-page-sections-container'>\n <main className={`${styles.main} ${getMainClassName()}`}>\n {!!props.breadcrumbs?.length &&\n <div className='mb-2'>\n <Breadcrumbs breadcrumbs={props.breadcrumbs} />\n </div>\n }\n\n\n <RestrictionBanner\n restrictions={props.clip._restrictions}\n yearGroups={props.yearGroups}\n objectId={props.clip.id}\n objectTypeId={MasterType.Clip}\n canManageVideoAccess={props.canManageVideoAccess}\n />\n\n {isArchived && (\n <ArchivedBanner\n typeId={props.clip.typeId}\n hasStudentExperience={hasStudentExperience}\n />\n )}\n\n <section\n id={PlayPageAnchor.Video}\n className={`mb-2 ${SeoConstants.GLOBAL_PLAYER_SELECTOR}`}\n ref={el => { (el && headingRef?.current) && headingRef.current.set(PlayPageAnchor.Video, el); }}\n >\n {canConsume && (\n <GlobalPlayerConsumer\n key={props.clip.id}\n objectId={props.clip.id}\n objectTypeId={props.clip.typeId}\n shareId={props.shareId}\n context={props.queryParams?.context}\n contextId={props.queryParams?.contextId}\n moviesAndTv={props.queryParams?.mtv}\n playNext={props.queryParams?.playNext}\n startTime={props.queryParams?.t ?? props.queryParams?.startTime}\n mode='default'\n location='play-page'\n />\n )}\n <div className={showPlayerPlaceholder ? '' : 'd-none'}>\n <PlayerPlaceholder\n video={props.clip}\n type='pip'\n />\n </div>\n </section>\n\n <PlayPageTitleAndActions\n media={props.clip}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n originalVideoAppLink={getOriginalVideoAppLink()}\n featureAccess={props.featureAccess}\n shareId={props.shareId}\n />\n\n {/* if no glance render video details here */}\n {hasGlance ? (\n <VideoAtAGlanceV2\n video={props.clip}\n pointsOfInterest={props.pointsOfInterest}\n setStartTime={(time: number) => playerContext.playerRef.current?.currentTime(time)}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n canViewGlance={hasGlance}\n />\n ) : (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n\n <PlayPageResources\n video={props.clip}\n canViewResources={props.featureAccess.canViewResourceItems}\n imageCdnUrl={props.imageCdnUrl}\n getAppLink={\n getResourceAppLink(props.clip.id, props.shareId, props.featureAccess.canViewResourceItems)\n }\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n resourceThumbnailFallbackUrl={ImageUrls.Fallbacks.RESOURCE_THUMBNAIL}\n headingRef={headingRef}\n />\n\n <PlayPageInteractives\n video={props.clip}\n interactives={props.interactives}\n imageCdnUrl={props.imageCdnUrl}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n canViewInteractives={props.featureAccess.canViewInteractives}\n headingRef={headingRef}\n yearGroups={props.yearGroups}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n isPlugin={props.isPlugin}\n />\n\n <PlayPageClips\n clips={otherClips || []}\n video={props.clip}\n canViewClips={props.featureAccess.canViewClips}\n yearGroups={props.yearGroups}\n audiences={props.audiences}\n imageCdnUrl={props.imageCdnUrl}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n headingRef={headingRef}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n isPlugin={props.isPlugin}\n />\n\n {/* if has glance, render video details here */}\n {hasGlance && (\n <VideoDetailsWithScrollbarV2\n video={props.clip}\n onLaunchImmersiveReader={onLaunchImmersiveReader}\n onExitImmersiveReader={onExitImmersiveReader}\n getTagAppLink={tag => ({\n application: AppChannels.SEARCH,\n action: Actions.Search.HOME,\n params: { tagOrClassification: tag.name }\n })}\n headingRef={headingRef}\n suppressInteractivity={props.featureAccess.canViewPublicLayout}\n />\n )}\n \n {!!canAccessOriginal() && (\n <ClippedFrom\n originalVideo={props.originalVideo}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n yearGroups={props.yearGroups}\n shareId={props.shareId}\n queryParams={props.queryParams}\n audiences={props.audiences}\n headingRef={headingRef}\n isPlugin={props.isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n />\n )}\n\n <RelatedVideos\n currentVideo={props.clip}\n yearGroups={props.yearGroups}\n relatedVideos={props.relatedVideos}\n setFavourite={props.setFavourite}\n canFavourite={props.canFavourite}\n currentUser={props.currentUser}\n audiences={props.audiences}\n getVideoAppLink={(v, opts) => VideoAppLinkHelper.getAppLink(v, {\n ...opts,\n context: props.queryParams.context,\n contextId: props.queryParams.contextId,\n playNext: props.queryParams.playNext,\n shareId: props.shareId,\n moviesAndTv: props.queryParams.mtv\n })}\n moviesAndTv={props.queryParams.mtv}\n isPlugin={props.isPlugin}\n />\n\n </main>\n\n <TableOfContentsContainer\n isExpanded={tableOfContentsExpanded}\n setIsExpanded={onToggleTableOfContents}\n items={items}\n activeId={tableOfContentsActiveId}\n setControlledId={setControlledId}\n analyticsData={{ clipId: props.clip.id, clipName: props.clip.name }}\n showInSide={props.shouldShowSideTableOfContents}\n />\n \n </div>\n );\n}"],"names":["DEFAULT_PARTIAL_LOADING_OPTIONS","numItems","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","options","opts","Array","map","width","Math","max","floor","random","PlaySharedClipViewV2","props","hasProduct","u","setFavourite","canFavourite","hasPermissions","isPlugin","shouldShowSideTableOfContents","featureAccess","currentUser","config","clip","objectId","shareId","video","data","_parentVideo","id","childClips","canViewClips","interactives","canViewInteractives","relatedVideos","context","queryParams","contextId","moviesAndTv","mtv","audiences","yearGroups","isAuthenticated","customerId","pointsOfInterest","content","videos","app","hasCompleted","clips","originalVideo","imageCdnUrl","canManageVideoAccess","items","tableOfContentsId","tocId","usePresentationAudiences","redirectOnError","activePresentation","getFallbackPresentation","presentation","namespace","ClippedFrom","usePermissions","videoActions","useVideoActions","location","className","PlayPageAnchor","ref","el","headingRef","current","set","Text","phrase","VideoActionsContext","value","VideoList","getVideoAppLink","v","VideoAppLinkHelper","playNext","presentationAudiences","getPreviewQuestionsAppLink","interactive","InteractiveHelper","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","getResourceAppLink","videoId","canViewResource","resource","application","action","args","params","PlayClipV2","playerContext","canConsume","VideoHelper","usePlayPageTableOfContent","tableOfContentsActiveId","setTableOfContentsActiveId","controlledId","setControlledId","tableOfContentsExpanded","onToggleTableOfContents","hasGlance","canViewGlance","useSectionHeadings","headingElements","ele","name","resources","isPlayClipPage","useTableOfContentsActiveHeading","setActiveId","useTableOfContentsScroll","isArchived","hasStudentExperience","PermissionName","shouldPlayOnExitImmersiveReader","onLaunchImmersiveReader","playerRef","isPaused","pause","onExitImmersiveReader","play","canAccessOriginal","_canBeConsumed","ProductId","showPlayerPlaceholder","mode","canViewPublicLayout","otherClips","filter","c","toString","breadcrumbs","length","Breadcrumbs","RestrictionBanner","restrictions","_restrictions","objectTypeId","MasterType","ArchivedBanner","typeId","SeoConstants","GlobalPlayerConsumer","key","startTime","t","PlayerPlaceholder","type","PlayPageTitleAndActions","media","originalVideoAppLink","TextHelper","VideoAtAGlanceV2","setStartTime","time","currentTime","getTagAppLink","tag","tagOrClassification","suppressInteractivity","PlayPageResources","canViewResources","canViewResourceItems","getAppLink","analyticsData","clipId","clipName","resourceThumbnailFallbackUrl","ImageUrls","PlayPageInteractives","PlayPageClips","RelatedVideos","currentVideo","TableOfContents","isExpanded","setIsExpanded","activeId","showInSide"],"sourceRoot":""}